外键 (Foreign Key)
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。
换而言之,如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键则该属性集是关系模式R的外键,通常在数据库设计中缩写为FK。
作用
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
使用原则
1、 为关联字段创建外键。
2、 所有的键都必须唯一。
3、避免使用复合键。
4、外键总是关联唯一的键字段。
外键必须为另一个表的主键或者唯一值(unique key)
USE Test
GO
--主键表,被引用的表
CREATE TABLE M1
(
itemid int,
item varchar(20)
)
--外键表
CREATE TABLE F1
(
id int identity(1,1),
itemid int,
remark varchar(20)
)
--为主键表创建唯一约束,被引用的字段必须唯一
ALTER TABLE M1 ALTER COLUMN itemid int NOT NULL --修改字段为非空
ALTER TABLE M1 DROP CONSTRAINT uk_M1
ALTER TABLE M1 ADD CONSTRAINT uk_M1 UNIQUE (itemid)
--创建外键
ALTER TABLE F1 WITH CHECK ADD CONSTRAINT FK_F1_M1 FOREIGN KEY (itemid) REFERENCES M1(itemid)
ON DELETE CASCADE --没有这选项,删除时会提示被引用,有此选项时,运行更改主表时,从表会跟着改
ON UPDATE CASCADE
--插入主键表不存在的数据时,会阻止
INSERT INTO F1 VALUES (1, '第一句')
/*
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 FOREIGN KEY 约束"FK_F1_M1"冲突。该冲突发生于数据库"Test",表"dbo.M1", column 'itemid'。
语句已终止。*/
--为主键表新增数据
INSERT INTO M1 VALUES (1, '左转弯')
--为外键表插入数据
INSERT INTO F1 VALUES (1, '第一句')
--使外键约束失效,临时插入主键表不存在的数据
ALTER TABLE F1 NOCHECK CONSTRAINT FK_F1_M1
INSERT INTO F1 VALUES (2, '第二句')
--恢复外键约束
ALTER TABLE F1 CHECK CONSTRAINT FK_F1_M1
--删除外键约束
ALTER TABLE F1 DROP CONSTRAINT FK_F1_M1