SQL - 停用外部索引鍵(FK)

摘要:SQL - 停用外部索引鍵(FK)

前陣子為了刪除客戶的測試機資料,花了一點心力,怎麼說呢!? 因為資料表有太多的關聯,在下刪除時會遇到違反外部索引鍵的問題。那時真的是刪到快要把電腦砸了,之後為了讓一些在測試時出現的「詭異」資料能快速的刪除,最後選擇了停用條件約束的方式。當然,本篇不提昌使用,但在萬不得已情況下,還是可以來使用的,以下就來看看唄...

Code:

--建立兩個 TABLE
CREATE TABLE [DBO].[MY_ROOT_TABLE](
 [UID] [NVARCHAR](10) NOT NULL,
 [U_NAME] [NVARCHAR](20) NOT NULL,
 [CREATE_TIME] [DATETIME] NOT NULL,
 CONSTRAINT [PK_MY_ROOT_TABLE] PRIMARY KEY CLUSTERED
(
 [UID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [DBO].[MY_CHILD_TABLE](
 [UID] [NVARCHAR](10) NOT NULL,
 [RT_UID] [NVARCHAR](10) NOT NULL,
 [U_ID_CARD] [NVARCHAR](10) NOT NULL,
 [U_BIRTHDAY] [NVARCHAR](4) NULL,
 [U_MOBILE] [NVARCHAR](10) NULL,
 [CREATE_TIME] [DATETIME] NOT NULL,
 CONSTRAINT [PK_MY_CHILD_TABLE_1] PRIMARY KEY CLUSTERED
(
 [UID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [DBO].[MY_CHILD_TABLE]  WITH NOCHECK ADD  CONSTRAINT [FK_MY_CHILD_TABLE_MY_ROOT_TABLE] FOREIGN KEY([UID])
REFERENCES [DBO].[MY_ROOT_TABLE] ([UID])
GO

ALTER TABLE [DBO].[MY_CHILD_TABLE] CHECK CONSTRAINT [FK_MY_CHILD_TABLE_MY_ROOT_TABLE]
GO

--新增一個正常的資料
INSERT INTO DBO.MY_ROOT_TABLE VALUES('1', '張小呆', GETDATE())
INSERT INTO DBO.MY_CHILD_TABLE
VALUES('1', '1', 'F111111111', '0216', '0911222333', GETDATE())

--查詢兩個資料表的資料
SELECT * FROM DBO.MY_ROOT_TABLE
SELECT * FROM DBO.MY_CHILD_TABLE

--測試將停用外部索引鍵,並建立一個在父資料表未有的 RT_UID 資料
ALTER TABLE DBO.MY_CHILD_TABLE NOCHECK CONSTRAINT FK_MY_CHILD_TABLE_MY_ROOT_TABLE

INSERT INTO DBO.MY_CHILD_TABLE
VALUES('2', '2', 'F222222222', '0216', '0911222333', GETDATE())


--查詢兩個資料表的資料
SELECT * FROM DBO.MY_ROOT_TABLE
SELECT * FROM DBO.MY_CHILD_TABLE

--測試將啟用外部索引鍵,並建立一個在父資料表未有的 RT_UID 資料
ALTER TABLE DBO.MY_CHILD_TABLE CHECK CONSTRAINT FK_MY_CHILD_TABLE_MY_ROOT_TABLE
INSERT INTO DBO.MY_CHILD_TABLE
VALUES('3', '3', 'F222222222', '0216', '0911222333', GETDATE())

結果:「訊息 547,層級 16,狀態 0,行 2
INSERT 陳述式與 FOREIGN KEY 條件約束 "FK_My_Child_Table_My_Root_Table" 衝突。
衝突發生在資料庫 "DannyChang",資料表 "dbo.My_Root_Table", column 'Uid'。
陳述式已經結束。

參考:
停用條件約束和觸發程序