MySQL外鍵約束方式

MySQL外鍵約束方式測試

 若是表A的主關鍵字是表B中的字段,則該字段稱爲表B的外鍵,表A稱爲主表,表B稱爲從表。外鍵是用來實現參照完整性的,不一樣的外鍵約束方式將能夠使兩張表緊密的結合起來,特別是修改或者刪除的級聯操做將使得平常的維護工做更加輕鬆。這裏以MySQL爲例,總結一下3種外鍵約束方式的區別和聯繫。   www.2cto.com       這裏以用戶表和用戶組表爲例,這是一個典型的多對一關係,多個用戶對應於一個用戶組。      首先建立用戶組表: 建立用戶組表 create table t_group ( id int not null, name varchar(30), primary key (id) ); 並插入兩條記錄: 插入記錄 insert into t_group values (1, 'Group1'); insert into t_group values (2, 'Group2');  下面建立用戶表,分別以不一樣的約束方式建立外鍵引用關係: 一、級聯(cascade)方式 級聯方式 create table t_user ( id int not null, name varchar(30), groupid int, primary key (id), foreign key (groupid) references t_group(id) on delete cascade on update cascade );   參照完整性測試 insert into t_user values (1, 'qianxin', 1); #能夠插入 insert into t_user values (2, 'yiyu', 2);    #能夠插入 insert into t_user values (3, 'dai', 3);    #錯誤,沒法插入,用戶組3不存在,與參照完整性約束不符   約束方式測試 insert into t_user values (1, 'qianxin', 1); insert into t_user values (2, 'yiyu', 2); insert into t_user values (3, 'dai', 2); delete from t_group where id=2;              #致使t_user中的二、3記錄級聯刪除 update t_group set id=2 where id=1;          #致使t_user中的1記錄的groupid級聯修改成2  二、置空(set null)方式 置空方式 create table t_user ( id int not null, name varchar(30), groupid int, primary key (id), foreign key (groupid) references t_group(id) on delete set null on update set null );  參照完整性測試insert into t_user values (1, 'qianxin', 1); #能夠插入 insert into t_user values (2, 'yiyu', 2);    #能夠插入 insert into t_user values (3, 'dai', 3);     #錯誤,沒法插入,用戶組3不存在,與參照完整性約束不符  約束方式測試 insert into t_user values (1, 'qianxin', 1); insert into t_user values (2, 'yiyu', 2); insert into t_user values (3, 'dai', 2); delete from t_group where id=2;              #致使t_user中的二、3記錄的groupid被設置爲NULL update t_group set id=2 where id=1;          #致使t_user中的1記錄的groupid被設置爲NULL   三、禁止(no action / restrict)方式 禁止方式 create table t_user ( id int not null, name varchar(30), groupid int, primary key (id), foreign key (groupid) references t_group(id) on delete no action on update no action );  參照完整性測試 insert into t_user values (1, 'qianxin', 1); #能夠插入 insert into t_user values (2, 'yiyu', 2);    #能夠插入 insert into t_user values (3, 'dai', 3);     #錯誤,沒法插入,用戶組3不存在,與參照完整性約束不符  約束方式測試 insert into t_user values (1, 'qianxin', 1); insert into t_user values (2, 'yiyu', 2); insert into t_user values (3, 'dai', 2); delete from t_group where id=2;              #錯誤,從表中有相關引用,所以主表中沒法刪除 update t_group set id=2 where id=1;          #錯誤,從表中有相關引用,所以主表中沒法修改  rest

注:在MySQL中,restrict方式與no action方式做用相同。 io

相關文章
相關標籤/搜索