[英]Best way to check for duplicated records
我有两个表A
和B
,关系从A
到B
一对多。
A有5列:
a1, a2, a3, a4, a5
B有5列
b1, b2, b3, b4, a1.
注意a1
是表B中的外键。
我有一个要求检查表中的重复记录,即所有属性的任何两个记录都不应具有完全相同的值。
我能想到的最有效的方法是确定它们的唯一性,方法是创建一个校验和类型的值并将其保留在表A的每一行中。但这需要额外的空间,而且我将必须确保校验和确实是唯一的。
这是前进的最佳方式,还是我不知道其他方式?
例如,假设表A
是Rules
表,表B
是Trigger
表。 现在, Rules
表记录了由不同用户创建的各种规则(这意味着将在Rules
表中映射到Users
表)。 现在,我真正想要的是用户不应该能够创建相同的规则。 因此,当用户保存规则时,我将运行查询以检查是否有针对该特定用户的相同校验和的记录(如果是),然后给出适当的错误,否则我将让用户创建该记录。我想这清楚了为什么我可以•对所有记录施加唯一约束。
使用GROUP BY子句执行SELECT。 例如:
SELECT a1, a2, a3, a4, a5, COUNT(*) FROM #TempPersons GROUP BY a1, a2, a3, a4, a5 HAVING COUNT(*) > 1;
这将返回a1,a2,a3,a4,a5的结果以及该值出现多少次的计数
在这些列上具有UNIQUE约束似乎是可行的方法。
但是,仅是为了回答您的其他意见:我以前使用过额外的列来检查过去的更改。 那时我做了类似的事情:
CONVERT([NVARCHAR](42),HASHBYTES('SHA1',CONCAT(Column1, '||', Column2, ...),(1))
我发现这是将许多列合并为单个哈希的一种不错的方法,根据其内容而唯一,并且不会超出比例。 (我在数据仓库环境中使用了此功能,用于根据业务密钥检查大型表的记录级别更改。将其存储为PERSISTED列,以允许索引也基于此键运行)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.