外鍵的使用大家都不陌生,是我們用於保持數據引用完整性的作用~辣今天我就分享一下外鍵的一些限制。1、外鍵引用的是需要其它表的主鍵,或者候選鍵。(這個比較好理解,就不寫代碼了╮(╯_╰)╭)2、外鍵創建之後並不會自動創建索引,這個是有開發人員自己考慮在外鍵上建相關索引是否能獲取到查詢效率上的提升3、預設...
外鍵的使用大家都不陌生,是我們用於保持數據引用完整性的作用~辣今天我就分享一下外鍵的一些限制。
1、外鍵引用的是需要其它表的主鍵,或者候選鍵。(這個比較好理解,就不寫代碼了╮(╯_╰)╭)
2、外鍵創建之後並不會自動創建索引,這個是有開發人員自己考慮在外鍵上建相關索引是否能獲取到查詢效率上的提升
3、預設的情況下如果在引用表插入不存在的外鍵值或者在主表刪除了一個被引用的數據,資料庫都會報錯。比如我們做個慄子
CREATE TABLE PK_Table ( ID INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(50) ) INSERT INTO dbo.PK_Table ( Name ) VALUES ( '主鍵1'),('主鍵2'); CREATE TABLE FK_Table1 ( ID INT PRIMARY KEY, PKID1 INT CONSTRAINT FK_1 FOREIGN KEY REFERENCES PK_Table(ID) ON DELETE NO ACTION, Name NVARCHAR(50) UNIQUE ) INSERT INTO dbo.FK_Table1 ( ID,PKID1, Name ) VALUES ( 1,1,N'外鍵1' ),( 2,2,N'外鍵2' ); CREATE TABLE FK_Table1_1 ( ID INT IDENTITY(1,1) PRIMARY KEY, FKID1 INT CONSTRAINT FK_1_1 FOREIGN KEY REFERENCES FK_Table1(ID) ON DELETE NO ACTION, Name NVARCHAR(50) ) INSERT INTO dbo.FK_Table1_1 ( FKID1, Name ) VALUES ( 1,N'外鍵1_1' ),( 1,N'外鍵1_2' ),( 2,N'外鍵2_1' ),( 2,N'外鍵2_2' );
然後刪除一條
DELETE FROM dbo.PK_Table WHERE ID = 2 或者 DELETE FROM dbo.FK_Table1 WHERE ID = 2
資料庫直接拋錯~正常嘛,人家就是這樣紙定義的。
但是其實行為並不止 NO ACTION 一種,還有CASCADE (級聯刪除), SET NULL(設置空) 和 SET DEFAULT(設置預設值) 3種行為的 字面上比較好理解。
SET NULL 和 SET DEFAULT 就比較好理解就不說了~
級聯的話如果定義了就一定要小心。 還是定義剛剛的Table 只是將FK_Table1 改成 CASCADE
CREATE TABLE PK_Table ( ID INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(50) ) INSERT INTO dbo.PK_Table ( Name ) VALUES ( '主鍵1'),('主鍵2'); CREATE TABLE FK_Table1 ( ID INT PRIMARY KEY, PKID1 INT CONSTRAINT FK_1 FOREIGN KEY REFERENCES PK_Table(ID) ON DELETE CASCADE, Name NVARCHAR(50) UNIQUE ) INSERT INTO dbo.FK_Table1 ( ID,PKID1, Name ) VALUES ( 1,1,N'外鍵1' ),( 2,2,N'外鍵2' ); CREATE TABLE FK_Table1_1 ( ID INT IDENTITY(1,1) PRIMARY KEY, FKID1 INT CONSTRAINT FK_1_1 FOREIGN KEY REFERENCES FK_Table1(ID) ON DELETE NO ACTION, Name NVARCHAR(50) )
然後一刪除~
DELETE FROM dbo.PK_Table WHERE ID = 2
DELETE 語句與 REFERENCE 約束"FK_1"衝突。該衝突發生於資料庫"Test",表"dbo.FK_Table1", column 'PKID1'。
其實就是因為 FK_Table1 的行不能刪除引起的~所以,如果定義了CASADE 要註意多層嵌套的使用