почему ограничение FK не работает в MySql - PullRequest
1 голос
/ 25 июня 2009

Я создал две таблицы ORDERS и ORDERITEMS со следующим ограничением:

alter table OrderItems add constraint FK_Reference_30 foreign key (orderId)
  references Orders (orderId) on delete restrict on update restrict;

Если я хочу удалить одну запись в таблице ORDERS и этот orderId используется в таблице ORDERITEMS, я думаю, что я должен получить ошибку или предупреждение Но на самом деле я ничего не получил. Я вставил две строки в ORDERS и несколько строк в ORDERITEMS. Когда я попытался удалить все строки в ORDERS, я сделал это. Жалоб нет. Я использую базу данных MySQL с Toad для MySQL.

Ответы [ 2 ]

5 голосов
/ 25 июня 2009

Я думаю, вы используете таблицы MyISAM.

Если вы запустите "SHOW CREATE TABLE OrderItems", вы увидите, что не удалось записать определение внешнего ключа.

Таблицы MyISAM не поддерживают внешние ключи. MySQL анализирует синтаксис, но затем молча отбрасывает его при использовании MyISAM. Если вы используете таблицы InnoDB как для Orders, так и для OrderItems, это будет работать лучше.


InnoDB должен быть включен по умолчанию. Было бы необычно для этого быть отключенным. Вы можете проверить, что вы делаете так:

mysql> show variables like 'have_innodb';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_innodb   | YES   | 
+---------------+-------+

Если это так, тогда вы можете указать ENGINE=INNODB, когда вы CREATE или ALTER таблица:

mysql> ALTER TABLE Orders ENGINE=INNODB;
mysql> ALTER TABLE OrderItems ENGINE=INNODB;

Обязательно перепроверьте, что это удалось, с SHOW CREATE TABLE <name>.

Теперь вы можете добавить ограничение, и оно должно вступить в силу.

1 голос
/ 25 июня 2009

Какой движок базы данных вы используете? InnoDB - единственный, который поддерживает ограничения внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...