2013-04-26 3 views
20

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

create TABLE Instructors (

ID varchar(10), 
First_Name varchar(50) NOT NULL, 
Last_Name varchar(50) NOT NULL, 
PRIMARY KEY (ID) 
); 

create table Courses (

Course_Code varchar(10), 
Title varchar(50) NOT NULL, 
PRIMARY KEY (Course_Code) 

); 


create table Sections (
Index_No int, 
Course_Code varchar(10), 
Instructor_ID varchar(10), 
PRIMARY KEY (Index_No), 
FOREIGN KEY (Course_Code) REFERENCES Courses(Course_Code) 
    ON DELETE cascade 
    ON UPDATE cascade, 
FOREIGN KEY (Instructor_ID) REFERENCES Instructors(ID) 
    ON DELETE set default 

); 

Код ошибки: 1005. Невозможно создать таблицу '336_project.sections' (ошибка: 150)

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

Я использую MySQL Workbench 5.2

ответ

23

Если вы используете двигатель InnoDB, то проблема ON DELETE SET DEFAULT. Вот выдержка из инструкции:

Хотя SET DEFAULT допускается на сервере MySQL, он отвергается как недействительный InnoDB. Операторы CREATE TABLE и ALTER TABLE, использующие этот раздел, не допускаются для таблиц InnoDB.

Вы можете использовать ON DELETE CASCADE или ON DELETE SET NULL, но не ON DELETE SET DEFAULT. Есть дополнительная информация here.

+0

Привет, спасибо за ваш быстрый ответ. Я попытался перейти на SET NULL, и он все еще не работает. Я даже удалил все строки ON UPDATE/DELETE и все еще выдал мне ошибку. Должен ли я указывать конкретный движок для использования? – Sixers17

+1

Не обращайте внимания на последний комментарий, я исправил его. Вы были правы, мне пришлось изменить значение по умолчанию на null, но также я создал индексы для каждой ссылки внешнего ключа. Как только я это сделал, он сработал! – Sixers17

+0

@ Sixers17 - именно так вы знаете, когда я попробовал свои инструкции 'CREATE TABLE', единственное, что я должен был сделать, чтобы заставить их работать, это изменить на' ON DELETE SET NULL'. Мне не нужно было добавлять индексы. Тем не менее, неплохо иметь индексы вдоль ваших FK в любом случае, так что все хорошо :) –

1

Он неисправный на

ON DELETE set default 

Я не попадался, что раньше, и я не вижу его в руководствах либо (но тогда уже поздно)

Update

только что видели это в manual

В то время как SET DEFAULT разрешен сервером MySQL, он отклоняется как недействительным InnoDB. Операторы CREATE TABLE и ALTER TABLE с использованием этого предложения не разрешены для таблиц InnoDB.

Возможно, вы используете таблицы InnoDB?

+0

Должен ли я помещать Engine = InnoDB после объявлений таблиц? – Sixers17

+0

Nvm, попытался это сделать, тоже не работал. – Sixers17

3

Это также может быть случай, если вы не указывая ON DELETE на всех, но пытаются ссылаться на таблицу MyISAM из InnoDB таблицы:

CREATE TABLE `table1`(
    `id` INT UNSIGNED NOT NULL, 
    `name` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MYISAM CHARACTER SET UTF8; 

CREATE TABLE `table2`(
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `table1_id` INT UNSIGNED NOT NULL, 
    `some_value` VARCHAR(255) NOT NULL, 


    PRIMARY KEY (`id`), 
    KEY `fk_table1_id`(`table1_id`), 

    CONSTRAINT FOREIGN KEY (`table1_id`) REFERENCES `table1`(`id`) 
) ENGINE=INNODB CHARACTER SET UTF8; 

выше выбросит ERRNO 150. Нужно также изменить первую таблицу на InnoDB, чтобы она работала.

33

Эта ошибка также возникает, если вы связываете столбцы разных типов, например. int в исходной таблице и BigInt в таблице адресатов.

+3

, либо в таблице, на которой указана ссылка, нет механизма InnoDB – Gavriel

0

Здесь Проблема в базе данных двигателя (таблица1 MYISAM и table2 ENGINE). Для установки ИНОСТРАННЫХ КЛЮЧЕЙ

  • Оба стола должны быть в одном и том же двигателе и одинаковой кодировке.
  • Столбец PK в столбце родителя и FK должен иметь тот же тип данных и тот же тип сортировки.

Надеюсь, у вас есть идея.

16

Вы можете запустить

SHOW ENGINE INNODB STATUS 

прочитать причину сбоя в читаемом формате

например

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
150331 15:51:01 Error in foreign key constraint of table foobar/#sql-413_81: 
FOREIGN KEY (`user_id`) REFERENCES `foobar`.`users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE: 
You have defined a SET NULL condition though some of the columns are defined as NOT NULL. 
0

Убедитесь, что тип таблицы - InnoDB, MyISAM не поддерживает внешний ключ, afaik.

0

Для полной цели - вы также получите эту ошибку, если вы сделаете внешнюю ссылку на таблицу, которая не определена в то время;

1

Чтобы создать FOREIGN KEY со ссылкой на другую таблицу, ключи от обеих таблиц должны быть PRIMARY KEY и с тем же типом данных.

В ваших табличных разделах PRIMARY KEY имеет различный тип данных i.e INT, но в другой таблице он имеет тип i.e VARCHAR.

Смежные вопросы