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)
Любая помощь будет принята с благодарностью.
Ответы
Ответ 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.