摘要: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'。
陳述式已經結束。」
參考:
停用條件約束和觸發程序