mysql存储过程,选择max value并插入值并赋值给变量

fcy6dtqo  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(380)

我正在将一个mssql存储过程移植到mysql,我有一个存储过程可以做到这一点。
通过选择max获取表中的最后一个值。
将新值添加到表中(与其他记录一起
获取最后一个值并将其存储在变量中以供其他处理
到目前为止,我有以下几点

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线程安全的内部存储过程中做到这一点?
更新:我不能对这个列使用auto\ u increment,因为这个列不是唯一的,我们允许重复,也许我的示例是错误的,因为我使用了“sequence”,它应该是auto increment,但是在我的实际代码中,我将它用于允许重复的另一个列。
例子;

record id userid     name  seq   status
     1      1      adam   1     A
     2      1      adam   2     C
     3      2      Bob    1     C

在上面的记录中,我们有两个adam记录,但只有一个有效的设置为“c”作为当前值,“a”作为存档或旧值。所以我的表有2条有效记录,

2j4z5cfb

2j4z5cfb1#

这是一个有点长的评论。
所以将数据类型改为 auto_increment . 当数据库基本上为您执行此操作时,不需要在触发器中重新实现此逻辑。
如果你担心差距,那就用 row_number() over (order by seq) 当您查询表时。

相关问题