這是我的表:創建唯一約束最初禁用
CREATE TABLE [dbo].[TestTable]
(
[Name1] varchar(50) COLLATE French_CI_AS NOT NULL,
[Name2] varchar(255) COLLATE French_CI_AS NULL,
CONSTRAINT [TestTable_uniqueName1] UNIQUE ([Name1]),
CONSTRAINT [TestTable_uniqueName1Name2] UNIQUE ([Name1], [Name2])
)
ALTER TABLE [dbo].[TestTable]
ADD CONSTRAINT [TestTable_uniqueName1]
UNIQUE NONCLUSTERED ([Name1])
ALTER TABLE [dbo].[TestTable]
ADD CONSTRAINT [TestTable_uniqueName1Name2]
UNIQUE NONCLUSTERED ([Name1], [Name2])
GO
ALTER INDEX [TestTable_uniqueName1]
ON [dbo].[TestTable]
DISABLE
GO
我的想法是使/取決於客戶應用禁用一個或其他唯一contraint。通過這種方式,我可以捕捉到我的c#代碼中拋出的異常,並向GUI顯示特定的錯誤消息。現在
,我的問題是改變列Name1
& Name2
的整理,我需要讓他們區分大小寫(French_CS_AS
)。要改變這些字段,我必須刪除這兩個約束並重新創建它。根據解釋的模式,我不能創建一個啓用的約束,然後禁用它,因爲有些客戶,我有一個或其他約束的重複鍵。
對於我的更新腳本,我的想法號碼1是
- 保存在臨時表
- 降啓用的約束的約束
- 阿爾特列
- 創建禁用唯一約束名稱
- 根據保存的值以點1啓用特定約束。
我的問題是在第4點,我找不到如何使用ALTER TABLE
語句創建禁用的唯一約束。是否有可能直接在sys.indexes
表中創建它?
我的想法號2是
- 重命名TestTable的到TestTableCopy
- 重新創建TestTable的新欄整理,否則相同的架構(索引,FK,觸發器,...)
- 禁用在TestTable的特異性目的唯一約束上
- 從TestTableCopy數據遷移到TestTable的
- 降TestTableCopy
以這種方式,我擔心的是鬆散與其他表/相關性的鏈接,因爲它是我數據庫中的中心表。
有沒有其他辦法可以實現我的目標?
如有必要,我可以使用唯一索引而不是唯一約束。
爲什麼不能忘記Unique約束並檢查自己並在向表中添加記錄時捕獲異常? – CiucaS
因爲可以從多種方式插入記錄(使用t-sql,從我的c#應用程序中...)。我希望數據庫檢查我的數據。 – stephanejulien
創建存儲過程以將記錄插入到表中,可以將它用於所有需要的插入類型。在存儲過程中,根據需要檢查約束。那將是我會這樣做的方式。改變表格不是一個好習慣。 – CiucaS