提问者:小点点

mysql存储过程中,选择“最大值”,然后插入值并赋值给变量


我正在将一个MSSQL存储过程移植到MYSQL,并且我有一个存储过程可以做到这一点。

>

  • 通过选择“最大值”获取表中的最后一个值。

    将新值添加到表中(与其他记录一起

    获取最后一个值并将其存储在一个变量中以便进行其他处理

    到目前为止,我有以下几点

         DECLARE lastSeq INT Default 0;
    
         SELECT max(seq) INTO lastSeq from mytable;
    
         Set newSeq = lastSeq + 1;    
         insert into mytable (seq, value1, value2, value3) values (newSeq, 1, 2, 3);
    

    不幸的是,这不是线程安全的,比方说,如果我选择max(seq),然后运行不同查询的其他线程添加了一个新记录,那么当我到达insert时,该值已经是错误的。 在MSSQL中,我通过在查询max(seq)期间锁定表来实现这一点。

    但是

    MYSQL不允许锁定存储过程中的表,因此我不能直接移植该方法。 在搜索的时候还没有找到解决方案,可能我没有把正确的关键词放在搜索中。

    如何在MYSQL存储过程中实现线程安全?


  • 共1个答案

    匿名用户

    这是一个有点长的评论。

    因此将数据类型更改为auto_increment。 没有必要在触发器中重新实现这个逻辑,当数据库基本上为您完成它时。

    如果您关心间隙,那么只需在查询表时使用row_number()over(order by seq)即可。

    相关问题