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
Ответы
Ответ 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
Для полноты - вы также получите эту ошибку, если вы сделаете внешнюю ссылку на таблицу, которая не определена в то время;