MySQL "ERROR 1005 (HY000): невозможно создать таблицу 'foo. # Sql-12c_4' (errno: 150)"

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

CREATE TABLE Clients
(
client_id                CHAR(10)  NOT NULL ,
client_name              CHAR(50)  NOT NULL ,
provisional_license_num  CHAR(50)  NOT NULL ,
client_address           CHAR(50)  NULL ,
client_city              CHAR(50)  NULL ,
client_county            CHAR(50)  NULL ,
client_zip               CHAR(10)  NULL ,
client_phone             INT       NULL ,
client_email             CHAR(255) NULL ,
client_dob               DATETIME  NULL ,
test_attempts            INT       NULL
);
CREATE TABLE Applications
(
application_id   CHAR(10) NOT NULL ,
office_id        INT      NOT NULL ,
client_id        CHAR(10) NOT NULL ,
instructor_id    CHAR(10) NOT NULL ,
car_id           CHAR(10) NOT NULL ,
application_date DATETIME NULL 
);
CREATE TABLE Instructors
(
instructor_id      CHAR(10)  NOT NULL ,
office_id          INT       NOT NULL ,
instructor_name    CHAR(50)  NOT NULL ,
instructor_address CHAR(50)  NULL ,
instructor_city    CHAR(50)  NULL ,
instructor_county  CHAR(50)  NULL ,
instructor_zip     CHAR(10)  NULL ,
instructor_phone   INT       NULL ,
instructor_email   CHAR(255) NULL ,
instructor_dob     DATETIME  NULL ,
lessons_given      INT       NULL 
);
CREATE TABLE Cars
(
car_id             CHAR(10) NOT NULL ,
office_id          INT      NOT NULL ,
engine_serial_num  CHAR(10) NULL ,
registration_num   CHAR(10) NULL ,
car_make           CHAR(50) NULL ,
car_model          CHAR(50) NULL 
);
CREATE TABLE Offices
(
office_id       INT       NOT NULL ,
office_address  CHAR(50)  NULL ,
office_city     CHAR(50)  NULL ,
office_County   CHAR(50)  NULL ,
office_zip      CHAR(10)  NULL ,
office_phone    INT       NULL ,
office_email    CHAR(255) NULL 
);
CREATE TABLE Lessons
(
lesson_num     INT            NOT NULL ,
client_id      CHAR(10)       NOT NULL ,
date           DATETIME       NOT NULL ,
time           DATETIME       NOT NULL ,
milegage_used  DECIMAL(5, 2)  NULL ,
progress       CHAR(50)       NULL 
);
CREATE TABLE DrivingTests
(
test_num     INT       NOT NULL ,
client_id    CHAR(10)  NOT NULL ,
test_date    DATETIME  NOT NULL ,
seat_num     INT       NOT NULL ,
score        INT       NULL ,
test_notes   CHAR(255) NULL 
);

ALTER TABLE Clients ADD PRIMARY KEY (client_id);
ALTER TABLE Applications ADD PRIMARY KEY (application_id);
ALTER TABLE Instructors ADD PRIMARY KEY (instructor_id);
ALTER TABLE Offices ADD PRIMARY KEY (office_id);
ALTER TABLE Lessons ADD PRIMARY KEY (lesson_num);
ALTER TABLE DrivingTests ADD PRIMARY KEY (test_num);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Instructors FOREIGN KEY (instructor_id) REFERENCES Instructors (instructor_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY (car_id) REFERENCES Cars (car_id);
ALTER TABLE Lessons ADD CONSTRAINT FK_Lessons_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Cars ADD CONSTRAINT FK_Cars_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Clients ADD CONSTRAINT FK_DrivingTests_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);

Это ошибки, которые я получаю:

mysql> ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY
(car_id) REFERENCES Cars (car_id);
ERROR 1005 (HY000): Can't create table 'foo.#sql-12c_4' (errno: 150)

Я запустил SHOW ENGINE INNODB STATUS, который дает более подробное описание ошибки:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
100509 20:59:49 Error in foreign key constraint of table foo/#sql-12c_4:
 FOREIGN KEY (car_id) REFERENCES Cars (car_id):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
------------

Я искал вокруг на StackOverflow и в другом месте в Интернете - натолкнулся на полезное сообщение в блоге здесь, указав, как разрешить эту ошибку - но я могу Не поймите, что происходит. Любая помощь будет оценена!

Ответ 1

Вы должны сделать car_id основным ключом в автомобилях.

Ответ 2

Примечание. У меня была та же проблема, и это было потому, что ссылочное поле находилось в другой сортировке в двух разных таблицах (у них был тот же самый тип).

Убедитесь, что все поля, на которые вы ссылаетесь, имеют один и тот же тип И одинаковое сопоставление!

Ответ 3

Убедитесь, что таблицы BOTH имеют один и тот же ДВИГАТЕЛЬ. Например, если у вас есть:

