我有幾個數據庫表,我需要確保某些列在一起總是唯一的。我目前使用這樣一個獨特的約束:將約束添加到具有多於16列的唯一行中
ALTER TABLE [dbo].[MyTable]
ADD CONSTRAINT [AK_MyTable_Unique_Cols]
UNIQUE NONCLUSTERED ([Field_1] ASC, [Field_2] ASC,
[Field_3] ASC, [FkDeliveryId] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
這裏的表看起來像這樣。請注意Sum不是約束的一部分。
Field_1 | Field_2 | Field_3 | FkDeliveryId | Sum
Foo | Foo | Bar | 1 | 100
Foo | Bar | Bar | 1 | 900
Bar | Foo | Foo | 1 | 400
Bar | Foo | Bar | 2 | 800 // Not unique
Foo | Foo | Bar | 2 | 600
Bar | Foo | Bar | 2 | 300 // Not unique
但問題是,表格是通過C#動態創建的,一些表格將有超過16列。所以,當我試圖與52列的表創建約束我得到這個錯誤:
The index '' on table 'dbo.MyTable' has 52 columns in the key list. The maximum limit for index key column list is 16. Could not create constraint or index. See previous errors.
所以現在我正在尋找另一種解決方案。我的SQL知識僅限於查詢數據庫,而不是限制,請耐心等待。 :)
我的問題是:我如何確保我的表中沒有行是重複的(基於選定的列數)?即使有超過16列?
表可以有不同數量的列,並且列可以是不同的數據類型。
我見過this question和散列替代。但是,如果我有50列和數百萬行,它會起作用嗎?
更新基於評論:
的表用於存儲從被導入的文件數據。我不知道文件的大小或它們有多少列。這是在一個預定的工作中完成的,所以關於創建表的性能問題並不是非常重要。數據必須是持久的,但是約束實際上只是爲了確保每個插入都不應該是重複的。理論上列可能有varchar(max)
,這會導致哈希列變得非常大。
這是一個很好的問題。我的第一個想法也是一個計算列。無論是那個或是一個哈希列,它都會達到相當長的數據長度,這是你必須考慮的問題,你是否可以節省處理該列的成本。你是否需要隨時創建這些表,是否沒有一種方法可以將它們存儲在SQL中,即使它只是數據結構? –
@RichBenner - 感謝您的評論。我編輯了一下我的問題。是的,如果表格不存在,它們將在飛行中創建。但一旦創建,它們可以在幾年內進行多次插入。 – smoksnes