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

5Yr*_*DBA 1 mysql database

我用以下约束创建了两个表ORDERS和ORDERITEMS:

alter table OrderItems add constraint FK_Reference_30 foreign key (orderId)
  references Orders (orderId) on delete restrict on update restrict;
Run Code Online (Sandbox Code Playgroud)

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

Bil*_*win 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   | 
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)

如果这是真的,那么您可以指定ENGINE=INNODB何时CREATEALTER表:

mysql> ALTER TABLE Orders ENGINE=INNODB;
mysql> ALTER TABLE OrderItems ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)

请务必仔细检查它是否成功SHOW CREATE TABLE <name>.

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