Подтвердить что ты не робот

MySQL Errno 150

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

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" (errno: 150)

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

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

4b9b3361

Ответ 1

Если вы используете движок 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. Там более подробная информация здесь.

Ответ 2

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

Ответ 3

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

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.

Ответ 4

Это может быть и так, если вы вообще не указываете 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.

Ответ 5

Он не работает на

ON DELETE set default 

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

Обновить

просто видел это в руководстве

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

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

Ответ 6

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

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

Ответ 7

Здесь проблема в двигателе базы данных (таблица1 MYISAM и table2 ENGINE). Чтобы установить FOREIGN KEYs,

  • Обе таблицы должны быть в одном и том же ДВИГАТЕЛЕ и той же кодировке.
  • Столбец PK в родительском и столбце FK должен быть одного и того же типа данных и того же типа сортировки.

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

Ответ 8

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

Ответ 9

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