2013-07-26 3 views
1

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

CREATE TABLE IF NOT EXISTS `project` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`project_id` varchar(60) NOT NULL, 
`project_name` varchar(500) NOT NULL, 
`cons_bal` int(11) NOT NULL, 
`non_cons_bal` int(11) NOT NULL, 
`budget_head` varchar(100) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

А вот моя другая таблица:

CREATE TABLE IF NOT EXISTS `project_map` (
`id` int(11) NOT NULL, 
`project_id` varchar(60) NOT NULL, 
`head` int(11) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

И вот мое дополнение линия ограничения:

alter table project_map add constraint p_map_fk001 foreign key (`project_id`) references project(`project_id`) 

Любая помощь будет хорошо. Спасибо.

+0

документы говорят: 'в случае ошибки внешнего ключа с участием InnoDB таблиц (обычно Ошибка 150 в сервере MySQL), вы можете получить подробное объяснение самой последней ошибки внешнего ключа InnoDB путем проверки вывода SHOW ENGINE INNODB STATUS. ' –

+0

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

+0

Результат' SHOW ENGINE INNODB STATUS': Ошибка ограничения внешнего ключа отступа в таблице/# sql-88c_d9: URL-адрес внешнего проекта ('project_id'): Невозможно найти индекс в ссылочной таблице, где столбцы, на которые ссылаются , отображаются в виде первых столбцов или типов столбцов в таблице, а ссылочная таблица не соответствует для ограничения. Обратите внимание, что внутренний тип хранения ENUM и SET изменен в таблицах , созданных с помощью> = InnoDB-4.1.12, и такие столбцы в старых таблицах не могут ссылаться на такие столбцы в новых таблицах. @bmused – aki2all

ответ

1

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

См: http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html

Так попробуйте:

CREATE TABLE `project` (                                                                                
      `id` int(11) NOT NULL AUTO_INCREMENT,                                                                            
      `project_id` varchar(60) NOT NULL,                                                                             
      `project_name` varchar(500) NOT NULL,                                                                            
      `cons_bal` int(11) NOT NULL,                                                                              
      `non_cons_bal` int(11) NOT NULL,                                                                             
      `budget_head` varchar(100) NOT NULL,                                                                            
      PRIMARY KEY (`id`),                                                                                 
      KEY `project_id` (`project_id`)                                                                              
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8 


CREATE TABLE `project_map` (                                              
       `id` int(11) NOT NULL,                                                
       `project_id` varchar(60) NOT NULL,                                             
       `head` int(11) NOT NULL,                                               
       PRIMARY KEY (`id`),                                                
       KEY `project_id` (`project_id`)                                             
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

ALTER TABLE `project_map` ADD CONSTRAINT 
`p_map_fk001` FOREIGN KEY (`project_id`) 
REFERENCES project(`project_id`); 
Смежные вопросы