外键约束补充说明
外键约束详解及术语释疑 参见:https://blog.csdn.net/cnds123/article/details/39827049
关系型数据库表之间的联系[关系] 参见 https://blog.csdn.net/cnds123/article/details/116276167
关系模型中关系的完整性约束 参见 https://blog.csdn.net/cnds123/article/details/114336832
引用完整性约束(外键约束)可以定义修改编辑(INSERT、DELETE、UPDATE操作)记录规则。
在创建表时(通过 CREATE TABLE 语句),或者在表创建之后(通过 ALTER TABLE 语句)在外键约束中使用{ON DELETE | ON UPDATE } { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ,可以定义修改记录规则。
外键约束简化版语法
[ADD CONSTRAINT 外键约束名]
FOREIGN KEY(外键列名) REFERENCES 主表(主表的主键列名)]
[{ON DELETE | ON UPDATE } { NO ACTION | CASCADE | SET NULL | SET DEFAULT }]
建立外键约束后,DBMS将执行参照完整性检查和违约处理:
外键约束对子表的作用:
在子表上进行INSERT、UPDATE 操作的限制是,要和主表中的主键值匹配,或为NULL,否则不允许。
外键约束对父表的作用:
在父表上进行UPDATE、DELETE操作的限制,取决于在定义子表的外键时指定的ON UPDATE、ON DELETE子句。
ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT },若没有指定ON DELETE子句,默认拒绝执行(NO ACTION)。
ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT },若没有指定ON UPDATE子句,默认拒绝执行(NO ACTION)。
顺便指出,不同的DBMS支持的情况不尽相同。
ON DELETE子句各选项的作用:
①NO ACTION :删除主表记录,如果子表中有和主表匹配的记录,则不允许(产生一个错误提示)。
②CASCADE (级联):删除主表记录,也将删除子表中的匹配记录。
③SET NULL :删除主表记录,将子表中的匹配记录的外键值改为NULL。
④SET DEFAULT :删除主表记录,将子表中的匹配记录的外键值改为默认值。
ON UPDATE子句各选项的作用:
①NO ACTION :更新主表记录的主键值,如果子表中有和主表匹配的记录,则不允许(产生一个错误提示)。
②CASCADE :更新主表记录的主键值,子表中的匹配记录的外键值一起修改。
③SET NULL :更新主表记录的主键值,子表中的匹配记录的外键值改为NULL。
④SET DEFAULT :更新主表记录的主键值,子表中的匹配记录的外键值改为默认值。
外键约束通过主键(它所在的表即主表)和外键(它所在的表即子表)实现的,本文将主键值和外键值相等的记录称为匹配记录(或关联记录)。
参照完整性属于表间规则。对于相关的表,在更新、插入或删除记录时,如果只改其一不改其二,就可能影响数据的完整性:例如,删除父表的某记录后,子表的相应记录未删除,致使这些记录成为孤立记录;修改父表中对应列的值后,子表对应列的值未做相应改变;对于子表插入的记录,父表中没有对应列的值的记录;更改子表的外键值,父表中没有对应列的值的记录。
☆使用级联引用完整性约束例子
建立主表
CREATE TABLE Countries
(CountryId INT PRIMARY KEY,
CountryOutline char(30));
在从表中指定ON DELETE CASCADE
1、建立从表(子表)时指定ON DELETE CASCADE
CREATE TABLE Cities
( CityId INT PRIMARY KEY,
CityOutline char(50),
CountryId INT REFERENCES Countries(CountryId) ON DELETE CASCADE);
2、若建立从表时未指定ON DELETE CASCADE,可以用如下语句添加之
ALTER TABLE Cities
ADD CONSTRAINT fk_consName
REFERENCES Countries(CountryId) ON DELETE CASCADE;