Внешние ключи и ошибки MySQL
У меня есть следующий скрипт для создания таблицы в MySQL версии 5.1, которая должна ссылаться на 3 другие таблицы. Все 3 таблицы были созданы с использованием InnoDB, и все 3 таблицы имеют столбец ID, определенный как INT.
Я успешно создал другие таблицы, которые ссылаются на ACCOUNT и PERSON, однако, это первая таблица, которая ссылается на ADDRESS, поэтому я включил определение для этой таблицы, как показано ниже, ниже.
Я получаю ошибку ERROR 1005 (HY000) с ошибкой 150, которая, как я понимаю, связана с созданием внешнего ключа.
Сценарий, который не работает (лишние столбцы удалены для простоты):
CREATE TABLE WORK_ORDER (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ACCOUNT_ID INT NOT NULL,
CUSTOMER_ID INT NOT NULL,
SALES_ID INT,
TRADES_ID INT,
LOCATION_ID INT NOT NULL,
INDEX CUST_INDEX(CUSTOMER_ID),
INDEX SALES_INDEX(SALES_ID),
INDEX TRADES_INDEX(TRADES_ID),
INDEX ACCOUNT_INDEX(ACCOUNT_ID),
INDEX LOCATION_INDEX(LOCATION_ID),
FOREIGN KEY (CUSTOMER_ID) REFERENCES PERSON(ID) ON DELETE CASCADE,
FOREIGN KEY (SALES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
FOREIGN KEY (TRADES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
FOREIGN KEY (LOCATION_ID) REFERENCES ADDRESS(ID) ON DELETE SET NULL
) ENGINE=InnoDB;
Оператор SQL, используемый для создания таблицы ADDRESS, приведен ниже (для простоты удалены дополнительные столбцы).
CREATE TABLE ADDRESS (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
PERSON_ID INT NOT NULL,
ACCOUNT_ID INT NOT NULL,
ADDRESS_L1 VARCHAR(50),
ADDRESS_L2 VARCHAR(50),
CITY VARCHAR(25),
PROVINCE VARCHAR(20),
POSTAL_CODE VARCHAR(6),
COUNTRY VARCHAR(25),
INDEX CUST_INDEX(PERSON_ID),
INDEX ACCOUNT_INDEX(ACCOUNT_ID),
FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID) ON DELETE CASCADE
) ENGINE=InnoDB;
Здесь я просмотрел несколько вопросов, связанных с похожими проблемами, но большинство, похоже, являются дублирующими определениями и несоответствующими типами полей, а также некоторые из них не используют InnoDB для одной или другой таблицы. Тем не менее, ни один из них, похоже, не является проблемой. Есть идеи?
1 ответ
Вы всегда можете выполнить команду 'SHOW ENGINE INNODB STATUS'. В выходных данных будет скрыт раздел "LATEST FOREIGN KEY ERROR", в котором будет больше подробностей о том, что именно вызвало ошибку "150":
mysql> create table a (x int not null) type=innodb;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> create table b (y int not null, foreign key (y) references a (x) on delete set null) type=innodb;
ERROR 1005 (HY000): Can't create table './test/b.frm' (errno: 150)
mysql> show engine innodb status;
[..... snip snip snip ...]
------------------------
LATEST FOREIGN KEY ERROR
------------------------
091129 16:32:41 Error in foreign key constraint of table test/b:
foreign key (y) references a (x) on delete set null) type=innodb:
You have defined a SET NULL condition though some of the
columns are defined as NOT NULL.
[.... snip snip snip ...]