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