学习测试:外键

--=======测试:外键=========-----
--=======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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章