MySQL “ОШИБКА 1005 (HY000):Не удается создать таблицу 'foo.#sql-12c_4' (ошибка отсутствует:150)”

StackOverflow https://stackoverflow.com/questions/2799021

Вопрос

Я работал над созданием нескольких таблиц в базе данных 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» вместо «Усиорио» (точный корпус), сгенерировал ошибку и был исправлен просто изменением Корпус.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top