2012-05-29 4 views
1

Я застрял с этой ошибкой проблемы 150 в mysql, и я знаю, что были вопросы , которые обсуждают эту проблему, но я до сих пор не могу найти, где я ошибаюсь. Вот база данных Я пытаюсь создать:mysql error 150: не удается создать таблицу

create table business (
    ident varchar(40) NOT NULL, 
    name varchar(50) NOT NULL, 
    rating INT UNSIGNED NOT NULL, 
    PRIMARY KEY(ident) 
) ENGINE=InnoDB; 

create table deals (
    business_id varchar(40) NOT NULL, 
    deals_id varchar(20) NOT NULL, 
    deals_title varchar(50) NOT NULL, 
    PRIMARY KEY (business_id, deals_id), 
    FOREIGN KEY (business_id) REFERENCES business(ident) ON DELETE CASCADE 
) ENGINE=InnoDB; 

create table d_options (
    business_id varchar(40) NOT NULL, 
    dealid varchar(20) NOT NULL, 
    option_title varchar(40) NOT NULL, 
    PRIMARY KEY(business_id, dealid, option_title), 
    FOREIGN KEY(business_id) REFERENCES business(ident) ON DELETE CASCADE, 
    FOREIGN KEY(dealid) REFERENCES deals(deals_id) 
) ENGINE=InnoDB; 

Я получаю сообщение об ошибке: ERROR 1005 (HY000): Невозможно создать таблицу 'test.d_options' (ошибка: 150)

Я знаю, для иностранных ключевые ограничения, которые должны быть удовлетворены, должны иметь индекс в родительской таблице в соответствии с документацией mysql, но я думаю, что по умолчанию индексируется на первичный ключ.

Результат статуса InnoDB является:

120530 0:47:48 Error in foreign key constraint of table test/d_options: 
FOREIGN KEY(dealid) REFERENCES deals(deals_id) 
) ENGINE=InnoDB: 
Cannot find an index in the referenced table where the 
referenced columns appear as the first columns, or column types 
in the table and the referenced table do not match for constraint. 
Note that the internal storage type of ENUM and SET changed in 
tables created with >= InnoDB-4.1.12, and such columns in old tables 
cannot be referenced by such columns in new tables. 
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html 
for correct foreign key definition. 

Любая помощь appriciated.

+0

сообщение об ошибке кажется довольно очевидным - нет индекса на целевом столбце FK ... – DCoder

+0

Но так как целевой ключ является одним из первичных ключей его таблицы, то на нем должен быть указатель. Должен ли я создать дополнительный индекс для этого ключа, если да, это не будет дополнительным бременем для базы данных –

ответ

5

У вас есть соединение первичного ключа (business_id, deal_id) и они индексируются как пара, но, чтобы удовлетворить FK, вам нужен еще один индекс только deal_id:

create table deals (
    business_id varchar(40) NOT NULL, 
    deals_id varchar(20) NOT NULL, 
    deals_title varchar(50) NOT NULL, 
    PRIMARY KEY (business_id, deals_id), 
    FOREIGN KEY (business_id) REFERENCES business(ident) ON DELETE CASCADE, 
    /* Add an index on deals_id, separate from the compound PK */ 
    INDEX idx_deals_id (deals_id) 
) ENGINE=InnoDB; 
Смежные вопросы