- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个数据库表,我需要确保某些列在一起始终是唯一的。我目前使用这样的唯一约束:
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)
,这会导致哈希列变得非常大。
最佳答案
不,哈希值并不总是唯一的。发生哈希冲突。
这似乎是一个奇怪的要求。通常可以在表中的列子集上创建键。
绕过 16 列限制的通用解决方案是创建一个计算列,将所有列与数据中不太可能出现的某个分隔符连接起来,然后在其上创建唯一索引。这与您链接的问题所建议的基本相同。
但是索引键总体有 900 字节的限制。如果您需要支持任意列长度(包括可能超过此值的 varchar(max)),那么您无法使用声明性约束来做到这一点,并且需要一些过程代码。你能做的最好的事情就是创建一个散列和一个非唯一索引,然后让你的插入过程检查任何散列重复项,看看它们是否实际上是真正的重复项(可能发生在触发器中,以确保它始终被检查或 ETL 过程)本身 - 这可能会更有效)。
如果您在触发器中执行此操作,它将有助于向表中添加标识列。那么识别重复项的代码就是。
SELECT *
FROM Inserted I
JOIN BaseTable B ON I.HashValue = B.HashValue AND I.Id<> B.Id
/* check remaining columns to see if actual differences exist in null safe way
http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons.aspx
*/
AND EXISTS (SELECT B.Col1, B.Col2
INTERSECT
SELECT I.Col1, I.Col2)
如果上面返回任何行,则您有违规并且可以回滚事务。
关于sql - 向超过 16 列的唯一行添加约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36908139/
我正在 csv 上使用 hadoop 来分析一些数据。我使用sql/mysql(不确定)来分析数据,现在陷入了僵局。 我花了好几个小时在谷歌上搜索,却没有找到任何相关的东西。我需要一个查询,在该查询中
我正在为 Bootstrap 网格布局的“简单”任务而苦苦挣扎。我希望在大视口(viewport)上有 4 列,然后在中型设备上有 2 列,最后在较小的设备上只有 1 列。 当我测试我的代码片段时,似
对于这个令人困惑的标题,我深表歉意,我想不出这个问题的正确措辞。相反,我只会给你背景信息和目标: 这是在一个表中,一个人可能有也可能没有多行数据,这些行可能包含相同的 activity_id 值,也可
具有 3 列的数据库表 - A int , B int , C int 我的问题是: 如何使用 Sequelize 结果找到 A > B + C const countTasks = await Ta
我在通过以下功能编写此查询时遇到问题: 首先按第 2 列 DESC 排序,然后从“不同的第 1 列”中选择 只有 Column1 是 DISTINCT 此查询没有帮助,因为它首先从第 1 列中进行选择
使用 Bootstrap 非常有趣和有帮助,目前我在创建以下需求时遇到问题。 “使用 bootstrap 在桌面上有 4 列,在平板电脑上有 2 列,在移动设备上有 1 列”谁能告诉我正确的结构 最佳
我是 R 新手,正在问一个非常基本的问题。当然,我在尝试从所提供的示例中获取指导的同时做了功课here和 here ,但无法在我的案例中实现这个想法,即可能是由于我的问题中的比较维度更大。 我的实
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个 df , delta1 delta2 0 -1 2 0 -1 0 0 0 我想知道如何分配 delt
您好,我想知道是否可以执行以下操作。显然,我已经尝试在 phpMyAdmin 中运行它,但出现错误。也许还有另一种方式来编写此查询。 SELECT * FROM eat_eat_restaurants
我有 2 个列表(标题和数据值)。我想要将数据值列 1 匹配并替换为头文件列 1,以获得与 dataValue 列 1 和标题值列 2 匹配的值 头文件 TotalLoad,M0001001 Hois
我有两个不同长度的文件,file2 是一个很大的引用文件,我从中提取文件 1 的数据。 我有一行 awk,我通常会对其进行调整以在我的文件中进行查找和替换,但它总是在同一列中进行查找和替换。 所以对于
假设我有两个表,如下所示。 create table contract( c_ID number(1) primary key, c_name varchar2(50) not
我有一个带有 varchar 列的 H2 表,其检查约束定义如下: CONSTRAINT my_constraint CHECK (varchar_field <> '') 以下插入语句失败,但当我删
这是最少量的代码,可以清楚地说明我的问题: One Two Three 前 2 个 div 应该是 2 个左列。第三个应该占据页面的其余部分。最后,我将添加选项来隐藏和
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我有一个包含 28 列的数据库。第一列是代码,第二列是名称,其余是值。 public void displayData() { con.Open(); MySqlDataAdapter
我很沮丧:每当我缩小这个网页时,一切都变得一团糟。我如何将网页居中,以便我可以缩小并且元素不会被错误定位。 (它应该是 2 列,但所有内容都合并为 1)我试过 但由于某种原因,这不起作用。 www.o
我是一名优秀的程序员,十分优秀!