为什么FK约束在MySql中不起作用

时间:2009-06-24 20:48:42

标签: mysql database

我创建了两个具有以下约束的ORDERS和ORDERITEMS表:

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

如果我想在ORDERS表中删除一个条目,并且在ORDERITEMS表中使用orderId,我认为我应该收到错误或警告。但实际上我一无所获。我在ORDER中插入了两行,在ORDERITEMS中插入了几行。当我试图删除ORDERS中的所有行时,我做到了。没有抱怨。我正在使用Toad for MySQL的MySQL数据库。

2 个答案:

答案 0 :(得分:5)

我猜你正在使用MyISAM表。

如果您运行“SHOW CREATE TABLE OrderItems”,您将看到它无法记录外键定义。

MyISAM表不支持外键。 MySQL解析语法,但在使用MyISAM时会以静默方式丢弃它。如果对Orders和OrderItem使用InnoDB表,这将更好。


默认情况下,您应该启用InnoDB。它被禁用是不寻常的。您可以验证是否这样做:

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

如果这是真的,那么您可以在ENGINE=INNODBCREATE表格时指定ALTER

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

请务必使用SHOW CREATE TABLE <name>仔细检查一下是否成功。

现在您可以添加约束,它应该生效。

答案 1 :(得分:1)

您使用的是什么数据库引擎? InnoDB是唯一支持外键约束的。