繁体   English   中英

mysql 存储过程,select 最大值并插入值并分配给变量

[英]mysql stored procedure, select max value and insert the value and assign to variable

我正在将一个 MSSQL 存储过程移植到 MYSQL 并且我有一个执行此操作的存储过程。

  1. 通过 select Max 获取表中的最后一个值。

  2. 将新值添加到表中(连同其他记录

  3. 获取最后一个值并将其存储在变量中以供其他处理

到目前为止,我有以下内容

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM