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存储过程,选择最大值并插入值并分配给变量的主要内容,如果未能解决你的问题,请参考以下文章