检查重复记录的最佳方法

时间:2016-09-22 12:50:24

标签: mysql sql database-design

我有两个表AB,其关系为AB之间的一对多。

A有5列:

a1, a2, a3, a4, a5 

和B有5列

b1, b2, b3, b4, a1. 

注意a1是表B中的外键。

我要求检查表中的重复记录,即没有两个记录对所有属性都应具有完全相同的值。

我能想到的确定其唯一性的最有效方法是创建一个校验和值的值并将其保存在表A的每一行中。但这需要额外的空间加上我必须确保校验和真的唯一的。

这是继续进行的最佳方式还是还有一些我不知道的其他方式?

例如可以说表ARules表和表BTrigger表。现在Rules表包含由不同用户创建的各种规则的记录。(这意味着将Users表中的Rules表映射。)。现在我真正想要的是用户不应该能够创建相同的规则。因此,当用户保存规则时,我运行查询以检查是否有针对此特定用户的相同校验和的记录,如果是,那么我给出相应的错误,否则我让用户创建记录。我想这清楚了为什么我可以' t对所有记录设置唯一约束。

2 个答案:

答案 0 :(得分:1)

使用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的结果以及该值出现次数的计数

答案 1 :(得分:1)

对这些列有一个UNIQUE约束似乎是要走的路。

然而,仅仅是为了回答你的其他评论:我已经使用额外的列来检查过去的变化。那时我做了类似的事情:

CONVERT([NVARCHAR](42),HASHBYTES('SHA1',CONCAT(Column1, '||', Column2, ...),(1))

我发现将多个列连接成一个哈希是一种相当不错的方法,这取决于它的内容&没有它吹出不成比例。 (我在数据仓库环境中使用它,根据业务密钥检查大型表的记录级别更改。将其存储为PERSISTED列以允许索引在此上运行)。