我创建了两个具有以下约束的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数据库。
答案 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=INNODB
或CREATE
表格时指定ALTER
:
mysql> ALTER TABLE Orders ENGINE=INNODB;
mysql> ALTER TABLE OrderItems ENGINE=INNODB;
请务必使用SHOW CREATE TABLE <name>
仔细检查一下是否成功。
现在您可以添加约束,它应该生效。
答案 1 :(得分:1)
您使用的是什么数据库引擎? InnoDB是唯一支持外键约束的。