外键 (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