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

Posted

技术标签:

【中文标题】mysql存储过程,选择最大值并插入值并分配给变量【英文标题】:mysql stored procedure, select max value and insert the value and assign to variable 【发布时间】:2020-07-04 15:00:18 【问题描述】:

我正在将一个 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),然后运行不同查询的其他线程添加了一条新记录,当我到达插入时,该值已经是错误的。 在 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 条有效记录,

【问题讨论】:

【参考方案1】:

评论有点长。

因此将数据类型更改为auto_increment。当数据库基本上为您完成时,无需在触发器中重新实现此逻辑。

如果您担心差距,那么在查询表时只需使用row_number() over (order by seq)

【讨论】:

好吧,我不能为此列使用自动增量,因为在某些情况下,该列可以是相同的值,因为它不是唯一的。例如,一列是“状态”,如果它是有效的或用于记录保存的旧值,则仅更新该列。我的示例可能是错误的,因为它应该是自动递增的“序列”,但我真正的 SP 以不同的方式使用它。我更新了我原来的帖子

以上是关于mysql存储过程,选择最大值并插入值并分配给变量的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 带有更新和插入的过程中最后一次选择的输出

如何将选择结果分配给变量?

MySQL存储过程循环遍历变量并插入临时表

在Mysql数据库中插入动态选择框值并显示数据提交消息

访问数据库表中的值,并把它们作为一个参数,在MySQL存储过程

从 coredata 中过滤值并分配给 tableview