检测哪个字段导致重复

Posted

技术标签:

【中文标题】检测哪个字段导致重复【英文标题】:Detect which field is causing duplicates 【发布时间】:2021-09-04 23:51:28 【问题描述】:

我正在设计一个表格,在测试过程中发现其中一个字段导致重复行(它不应该)。

作为预防措施,我想排除在任何其他字段中可能出现的重复项。我将如何检查我的哪一列导致重复 PK?

直观的方法:

Select 
    count(*),  
    pk_field,  
    other_field1 
from  
    table 
group by  
    pk_field,  
    other_field 
having  
    count(*) > 1  
    and count(distinct other_field1) >1;

我想确保如果我运行此查询,它将 100% 排除由 other_field1 引起的重复项(对于每个 PK 值只有一个 other_field1 值)。

额外奖励:是否有一个查询可以直接向我显示哪些字段导致重复行,而无需对表中的每个字段进行一次查询?

非常感谢!

编辑:为清楚起见,不会强制执行 PK,并且该表实际上是第三方系统中的视图

【问题讨论】:

如果您按 pk_field AND other_field 分组,count (distinct other_field) 将始终为 1。您是否尝试使用一些示例数据运行查询?您不能将您的表的主键设置为与“其他表”相同,并让您的 DBMS 为您强制执行唯一性吗? 如果 PK 不是唯一的,则它不是主键。 (以及如何执行 PK?) 样本数据和期望的结果会有所帮助。您的代码永远不会返回任何行。 重复不是由fileds引起的,而是由rows引起的。看来如果你遇到两行有(1,A,B,C)(1,A,B,D),你想责备第四列。但是,如果您看到(1,A,B,C)(1,A,B,C),您将不得不考虑该怎么做。第一个想法是识别重复的IDs - 这是相当微不足道的...... 谢谢@MarmiteBomber,就是这样,我正在尝试编写一个查询,它将向我显示所有导致重复行的字段(=列)并找到它们的 ID。这对我来说不是微不足道的,因为我对这种操作有点陌生。一旦我确定了错误定义的字段或列,我就可以找到重复的功能(业务)原因并解决。理想情况下,我希望有一个查询可以一次检查所有列,但这是可选的 【参考方案1】:

在我看来,应该强制执行主键,并且(pk_field, other_field) 上应该有一个唯一索引。此外,other_field 应该是 NOT NULL(这样您就不会对相同的 pk_field 产生“重复”,而是为空的 other_field

这样做,数据库将自己处理您的问题。


如果你想自己做,那么你能做什么?一个看法?第三方系统?你对整个过程有什么样的控制?如果你能做的就是找到“重复”,那就有点太晚了

【讨论】:

感谢您的回复。事实上,这并不是很清楚:我正忙于定义视图应该如何。这是分析阶段。 PK 和索引将在该过程的稍后阶段实施。目前,我知道我得到了重复的行,我想找出在我的查询中错误定义了哪一列,以便我可以调整该列的功能定义以匹配 PK 的粒度。我在这样做时遇到了麻烦

以上是关于检测哪个字段导致重复的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 检测重复的字段

JQuery:检测输入字段的变化[重复]

MYSQL插入数据INSERT INTO时如何检测某字段重复后再决定是不是执行?

在字段中查找重复值会导致多行相同的值

设置在重复输入尝试唯一字段时导致 php 错误?

多对多字段上的 order_by 导致查询集中的重复条目