2009-06-24 3 views
1

Я создал две таблицы ЗАКАЗЫ и ТоварыЗаказа со следующим ограничением:почему FK ограничение не работает в MySql

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

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

ответ

5

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

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

Таблицы MyISAM не поддерживают внешние ключи. MySQL анализирует синтаксис, но затем молча отбрасывает его при использовании MyISAM. Если вы используете таблицы InnoDB как для ордеров, так и для 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>.

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

+0

Как включить InnoDB? Я могу раскомментировать содержимое, связанное с InnoDB в my.ini (на машине WindowsXP), но мне нужно делать какие-либо другие вещи? Я использую версию установки вручную MySQL – 5YrsLaterDBA

+0

с опцией --innodb? : mysqld-nt --install --innodb – 5YrsLaterDBA

1

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

Смежные вопросы