我有几个数据库表,我需要确保某些列在一起总是唯一的。我目前使用这样一个独特的约束:将约束添加到具有多于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