日期:2023年3月15日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助
,帮忙点个赞
,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006
目录
看了很多网上的教程,这方面的知识还是比较零散的。如果项目应用错了外键,那么很有可能会出现不能保存,或者不能删除的清空。这两种情况在设计阶段可能可以比较及时发现问题的,但是还有一种情况就比较隐藏了,那就是SET NULL
,客户数据突然就空了,这才叫一个头大。好了,话不多说,进入正题吧……
外键(Foreign Key)
实际上就是加一个约束(CONSTRAINT )
,其的作用在于禁止写入引用外键没有的或者唯恐的数据、级联更新、更新置空、级联删除以及删除置空。
主键(Primary Key)
是用于标志实体唯一性的
外键(Foreign Key)
是用于标志引用完整性的。
值得指出的是,本文所说的置空,不是设置为空字符串,而是置NULL的意思。
ALTER TABLE [表名] ADD CONSTRAINT [外键名称] FOREIGN KEY ([外键字段名称]) REFERENCES [参照表的表名] ([参照表的字段名称]) [ON UPDATE CASCADE |SET NULL] [ON DELETE CASCADE |SET NULL]}
为了更好描述,将两个表分别定义为:
原始表:添加约束的表,即[表名]中的表
;
参考表:添加约束的表(即原始表)会参考这个表来做动作,那么“这个表”就是参考表(也有大部分人叫做引用表,但是我觉得这个叫法不是很好区分,所以下述我统一称之为参考表),即[参照表的表名]中的表
;
ON 动作1 动作2
动作1:UPDATE
(更新)和DELETE
(删除)
动作2:CASCADE
(级联)和SET NULL
(置空)
语法 | 说明 |
---|---|
ON UPDATE CASCADE | 级联更新 |
ON UPDATE SET NULL | 更新置空 |
ON DELETE CASCADE | 级联删除 |
ON DELETE SET NULL | 删除置空 |
语法 | 说明 |
---|---|
ON UPDATE CASCADE ON DELETE CASCADE | 级联更新、级联删除 |
ON UPDATE CASCADE ON DELETE SET NULL | 级联更新、删除置空 |
ON UPDATE SET NULL ON DELETE CASCADE | 更新置空、级联删除 |
ON UPDATE SET NULL ON DELETE SET NULL | 更新置空、删除置空 |
语法 | 说明 |
---|---|
ON UPDATE SET NULL CASCADE | 错误语法,避免使用 |
ON DELETE SET NULL CASCADE | 错误语法,避免使用 |
ON UPDATE CASCADE SET NULL | 错误语法,避免使用 |
ON DELETE CASCADE SET NULL | 错误语法,避免使用 |
级联更新 | 更新置NULL | |
---|---|---|
语法 | UPDATE CASCADE | UPDATE SET NULL |
说明 | 修改参考表数据,对应的原始表数据也会更新 | 修改参考表数据,对应的原始表数据会被置NULL |
语法:
ALTER TABLE [表名] ADD CONSTRAINT [外键名称] FOREIGN KEY ([外键字段名称]) REFERENCES [参考表的表名] ([参考表的字段名称]) ON UPDATE CASCADE;
示例:
ALTER TABLE [goods] ADD CONSTRAINT [fk_up_goods_group] FOREIGN KEY ([gid]) REFERENCES [group] ([gid]) ON UPDATE CASCADE;
1、原始表-货品表数据如下所示:
id (货品代码) | name (货品名称) | gid (分组代码) |
---|---|---|
G0001 | 打印机 | GP0001 |
2、修改参考表-分组表的分组代码gid
,由 GP0001
改为 XX0001
办公用品,修改后的分组如下所示:
gid 分组代码 | gname 分组名称 |
---|---|
XX0001 | 打印机 |
3、修改参考表-分组表的分组代码gid
,会级联更新原始表-货品表的记录,如下所示:
id (货品代码) | name (货品名称) | gid (分组代码) |
---|---|---|
G0001 | 打印机 | XX0001 |
语法:
ALTER TABLE [表名] ADD CONSTRAINT [外键名称] FOREIGN KEY ([外键字段名称]) REFERENCES [参考表的表名] ([参考表的字段名称]) ON UPDATE SET NULL;
示例:
ALTER TABLE [goods] ADD CONSTRAINT [fk_upnull_goods_group] FOREIGN KEY ([gid]) REFERENCES [group] ([gid]) ON UPDATE SET NULL;
1、原始表-货品表数据如下所示:
id (货品代码) | name (货品名称) | gid (分组代码) |
---|---|---|
G0001 | 打印机 | GP0001 |
2、修改参考表-分组表的分组代码gid
,由 GP0001
改为 XX0001
办公用品,修改后的分组如下所示:
gid 分组代码 | gname 分组名称 |
---|---|
XX0001 | 打印机 |
3、修改参考表-分组表的分组代码gid
,原始表-货品表的记录中的gid
将会置NULL
,如下所示:
id (货品代码) | name (货品名称) | gid (分组代码) |
---|---|---|
G0001 | 打印机 | NULL |
级联删除 | 删除置NULL | |
---|---|---|
语法 | DELETE CASCADE | DELETE SET NULL |
说明 | 删除参考表数据,对应的原始表数据也会被删除 | 删除参考表数据,对应的原始表数据会被置NULL |
语法:
ALTER TABLE [表名] ADD CONSTRAINT [外键名称] FOREIGN KEY ([外键字段名称]) REFERENCES [参考表的表名] ([参考表的字段名称]) ON DELETE CASCADE;
示例:
ALTER TABLE [goods] ADD CONSTRAINT [fk_del_goods_group] FOREIGN KEY ([gid]) REFERENCES [group] ([gid]) ON DELETE CASCADE;
1、原始表-货品表数据如下所示:
id (货品代码) | name (货品名称) | gid (分组代码) |
---|---|---|
G0001 | 喷墨打印机 | GP0001 |
G0002 | 针式打印机 | GP0001 |
G0003 | 猴哥牌打印机 | GP0002 |
2、删除参考表-分组表的分组代码gid
为 GP0001
的记录,删除后的分组如下所示:
gid 分组代码 | gname 分组名称 |
---|---|
GP0001 | |
GP0002 | 猴哥办公 |
3、删除参考表-分组表的分组代码gid
为GP0001
的记录,原始表-货品表的分组代码为GP0001
的所有记录将会被删除,如下所示:
id (货品代码) | name (货品名称) | gid (分组代码) |
---|---|---|
G0001 | GP0001 | |
G0001 | GP0001 | |
G0003 | 猴哥牌打印机 | GP0002 |
语法:
ALTER TABLE [表名] ADD CONSTRAINT [外键名称] FOREIGN KEY ([外键字段名称]) REFERENCES [参考表的表名] ([参考表的字段名称]) ON DELETE SET NULL;
示例:
ALTER TABLE [goods] ADD CONSTRAINT [fk_delnull_goods_group] FOREIGN KEY ([gid]) REFERENCES [group] ([gid]) ON DELETE SET NULL;
1、原始表-货品表数据如下所示:
id (货品代码) | name (货品名称) | gid (分组代码) |
---|---|---|
G0001 | 打印机 | GP0001 |
2、删除参考表-分组表的分组代码gid
为GP0001
的记录
gid 分组代码 | gname 分组名称 |
---|---|
GP0001 |
3、删除参考表-分组表的分组代码gid
为GP0001
的记录,原始表-货品表记录中gid
为GP0001
将会置NULL
,如下所示:
id (货品代码) | name (货品名称) | gid (分组代码) |
---|---|---|
G0001 | 打印机 | NULL |
两种写法都可以,不过建议采用NO1。
NO1:
ALTER TABLE [表名] DROP CONSTRAINT [外键名称];
NO2:
ALTER TABLE 表名 DROP CONSTRAINT 外键名称;
ALTER TABLE [goods] DROP CONSTRAINT [fk_goods_group];
参考文章:
1、《CONSTRAINT 子句 (Microsoft Access SQL)》
2、《删除外键关系》
版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/129059521