MySQL “ОШИБКА 1005 (HY000):Не удается создать таблицу 'foo.#sql-12c_4' (ошибка отсутствует:150)”
-
04-10-2019 - |
Вопрос
Я работал над созданием нескольких таблиц в базе данных 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 и в других местах онлайн - наткнулся здесь на полезный пост в блоге с указателями на то, как устранить эту ошибку - но я не могу понять, что происходит не так.Мы будем признательны за любую помощь!
Решение
Вы должны сделать Car_id главный ключ в автомобилях.
Другие советы
Примечание. У меня была такая же проблема, и это было потому, что ссылочное поле было в другом сопоставлении в 2 разных таблицах (у них имел точный тип).
Убедитесь, что все ваши ссылочные поля имеют одинаковый тип и то же сопоставление!
Убедитесь, что обе таблицы имеют один и тот же двигатель. Например, если у вас есть:
CREATE Table FOO ();
а также:
CREATE Table BAR () ENGINE=INNODB;
Если вы попытаетесь создать ограничение от бара стола к таблице 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
Итак ... в моем случае проблема была с конфликтом между не нолью, а на удалении установленного 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 Код ошибки 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);
починил это.
Ссыладное поле должно быть «ключом» на ссылочной таблице, не обязательно является первичным ключом. Таким образом, «Car_ID» должен быть либо первичным ключом или определяться не нулевыми и уникальными ограничениями в таблице «Автомобилей».
И, кроме того, оба поля должны быть одинакового типа и сопоставления.
Я также получил эту ошибку (для нескольких таблиц) вместе с ошибками ограничения и MySQL подключения и отключения при попытке импортировать всю базу данных (~ 800 МБ). Моя проблема была результатом MySQL Server Максимальный допустимый пакеты слишком низки. Чтобы разрешить это (на Mac):
- Открыт /private/etc/my.conf.
- Под # MySQL Server, измененный
max_allowed_packet
От 1 м до 4 м (вам может потребоваться экспериментировать с этим значением.) - Перезапустить mysql.
База данных успешно импортирована после этого.
Примечание. Я использую MySQL 5.5.12 для Mac OS X (бит X86 64).
Проверьте, чтобы сделать поле, которое вы ссылаетесь на ссылку, - это точное совпадение с иностранным ключом, в моем случае один был неподписан, а другой был подписан, поэтому я просто изменил их на соответствие, и это сработало
ALTER Table Customer_Information Добавить ограничение FK_Customer_information1 внешний ключ (user_id
) ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА users
(id
) На удалении каскада на обновлении каскада
Решено:
Убедитесь, что Primary_key и Entertaine_Key являются точным совпадением с типами данных. Если кто-то подписан еще один без знаки, он будет не удачен. Хорошая практика - убедиться, что оба являются int.
Я использовал дублирующее имя внешнего ключа.
Переименовав имя FK, решил мою проблему.
Разъяснение:
Обе таблицы имели ограничение под названием pk1, fk1 и т. Д. Переименовать их / сделать имена, которые уникальные решенные проблемы решают проблему.
Ссылаженный столбец должен быть индексом одного столбца или первого столбца в Multi Column Index, а также одинакового типа и одинакового сопоставления.
Мои две столы имеют разные сопоставления. Это может быть показано путем выдачи состояния таблицы Show, как table_name
и сопоставление может быть изменено путем выдачи альтернального стола table_name
Преобразовать в набор символов UTF8.
Все, я решил проблему и хотел поделиться этим:
У меня была эта ошибка <> проблема была в том, что в моем заявлении:
ALTER Table System_registro_de_Modification Добавить внешний ключ (USUARIOMODIFIFIDADOR_ID) Ссылки USUARIO (ID) при удалении ограничения;
Я неправильно написал корпус: он работает в Windows Wamp, но в Linux MySQL это более строго с корпусом, поэтому списав «Usuario» вместо «Усиорио» (точный корпус), сгенерировал ошибку и был исправлен просто изменением Корпус.