我正在将一个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条有效记录,
1条答案
按热度按时间2j4z5cfb1#
这是一个有点长的评论。
所以将数据类型改为
auto_increment
. 当数据库基本上为您执行此操作时,不需要在触发器中重新实现此逻辑。如果你担心差距,那就用
row_number() over (order by seq)
当您查询表时。