我有一个表,可以包含一些有效的重复值,因此我需要一个附加列,其中包含所述重复项的出现序列号以供将来使用。 样本可能是
ROW | COLUMN_A | COLUMN_B | COLUMN_C | SEQ_NUM <= Want this column
1 A B 1 1
2 A B 1 2
3 A B 2 1
4 A B 2 2
5 A B 2 3
这些值应该是唯一的,如(COLUMN_A, COLUMB_B, COLUMN_C)
,但我不能使用唯一索引,因为我也需要这些重复的值,我只需要跟踪显现的顺序。因此,我添加了一列 SEQ_NUM
来跟踪这些重复。
我这样填写:
begin
declare done boolean default false;
declare _A varchar(1);
declare _B varchar(1);
declare _C integer unsigned;
declare cur cursor for
select COLUMN_A , COLUMN_B , COLUMN_C
from tmp_horario
group by COLUMN_A , COLUMN_B , COLUMN_C
having count(*) > 1; -- Here I loop throught the repeated values
declare continue handler for not found set done := true;
open cur;
loop_dup: loop
fetch cur into _A, _B, _C;
if done then
leave loop_dup;
end if;
set @_seq = 0; -- I initialize my sequence in 0 to start
update tmp_table h
set h.SEQ_NUM = (@_seq := @_seq + 1) -- Set the next sequential to the repeated values
where h.COLUMN_A = _A
and h.COLUMN_B = _B
and h.COLUMN_C = _C;
end loop loop_dup;
close cur;
end;
注意:该表有更多的列,这使得游标(获取)变得更加困难。 正如你所看到的,它的工作原理就像魅力一样,只是它需要我的商店从 20 秒到 80 秒,我觉得有点令人失望(已经检查了索引并且它们正在正确使用),我相信问题在于光标的使用。
我的问题是:有没有一种方法可以在没有光标的情况下在单个查询中设置那个著名的序列号?
最佳答案
假设您希望在向表中插入值时发生这种情况,您可以这样做:
INSERT INTO tmp_horario(COLUMN_A, COLUMN_B, COLUMN_C, SEQ_NUM)
VALUE(A_VAL, B_VAL, C_VAL, (IFNULL((
SELECT MAX(SEQ_NUM)
FROM tmp_horario AS a
WHERE a.COLUMN_A = A_VAL AND a.COLUMN_B = B_VAL AND a.COLUMN_C = C_VAL), 0)+1));
基本前提是查找具有相同值的行,如果存在,则获取最大顺序值,然后为新值加一。如果未找到匹配项,则将插入值设置为 1。如果您需要调整此查询,IFNULL
语句实际上就是获取 SEQ_NUM 所需的全部内容。
关于mysql - 如何在mysql中添加无光标的序号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45227056/