MySQL "ОШИБКА 1005 (HY000): невозможно создать таблицу 'foo.# Sql-12c_4' (errno: 150)"
Я работал над созданием некоторых таблиц в базе данных foo
, но каждый раз, когда я заканчиваю с ошибкой 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.
------------
Я искал в Stackru и в других местах онлайн - наткнулся на полезный пост в блоге с указаниями о том, как устранить эту ошибку - но я не могу понять, что происходит не так. Любая помощь будет оценена!
14 ответов
Примечание: у меня была та же проблема, и это было потому, что указанное поле находилось в другом сопоставлении в 2 разных таблицах (они имели абсолютно одинаковый тип).
Убедитесь, что все поля, на которые вы ссылаетесь, имеют одинаковый тип и одинаковые параметры сортировки!
Убедитесь, что ОБА столы имеют одинаковый ДВИГАТЕЛЬ. Например, если у вас есть:
CREATE Table FOO ();
а также:
CREATE Table BAR () ENGINE=INNODB;
Если вы попытаетесь создать ограничение из таблицы BAR в таблицу FOO, оно не будет работать в определенных версиях MySQL.
Исправьте проблему следующим образом:
CREATE Table FOO () ENGINE=INNODB;
Незаметно, но эта ошибка меня вызвала, потому что я забыл объявить столбец smallint как неподписанный, чтобы соответствовать существующей таблице, на которую ссылается smallint unsigned. Наличие одного неподписанного и одного неподписанного побудило MySQL предотвратить создание внешнего ключа в новой таблице.
id smallint(3) not null
не соответствует, ради внешних ключей,
id smallint(3) unsigned not null
Я получил эту совершенно бесполезную и неинформативную ошибку, когда попытался:
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.
Также обе таблицы должны иметь одинаковый набор символов.
например
CREATE TABLE1 (
FIELD1 VARCHAR(100) NOT NULL PRIMARY KEY,
FIELD2 VARCHAR(100) NOT NULL
)ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_bin;
в
CREATE TABLE2 (
Field3 varchar(64) NOT NULL PRIMARY KEY,
Field4 varchar(64) NOT NULL,
CONSTRAINT FORIGEN KEY (Field3) REFERENCES TABLE1(FIELD1)
) ENGINE=InnoDB;
Сбой, потому что у них разные кодировки. Это еще один тонкий сбой, когда mysql возвращает ту же ошибку.
Я использую Ubuntu Linux, и в моем случае ошибка была вызвана неправильным синтаксисом оператора (который я узнал, набрав perror 150 на терминале, что дает
MySQL error code 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);
починил это.
Я также получил эту ошибку (для нескольких таблиц) наряду с ошибками ограничения и подключением и отключением MySQL при попытке импортировать всю базу данных (~800 МБ). Моя проблема была связана с тем, что на сервере MySQL максимально допустимое количество пакетов было слишком низким. Чтобы решить эту проблему (на Mac):
- Открыт /private/etc/my.conf
- Под # Сервер MySQL, изменено
max_allowed_packet
от 1М до 4М (возможно, вам придется поэкспериментировать с этим значением.) - Перезапущенный MySQL
База данных успешно импортирована после этого.
Примечание. Я использую MySQL 5.5.12 для Mac OS X (64-разрядная версия x86).
Указанное поле должно быть "Ключом" в ссылочной таблице, а не обязательно первичным ключом. Таким образом, "car_id" должен быть либо первичным ключом, либо определяться с помощью ограничений NOT NULL и UNIQUE в таблице "Cars".
Более того, оба поля должны быть одного типа и сопоставления.
Решено:
Убедитесь, что Primary_Key и Foreign_Key точно соответствуют типам данных. Если один подписан, другой - без подписи, он потерпит неудачу. Хорошей практикой является проверка того, что оба являются unsigned int.
Проверьте, чтобы поле, на которое вы ссылаетесь, точно совпадало с внешним ключом, в моем случае одно было без знака, а другое было подписано, поэтому я просто изменил их, чтобы они соответствовали, и это сработало
ALTER TABLE customer_information ADD CONSTRAINT fk_customer_information1 FOREIGN KEY (user_id
) РЕКОМЕНДАЦИИ users
(id
) НА УДАЛЕННОМ КАСКАДЕ НА ОБНОВЛЕНИИ КАСКАДА
Я использовал двойное имя внешнего ключа.
Переименование имени FK решило мою проблему.
Разъяснение:
Обе таблицы имели ограничения, называемые PK1, FK1 и т. Д. Переименование их / создание уникальных имен решило проблему.
Столбец, на который ссылаются, должен быть индексом одного столбца или первого столбца в многостолбцовом индексе, и того же типа и того же сопоставления.
Мои две таблицы имеют разные сопоставления. Это может быть показано путем выдачи статуса таблицы показа как table_name
и сопоставление может быть изменено путем выдачи таблицы изменения table_name
преобразовать в набор символов utf8.
Все, я решил проблему и хотел ей поделиться:
У меня была эта ошибка <> Проблема была в том, что в моем заявлении:
изменить таблицу system_registro_de_modificacion добавить внешний ключ (usuariomodificador_id) ССЫЛКИ Usuario(id) При удалении ограничить;
Я неправильно написал CASING: он работает в Windows WAMP, но в Linux MySQL более строг с CASING, поэтому запись "Usuario" вместо "usuario" (точный регистр) вызвала ошибку и была исправлена простым изменением корпус.