2010-05-09 1 views
43

Я работал над созданием некоторых таблиц в базе данных foo, но каждый раз, когда я заканчиваю errno 150 относительно внешнего ключа. Во-первых, вот мой код для создания таблиц:MySQL «ERROR 1005 (HY000): не удается создать таблицу« foo. Sql-12c_4 »(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. 
------------ 

I обыскивали на StackOverflow и в других местах онлайн - came across a helpful blog post here with pointers on how to resolve this error - но я не могу понять, что происходит не так. Любая помощь будет оценена!

+0

См. Также http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/ –

ответ

34

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

+0

Спасибо! Не могу поверить, что это была такая глупая ошибка. –

+0

Кстати, если вы изменяли таблицу приложений (с строками в ней), вставляя car_id в качестве нового внешнего ключа, Application.car_id должен быть нулевым, иначе вы получите похожие ошибки. Вот что со мной произошло. – cawecoy

+0

В моем случае это было достаточно хорошо, чтобы сделать ссылочный ключ уникальным, поскольку в справочной таблице уже был первичный ключ. –

30

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

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

+2

+1 для информации относительно сортировки. Вы знаете, почему сортировка должна влиять на создание индекса, даже если тип данных тот же. – user325643

+0

Я думаю, что это имеет смысл, поскольку базовые данные разные, когда мы используем разные сопоставления, а часть проверки внешних ключей mysql заключается в обеспечении того, чтобы данные были точно такими же ... Но я не знаю официальной причины;) – NickT

+0

Если ваш следующий вопрос: как изменить сортировку для существующей таблицы: http://stackoverflow.com/questions/742205/mysql-alter-table-collation#5468980 – penfold

3

Я использую 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); 

исправлено.

8

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

id smallint(3) not null 

не соответствует, для внешних ключей,

id smallint(3) unsigned not null 
+0

Это спасло мне много времени! –

+0

Спасибо. – Klav

8

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

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.

13

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

CREATE Table FOO(); 

и:

CREATE Table BAR() ENGINE=INNODB; 

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

Устранить проблему, следующим образом:

CREATE Table FOO() ENGINE=INNODB; 
2

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

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

0

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

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

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

я неправильно написал КОРПУС: она работает в Windows, WAMP, но в Linux MySQL является более строгим с КОРПУСА, так сочинительство «Новичок» вместо «Новичок» (точный кожух), генерируется сообщение об ошибке, и было исправлено просто изменение обсадной колонны.

+1

Я не думаю, что ответ имеет отношение к вопросу, корпус в вопросе безупречен, и mysql должен был дать другое сообщение об ошибке, если проблема из-за этого. –

3

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

, например.

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 возвращает ту же ошибку.

2

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

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

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

Примечание. Я использую MySQL 5.5.12 для Mac OS X (x86 64 бит).

0

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

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

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

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

1

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

ALTER TABLE customer_information ADD Constraint fk_customer_information1 FOREIGN KEY (user_id) ЛИТЕРАТУРА users (id) ON DELETE CASCADE ON UPDATE CASCADE

0

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

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

1

Решено:

Проверьте, чтобы убедиться, что primary_key и foreign_key являются точное соответствие с типами данных. Если один из них подписан еще один без знака, он будет сбой. Хорошая практика состоит в том, чтобы убедиться, что оба являются неподписанными int.