簡體   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