MySQL - 在单独的列中跟踪重复记录类型
Posted
技术标签:
【中文标题】MySQL - 在单独的列中跟踪重复记录类型【英文标题】:MySQL - Keeping track of duplicate record types in a separate column 【发布时间】:2020-07-22 15:46:22 【问题描述】:我有一个名为test
的表,其中包含name
、sequence_no
、id1
和id2
字段(其中最后两个是外键)。当我插入一条新记录时,我想检查表中有多少条目具有与我添加的条目相同的id1
和id2
,然后我想使用该 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 - 在单独的列中跟踪重复记录类型的主要内容,如果未能解决你的问题,请参考以下文章