MySQL - 在单独的列中跟踪重复记录类型

Posted

技术标签:

【中文标题】MySQL - 在单独的列中跟踪重复记录类型【英文标题】:MySQL - Keeping track of duplicate record types in a separate column 【发布时间】:2020-07-22 15:46:22 【问题描述】:

我有一个名为test 的表,其中包含namesequence_noid1id2 字段(其中最后两个是外键)。当我插入一条新记录时,我想检查表中有多少条目具有与我添加的条目相同的id1id2,然后我想使用该 count+1 作为 sequence_no 字段。换句话说,我想跟踪我进行了多少次测试,并且由两个 id 标识。

我试图在我的插入中简单地做一个sequence_no = (select count(*)+1 from test where id1=newid1 and id2=newid2),但我想我无法从我要插入的表格中选择。

关于如何在单个查询中执行此操作的任何想法?我觉得我应该使用 ON DUPLICATE,但我不知道如何解决这个问题。

【问题讨论】:

如果你想添加一个new行,那么on duplicate key update是不合适的。你需要一个触发器。但是,这些信息通常可以在您查询时计算出来。 【参考方案1】:

如果您不想创建具有相同(id1, id2) 的新行,而是在现有行上增加sequence_no,那么您可以使用on duplicate key

insert into test (name, sequence_no, id1, id2)
values ( -- your values here --)
on duplicate key update sequence_no = sequence_no + 1

这需要(id1, id2) 上的唯一键(或主键约束)。

另一方面,如果您想要一些递增计数器来指示满足相同 id 元组的次数,那么它就不同了。我真的不建议将此信息存储在表中,您可以在查询中动态计算它,通常使用窗口函数row_number()(在 mysql 8.0 中可用)。为此,您需要一个定义列顺序的列(例如ordering_id),然后您可以这样做:

select name, id1, id2, row_number() over(partition by id1, id2 order by ordering_id) sequence_no
from test

【讨论】:

以上是关于MySQL - 在单独的列中跟踪重复记录类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在postgresql的列中针对单个记录选择多个值[重复]

需要 SQL 在不同的列中查找具有重复值的记录

MYSQL在由另一列排序的列中选择特定数量的重复值

mysql-冗余和重复索引

根据值的数量将熊猫列拆分为多个单独的列[重复]

MySQL查询将分隔字符串值拆分为单独的列[重复]