2014-01-06 126 views
0

当table1中的主键被删除时,如何将table2中的外键值设置为NULL? 我已经创建了2个表Itemorder_item如何将外键值设置为'NULL'?

Item(item_no(primary key),qty); 
order_item(item_no(foreign key),order_no); 

我已经创建表order_item

create table order_item( 
item_no int references item on delete set NULL, 
    order_no int); 

然后,我已插入5个值在Item表。 现在,如果我删除项目表中的item_no = 4,它在Item表中被删除,但item_no的值在order_item表中未被设置为NULL

回答

1

使用明确CONSTRAINT [name] FOREIGN KEY ...条款请使用以下语法:

CREATE TABLE order_item1(
    item_no int, 
    order_no int, 
    constraint foreign key (item_no) references item(item_no) on delete set NULL 
); 

或添加明确地将foreigng键到现有的表:

ALTER TABLE order_item1 
ADD constraint foreign key (item_no) references item(item_no) on delete set NULL ; 

请在这个简单的测试案例来看看:http://www.sqlfiddle.com/#!2/3dddf/1
内联引用子句不起作用。

这个陌生behavoiur的原因在文档描述,请检查此链接:
http://dev.mysql.com/doc/refman/5.7/en/create-table.html

MySQL不支持或识别“内联参考规范”(如SQL标准中定义)引用被定义为列规范的一部分。只有在指定为单独的FOREIGN KEY规范的一部分时,MySQL才接受REFERENCES子句。


内联(内联=旁边列定义)参考specyfications被MySQL解析,然而MySQL简单地忽略它们。

+0

你为什么用另一张桌子? – user2713461

+0

我在演示中使用了两个表'order_item'和'order_item1'来显示,仅使用一个测试用例,它们有何不同(运行'delete'后会有什么结果)。如果我使用相同的表名,它需要两个测试用例。 – krokodilko