--=======测试:外键=========-----
--=======Auther:Su=========-----
--=======Time:2015-06-26===-----
--=========================-----
--*******理论知识**********-----
--=========================-----
--新增表时加外键:foreign key(列名) references 引用外键表(列名)ON DELETE NO ACTION /ON UPDATE NO ACTION /*还可接CASCADE,SET NULL,SET DEFAULT*/
--已存在表加外键:alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名[可以省略])ON DELETE NO ACTION ON UPDATE NO ACTION /*还可接CASCADE,SET NULL,SET DEFAULT*/
--NO ACTION:表示不执行任何操作,当删除主键表中数据时,如果外键表中有相应的数据,则主键表中的删除操作 失败,该选项为默认选项。
--CASCADE : 表示级联操作,当删除主键表中数据时,外键表中相应的数据会被自动删除
--SET NULL: 执行级联操作,并且将外键表中的所有数据都设置为空值。
--SET DEFAULT :与SET NULL类似,外键表中数据都设置为默认值。
--主键表和外键表:T1.ID是表T2的外键,而且是表T1的主键,那么对于T1.ID来说表T1就是主键表,表T2就是外键表
--删除外键alter table 表名 drop constraint 外键名
--不检查约束alter table 表名 nocheck constraint 外键名
--检查约束alter table 表名 check constraint 外键名
--=========================-----
--*******测试代码**********-----
--=========================-----
--测试一:新增和删除记录
--新建表及外键
CREATE TABLE T1(ID BIGINT not null default(0),Name nvarchar(100),PRIMARY KEY(ID))
CREATE TABLE T2(ID BIGINT not null default(0),Class int,PRIMARY KEY(ID),foreign key(ID) references T1(ID))
--=========================-----
--==插入主键表数据
INSERT INTO T1
SELECT 1,‘CS1‘UNION ALL
SELECT 2,‘CS2‘
--==插入外键表数据
INSERT INTO T2
SELECT 1,111 UNION
SELECT 3,333
--消息 2627:INSERT 语句与 FOREIGN KEY 约束"FK__T2__ID__32D74F96"冲突。该冲突发生于数据库"vobao_lab",表"dbo.T1", column ‘ID‘。
--原因:插入外键表时,发现T1没有ID=3的列,可以把脚本改成以下:
INSERT INTO T2
SELECT 1,111 UNION
SELECT 2,222
--执行成功
--==删除数据
DELETE FROM T1 WHERE ID=1
--消息 547:DELETE 语句与 REFERENCE 约束"FK__T2__ID__32D74F96"冲突。该冲突发生于数据库"vobao_lab",表"dbo.T2", column ‘ID‘。
--原因:T2有对应的记录,T1该记录就不能删除,将T2对应记录删除后T1记录就可以操作了
DELETE FROM T2 WHERE ID=1
DELETE FROM T1 WHERE ID=1
--结论一:外键表有的记录主键表一定有,主键表有的记录外键表不一定有,外键表有的记录主键表对应记录不能删除(主键表不能删除:消息 3726)
--测试二:CASCADE
--创建表
CREATE TABLE T1(ID BIGINT not null default(0),Name nvarchar(100),PRIMARY KEY(ID))
CREATE TABLE T2(ID BIGINT not null default(0),Class int,PRIMARY KEY(ID))
ALTER TABLE T2 ADD CONSTRAINT T2_ID FOREIGN KEY(ID)references T1 ON DELETE CASCADE
--==插入主键表数据
INSERT INTO T1
SELECT 1,‘CS1‘UNION ALL
SELECT 2,‘CS2‘
--==插入外键表数据
INSERT INTO T2
SELECT 1,111 UNION
SELECT 2,222
--==删除数据
DELETE FROM T1 WHERE ID=1
--执行成功,同时删除T1和T2中ID=1的记录
DELETE FROM T2 WHERE ID=2
--执行成功,删除T2中ID=2的记录
--结论二:CASCADE:当删除主键表中记录时,外键表中相应的记录会被自动删除;删除外键表记录时,主键表记录不会删除
--测试三:SET NULL/DEFAULT
--创建表
CREATE TABLE T1(ID BIGINT not null default(0),Name nvarchar(100),PRIMARY KEY(ID))
CREATE TABLE T2(ID BIGINT not null default(0),Class int,PRIMARY KEY(ID))
ALTER TABLE T2 ADD CONSTRAINT T2_ID FOREIGN KEY(ID)references T1 ON DELETE SET DEFAULT
--==插入主键表数据
INSERT INTO T1
SELECT 1,‘CS1‘UNION ALL
SELECT 2,‘CS2‘UNION ALL
SELECT 3,‘CS3‘
--==插入外键表数据
INSERT INTO T2
SELECT 1,111 UNION
SELECT 2,222
--==删除数据
DELETE FROM T1 WHERE ID=1
--消息 547:DELETE 语句与 FOREIGN KEY 约束"T2_ID"冲突。该冲突发生于数据库"vobao_lab",表"dbo.T1", column ‘ID‘。
--原因:删除T1中ID=1的记录,在将T2中ID=1的记录更新为ID=0时发出错误,因为T1不存在ID=0的记录
--==插入主键表数据
INSERT INTO T1
SELECT 0,‘CS0‘
--==删除数据
DELETE FROM T1 WHERE ID=1
--执行成功,删除T1中ID=1的记录和将T2中ID=1的记录更新为ID=0
DELETE FROM T2 WHERE ID=2
--执行成功,删除T2中ID=2的记录
--结论三:SET NULL/DEFAULT:当删除主键表中记录时,外键表中相应的记录会被自动更新为NULL或者DEFAULT(如果主键表的主键值不允许空或者不存在DEFAULT值,则执行失败);删除外键表记录时,主键表记录不会删除
--不检查约束alter table 表名 nocheck constraint 外键名
alter table T2 nocheck constraint T2_ID
DELETE FROM T1 WHERE ID=0
--检查约束alter table 表名 check constraint 外键名
alter table T2 check constraint T2_ID
INSERT INTO T1 SELECT 0,‘CS0‘
DELETE FROM T1 WHERE ID=0
--删除外键alter table 表名 drop constraint 外键名
ALTER TABLE T2 DROP CONSTRAINT T2_ID