--=======測試:外鍵=========-----
--=======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
學習測試:外鍵
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
外鍵約束
wx57cb9069e923f
2019-02-23 00:41:30
(MYSQL學習筆記1)給數據庫設置外鍵
w1sw
2019-02-23 00:33:04
Flask SQLAlchemy 不設外鍵進行關聯查詢
hhuayuan
2019-02-22 16:28:23
在MySQL數據庫建立多對多的數據表關係
liaoshaoyang
2019-02-22 15:53:39
4Python全棧之路系列之MYSQL外鍵
Adlereden
2019-02-22 15:17:42
jquery easyui datagrid 顯示外鍵/子屬性/二層屬性的值的方法
rireach
2018-09-12 03:51:31
關於mysql外鍵
wx583ffec9ca2ba
2018-09-12 02:37:31
MySQL表創建及外鍵
樑小明007
2018-09-11 07:19:36
補12.關於mysql的外鍵約束
蘇浩智
2018-09-11 06:34:16
外鍵約束
wx57cb9069e923f
2018-09-11 05:15:26