學習測試:外鍵

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