级联引用完整性约束ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

通过使用级联引用完整性约束,您可以定义当用户试图删除或更新现有外键指向的键时,SQL Server 执行的操作。

CREATE TABLE 语句和 ALTER TABLE 语句的 REFERENCES 子句支持 ON DELETE 子句和 ON UPDATE 子句。还可以使用“外键关系”对话框定义级联操作:

  • [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

  • [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

如果没有指定 ON DELETE 或 ON UPDATE,则默认为 NO ACTION。

ON DELETE NO ACTION

指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 DELETE 语句。

ON UPDATE NO ACTION

指定如果试图更新某一行中的键值,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 UPDATE 语句。

CASCADE、SET NULL 和 SET DEFAULT 允许通过删除或更新键值来影响指定具有外键关系的表,这些外键关系可追溯到在其中进行修改的表。如果为目标表也定义了级联引用操作,那么指定的级联操作也将应用于删除或更新的那些行。不能为具有 timestamp 列的外键或主键指定 CASCADE。

ON DELETE CASCADE

指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则也将删除所有包含那些外键的行。

ON UPDATE CASCADE

指定如果试图更新某一行中的键值,而该行的键值被其他表的现有行中的外键所引用,则组成外键的所有值也将更新到为该键指定的新值。

ON DELETE SET NULL

指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。为了执行此约束,目标表的所有外键列必须可为空值。

ON UPDATE SET NULL

指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。为了执行此约束,目标表的所有外键列必须可为空值。

ON DELETE SET DEFAULT

指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。为了执行此约束,目标表的所有外键列必须具有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作为该列的隐式默认值。因 ON DELETE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。

ON UPDATE SET DEFAULT

指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。为了执行此约束,目标表的所有外键列必须具有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作为该列的隐式默认值。因 ON UPDATE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。

任务描述 本关任务:创建外码约束(参照完整性约束)。 相关知识 为了完成本关任务,你需要掌握: 1.什么是外码; 2.什么是参照完整性约束; 3.如何定义参照完整性约束。 什么是外码 外码是表中的一个或一组字段(属性),它可以不是本表的主码,但它与某个主码(同一表或其它表的主码)具有对应关系(语义完全相同)。外码可以是一列或多列,一个表可以有一个或多个外码。当我们谈论外码时,一定有个主码与它对应,外码不可能单独存在。主码所在的表为主表,又称父表,外码所在的表为从表,又称子表。比如在以下两表:“学生表”和“院系表”中,“学生表”中的字段“所在院系”与“院系表”中的“院系代码”具有对应关系,其中“院系代码”是“院系表”的主码,“学生表”中的“所在院系”为外码。 表1 学生表 学号 姓名 所在院系 U20200101 赵永丰 210 U20200102 钱守仁 210 U20200301 孙有礼 010 表2 院系表 院系代码 名称 010 数学系 200 机械学院 210 计算机学院 什么是外码约束(参照完整性约束) 外码用来在数据之间(即外码与其对应的主码间)建立关联。参照完整性约束用于约束外码列的取值范围:外码列的取值要么为空,要么等于其对应的主码列的某个取值。在语义允许,又不违反其它约束规则的情形下,外码列的取值才可以为空。在上面的例子中,学生所在的院系,要么取空值(可以表示:已录取,尚未确定院系),要么为院系表中的某个院系(总之,绝对不允许出现院系表中不存在的院系)。 如何定义外码约束 可在定义表的同时定义各种完整性约束规则(当然包括外码约束,亦即参照完整性约束)。在前面的实验中,我们已经介绍过建表语句的语法,外码约束既可以定义为列约束,亦可定义为表约束: 1 列级外码约束 列级外码约束的语法格式如下: 列级外码约束 ::= 列名 数据类型 [REFERENCES tbl_name (col_name) [ON DELETE RESTRICT|CASCADE|SET NULL|NO ACTION|SET DEFAULT] [ON UPDATE RESTRICT|CASCADE|SET NULL| NO ACTION|SET DEFAULT]] 即在列的名称和数据类型后,直接用关键词references定义外码约束,指明该外码对应的主码(表名和列名),同时还可以定义(可选)一旦违反参照完整性时,应采取何种应对策略。 2 表级外码约束 表约外码约束的语法格式如下: 表级外码约束 ::= [CONSTRAINT [约束名]] FOREIGN KEY (col_name,...) REFERENCES tbl_name (col_name,...) [ON DELETE RESTRICT|CASCADE|SET NULL|NO ACTION|SET DEFAULT] [ON UPDATE RESTRICT|CASCADE|SET NULL| NO ACTION|SET DEFAULT] MySQL表级外码约束的好处是可以给约束命名,且支持多属性组合外码(即外码由多个列组成)。事实上,外码约束定义在表一级,是不二的选择,因为MySQL对列级外码约束的支持仅停留在语法检查阶段,实际并没有实现(至少8.0.22还没有实现)。外码约束的名称一般以“FK_”为前缀,这是约定俗成的规则。 在前例中,被引用的表“院系表”应先于引用表“学生表”定义: CREATE TABLE 院系表 ( 院系代码 char(3) PRIMARY KEY, 名称 VARCHAR(22) ); CREATE TABLE 学生表 ( 学号 char(9) PRIMARY KEY, 姓名 VARCHAR(22), 所在院系 char(3), CONSTRAINT FK_student_dept FOREIGN KEY(所在院系) REFERENCES 院系表(院系代码) ); 在上述实现中,两个表的主码约束都定义成列约束,且省略了命名,外码约束显然是作为表约束定义的。由于是单属性作外码,这个外码约束也可以定义为列级约束。 编程要求 设有以下两张表: dept(部门) 字段名称 数据类型 备注 deptNo INT 部门号,主键 deptName VARCHAR(32) 部门名称 staff(职工) 字段名称 数据类型 备注 staffNo INT 职工号,主键 staffName VARCHAR(32) 职工姓名 gender CHAR(1) 性别,F-女,M-男
最新发布
03-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值