Подтвердить что ты не робот

MySQL Foreign Key, Не удается создать таблицу (errno: 150)

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

Я использую MySQL 5.5.31, и коды здесь:   CREATE DATABASE TOS;

DROP TABLE TOS.USER CASCADE;
DROP TABLE TOS.BILL_HEADER CASCADE;
DROP TABLE TOS.TOY CASCADE;


CREATE TABLE TOS.USER
(User Char(8),
Name Char(10),
Type Char(1),
Password Char(12),
PRIMARY KEY(User));

CREATE TABLE TOS.BILL_HEADER
(Bill_No Char(10),
CTime DateTime,
No_Of INTEGER,
Cus_No Char(5),
DTime DateTime,
PRIMARY KEY(Bill_No));

CREATE TABLE TOS.TOY
(Toy_Id Char(10),
FullN Char(50),
ShortN Char(20),
Descrip Char(20),
Price DECIMAL,
Avail Char(1),
Cat Char(1),
PRIMARY KEY(Toy_Id));

CREATE TABLE TOS.BILL_ITEM
(Bill_No Char(10),
BSeq_No INTEGER,
Toy_Id Char(10),
OTime DateTime,
Quan INT,
DCondition Char(1),
PRIMARY KEY(Bill_No,BSeq_No),
FOREIGN KEY(Bill_No) REFERENCES TOS.Bill_Header(Bill_No),
FOREIGN KEY(Toy_Id) REFERENCES TOS.TOY(Toy_Id));

Ошибка:

1005 - Невозможно создать таблицу "TOS.BILL_ITEM" (errno: 150)

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Незначительная ошибка 150 обычно связана с несоответствием типа или длины внешнего ключа или отсутствующим индексом в столбце родительской таблицы.

Этот взгляд должен быть чувствительным к регистру в имени таблицы Bill_Header (должен быть Bill_Header).
Из документов MySQL по чувствительности к регистру идентификатора:

В MySQL базы данных соответствуют каталогам в каталоге данных. Каждая таблица в базе данных соответствует хотя бы одному файлу в каталоге базы данных (и, возможно, больше, в зависимости от механизма хранения). Следовательно, чувствительность к регистру базовой операционной системы играет роль в чувствительности к регистру базы данных и таблиц. Это означает, что имена баз данных и таблиц не чувствительны к регистру в Windows и чувствительны к регистру в большинстве разновидностей Unix.

Исправьте корпус, и он должен работать:

CREATE TABLE TOS.BILL_ITEM
(Bill_No Char(10),
BSeq_No INTEGER,
Toy_Id Char(10),
OTime DateTime,
Quan INT,
DCondition Char(1),
PRIMARY KEY(Bill_No,BSeq_No),
FOREIGN KEY(Bill_No) REFERENCES TOS.BILL_HEADER(Bill_No),
# Here-----------------------------^^^^^^^^^^^^^^
FOREIGN KEY(Toy_Id) REFERENCES TOS.TOY(Toy_Id));

Поскольку ваш код работал так, как на SQLFiddle.com(http://sqlfiddle.com/#!2/08d1e), базовая платформа там не должна быть чувствительной к регистру.

Ответ 2

Правильный ответ выше, но эта ошибка также может произойти, если таблица, на которую ссылается ваш внешний ключ, - это MyISAM вместо innoDB.