mysql - 如何在mysql中添加无光标的序号?

标签 mysql stored-procedures

我有一个表,可以包含一些有效的重复值,因此我需要一个附加列,其中包含所述重复项的出现序列号以供将来使用。 样本可能是

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/

相关文章:

mysql - 减少 Linux 服务器上磁盘 IO 的最佳方法

sql - 如何在mysql中基于类似连接2个表

stored-procedures - 如何遍历引用虚拟图的 SPARQL 查询?

MySQL:错误代码:1064。创建过程时

mysql - SQL 存储过程变量

php - 使用 PHP 显示表中的记录

java - Hibernate事务查询

mysql - 为 JSON API 构建 SQL 请求

sql - View 和存储过程之间是否存在性能差异

Java - 无法从 MySQL StoredProcedure 返回/访问结果集