it-swarm.com.ru

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

21
Sixers17

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

24
Ed Gibbs

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

35
JohnL

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

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.
17
Riccardo Galli

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

3
Shimon Rachlenko

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

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

3
Mayur Mahajan

Это терпит неудачу на 

ON DELETE set default 

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

Обновление 

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

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

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

1
Ian Kenney

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

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

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

0
Sudarshani Perera

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

0
Duco

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

0
Kadir Erturk