[英]mysql stored procedure, select max value and insert the value and assign to variable
我正在将一个 MSSQL 存储过程移植到 MYSQL 并且我有一个执行此操作的存储过程。
通过 select 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);
不幸的是,这不是线程安全的,比如说如果我 select max(seq) 然后运行不同查询的其他线程添加了一条新记录,当我到达插入时,该值已经是错误的。 在 MSSQL 中,我通过在查询 max(seq) 期间锁定表来做到这一点。
但
MYSQL 不允许在存储过程中锁定表,所以我不能直接移植该方法。 Havent 有幸在搜索时找到解决方案,也许我没有在搜索中放置正确的关键字。
如何在 MYSQL 线程安全的存储过程中执行此操作?
更新:我不能为此列使用 auto_increment,因为该列不是唯一的,我们允许重复,也许我的示例是错误的,因为我使用了应该是自动递增的“序列”,但在我的真实代码中,我将它用于不同的列允许重复。
例子;
record id userid name seq status
1 1 adam 1 A
2 1 adam 2 C
3 2 Bob 1 C
在上面的记录中,我们有 2 条 Adam 记录,但只有一个有效设置为“C”作为当前值,“A”作为存档或旧值。 所以我的表有 2 条有效记录,
这是一个有点长的评论。
所以将数据类型更改为auto_increment
。 当数据库基本上为您完成时,无需在触发器中重新实现此逻辑。
如果您担心差距,那么在查询表时只需使用row_number() over (order by seq)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.