快速解锁ACCESS数据库外键的创建与删除技巧
创始人
2025-05-28 16:51:15

日期:2023年3月15日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006


目录

文章目录

  • 一、前言
  • 二、外键的作用
  • 三、外键的创建
    • (3-1)更新操作
      • (3-1-1)级联更新
      • (3-1-2)更新置NULL
    • (3-2)删除操作
      • (3-2-1)级联删除
      • (3-2-2)删除置NULL
  • 四、外键的删除
    • (4-1)语法
    • (4-2)示例


在这里插入图片描述


一、前言

看了很多网上的教程,这方面的知识还是比较零散的。如果项目应用错了外键,那么很有可能会出现不能保存,或者不能删除的清空。这两种情况在设计阶段可能可以比较及时发现问题的,但是还有一种情况就比较隐藏了,那就是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错误语法,避免使用

(3-1)更新操作

级联更新更新置NULL
语法UPDATE CASCADEUPDATE SET NULL
说明修改参考表数据,对应的原始表数据也会更新修改参考表数据,对应的原始表数据会被置NULL

(3-1-1)级联更新

语法:

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

(3-1-2)更新置NULL

语法:

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

(3-2)删除操作

级联删除删除置NULL
语法DELETE CASCADEDELETE SET NULL
说明删除参考表数据,对应的原始表数据也会被删除删除参考表数据,对应的原始表数据会被置NULL

(3-2-1)级联删除

语法:

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、删除参考表-分组表的分组代码gidGP0001 的记录,删除后的分组如下所示:

gid分组代码gname分组名称
GP0001打印机
GP0002猴哥办公

3、删除参考表-分组表的分组代码gidGP0001的记录,原始表-货品表的分组代码为GP0001的所有记录将会被删除,如下所示:

id(货品代码)name(货品名称)gid(分组代码)
G0001喷墨打印机GP0001
G0001针式打印机GP0001
G0003猴哥牌打印机GP0002

(3-2-2)删除置NULL

语法:

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、删除参考表-分组表的分组代码gidGP0001的记录

gid分组代码gname分组名称
GP0001打印机

3、删除参考表-分组表的分组代码gidGP0001的记录,原始表-货品表记录中gidGP0001将会置NULL,如下所示:

id(货品代码)name(货品名称)gid(分组代码)
G0001打印机NULL

四、外键的删除

(4-1)语法

两种写法都可以,不过建议采用NO1

NO1:

ALTER TABLE [表名] DROP CONSTRAINT [外键名称];

NO2:

ALTER TABLE 表名 DROP CONSTRAINT 外键名称;

(4-2)示例

ALTER TABLE [goods] DROP CONSTRAINT [fk_goods_group];

参考文章:

1、《CONSTRAINT 子句 (Microsoft Access SQL)》
2、《删除外键关系》


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/129059521

相关内容

热门资讯

原创 宫... 说起宫保鸡丁,你一定不会陌生——酸甜微辣的酱汁裹着嫩鸡肉,咬到花生米时“咔嚓”一声脆,再配一碗热米饭...
上班族快手晚餐:20分钟搞定家... 平日里的美食,可不是仅仅用来满足肚子的东西,它更是情感连接的主线,是文化得以承载的凭借。它将我们的清...
上班族必备!快速做出美味家常菜... 日常的生活,离不开一日三餐,然而美食却是那其中起到显著作用的关键一笔。它不单单是为了满足填饱肚子的需...
香菇的几种家常做法,嫩滑鲜美,... 一:香菇炖鸡块 1、鸡块、瘦肉洗净沥干水 2、香菇用水泡发半小时,红枣洗净剪开 3、电饭锅里放水,...
家常便饭怎样做出美味?日常美食... 平日里的美食,其意义远超单纯满足口腹之欲的范围。它像条无形纽带,紧密连着我们多样情绪,连着难忘记忆,...