【发布时间】:2016-04-28 07:31:59
【问题描述】:
我有几个数据库表,我需要确保某些列始终是唯一的。我目前使用这样的唯一约束:
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 列的表上创建约束时,我得到了这个错误:
表 'dbo.MyTable' 上的索引 '' 在键列表中有 52 列。 索引键列列表的最大限制为 16。无法创建 约束或索引。查看以前的错误。
所以现在我正在寻找另一种解决方案。我的 SQL 知识仅限于查询数据库,而不是约束,所以请耐心等待。 :)
我的问题是:如何确保我的表中没有行是重复的(基于选定的列数)?即使超过 16 列?
表可以有不同的列数,列可以是不同的数据类型。
我见过this question 并且喜欢哈希替代方案。但是当我有 50 多列和数百万行时,它会起作用吗?
基于 cmets 的更新:
这些表用于存储导入文件中的数据。我不知道文件的大小或它们有多少列。它是在计划的工作中完成的,因此有关创建表的性能问题并不是很重要。数据必须是持久的,但是实际上只需要约束来确保对于每个插入,没有行应该是重复的。一列理论上可能有varchar(max),这会导致哈希列变得非常大。
【问题讨论】:
-
这是一个很好的问题。我的第一个想法也是计算列。使用该列或散列列,它将获得相当长的数据长度,这是您必须考虑的事情,以确定您是否可以节省处理所述列的成本。您是否需要每次都在运行中创建这些表,是否有一种方法可以将这些表保存在 SQL 中,即使它只是数据结构?
-
@RichBenner - 感谢您的评论。我已经编辑了我的问题。是的,如果这些表不存在,它们将即时创建。但是一旦创建,它们可以在几年内进行多次插入。
标签: sql sql-server sql-server-2008 constraints