CREATE Table FOO ();

и

CREATE Table BAR () ENGINE=INNODB;

Если вы попытаетесь создать ограничение из таблицы BAR в таблицу FOO, оно не будет работать в некоторых версиях MySQL.

Устраните проблему, выполнив следующие действия:

CREATE Table FOO () ENGINE=INNODB;

Ответ 4

Тонкий, но эта ошибка вызвала меня, потому что я забыл объявить небольшой столбец как unsigned для соответствия ссылочной, существующей таблице, которая была "smallint unsigned". Наличие одного неподписанного и одного неподписанного заставил MySQL запретить создание внешнего ключа в новой таблице.

id smallint(3) not null

не подходит для внешних ключей

id smallint(3) unsigned not null

Ответ 5

Я получил эту совершенно бесполезную и неинформативную ошибку, когда я пытался:

ALTER TABLE `comments` ADD CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;

Моя проблема была в моей таблице комментариев, user_id определялась как:

`user_id` int(10) unsigned NOT NULL

Итак... в моем случае проблема была в конфликте между NOT NULL и ON DELETE SET NULL.

Ответ 6

Я использую Ubuntu linux, и в моем случае ошибка была вызвана неправильным синтаксисом оператора (который я узнал, набрав perror 150 на терминале, который дает

Код ошибки MySQL 150: неверно сформировано ограничение внешнего ключа.

Изменение синтаксиса запроса из

alter table scale add constraint foreign key (year_id) references year.id;

к

alter table scale add constraint foreign key (year_id) references year(id);

зафиксировал его.

Ответ 7

Также обе таблицы должны иметь одинаковый набор символов.

например.

CREATE TABLE1 (
  FIELD1 VARCHAR(100) NOT NULL PRIMARY KEY,
  FIELD2 VARCHAR(100) NOT NULL
)ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_bin;

to

CREATE TABLE2 (
  Field3 varchar(64) NOT NULL PRIMARY KEY,
  Field4 varchar(64) NOT NULL,
  CONSTRAINT FORIGEN KEY (Field3) REFERENCES TABLE1(FIELD1)
) ENGINE=InnoDB;

Ошибка, потому что у них разные кодировки. Это еще один тонкий отказ, когда mysql возвращает ту же ошибку.

Ответ 8

Написанное поле должно быть "Ключом" в ссылочной таблице, не обязательно основным ключом. Таким образом, "car_id" должен быть либо первичным ключом, либо быть определен с ограничениями NOT NULL и UNIQUE в таблице "Автомобили".

Кроме того, оба поля должны быть одного типа и сопоставления.

Ответ 9

Я также получил эту ошибку (для нескольких таблиц) вместе с ошибками ограничения и подключением и отключением MySQL при попытке импортировать всю базу данных (~ 800 МБ). Моя проблема возникла из-за слишком низких допустимых пакетов сервера MySQL. Чтобы решить эту проблему (на Mac):

  • Открыт /private/etc/my.conf
  • В разделе # Сервер MySQL изменил max_allowed_packet с 1M на 4M (вам может потребоваться поэкспериментировать с этим значением.)
  • Перезагруженный MySQL

После этого успешно импортирована база данных.

Примечание. Я запускаю MySQL 5.5.12 для Mac OS X (64-разрядная версия x86).

Ответ 10

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

ALTER TABLE customer_information ADD CONSTRAINT fk_customer_information1 ИНОСТРАННЫЙ КЛЮЧ (user_id) ССЫЛКИ users (id) УДАЛИТЬ КАСКАД ПО ОБНОВЛЕНИЮ КАСКАД

Ответ 11

Решено:

Убедитесь, что Primary_Key и Foreign_Key точно соответствуют типам данных. Если один из них будет подписан другим без знака, он будет терпеть неудачу. Хорошая практика состоит в том, чтобы удостовериться, что оба являются неподписанными int.

Ответ 12

все, я решил проблему и хотел поделиться ею:

У меня была эта ошибка < > Вопрос был в том, что в моем заявлении:

alter table system_registro_de_modificacion добавить внешний ключ (usuariomodificador_id) ССЫЛКИ Usuario (id) При ограничении удаления;

Я неправильно написал CASING: он работает в Windows WAMP, но в Linux MySQL он более строг с CASING, поэтому написание "Usuario" вместо "usuario" (точный корпус), вызвало ошибку и было исправлено просто меняя корпус.

Ответ 13

Я использовал двойное имя внешнего ключа.

Переименование имени FK решило мою проблему.

Разъяснение:

Обе таблицы имели ограничение PK1, FK1 и т.д. Переименование/создание уникальных имен решало проблему.

Ответ 14

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

Мои две таблицы имеют разные сортировки. Это можно показать, выставив статус таблицы show, например table_name, и сортировка может быть изменена путем выпуска alter table table_name convert в набор символов utf8.