我正在尋找更新多行的最佳方法。我有大量的記錄和資料,必須每天更新。
資料樣本 table_user 作為 t:
| 用戶 | 平衡 | 成本 | 用過的 |
|---|---|---|---|
| 一個 | 100 | 30 | 60 |
| 乙 | 50 | 60 | 120 |
| C | 20 | 10 | 60 |
通常在單個查詢中它是這樣的:
UPDATE `t` SET `balance` = `balance` - 30, `used` = `used` 30 WHERE `user` = 'A' AND `balance` - 30 > 0;
UPDATE `t` SET `balance` = `balance` - 60, `used` = `used` 60 WHERE `user` = 'B' AND `balance` - 60 > 0;
UPDATE `t` SET `balance` = `balance` - 10, `used` = `used` 10 WHERE `user` = 'C' AND `balance` - 10 > 0;
用戶 A 和 C 的記錄將被更新,而 B 的記錄將不會更新,因為余額不足。
我見過使用 CASE WHEN 的例子,但通常,它只是更新一個欄位。有沒有更好的方法來同時更新行而不干擾資料庫可能發生的其他事務?我使用單個查詢,回圈和執行需要太多時間。
uj5u.com熱心網友回復:
您必須將資料作為行集提供并使用多表 UPDATE:
UPDATE t
JOIN ( SELECT 'A' AS user, 30 AS balance_change
UNION ALL
SELECT 'B', 60
UNION ALL
SELECT 'C', 10 ) AS t1 USING (user)
SET t.balance = t.balance - t1.balance_change,
t.used = t.used t1.balance_change
WHERE t.balance >= t1.balance_change;
當然,您可以將資料作為實心文字以序列化形式(CSV、JSON 等)提供,并將其決議為子查詢中的行集。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507706.html
標籤:mysql
上一篇:SQL-如何計算行中的某個字符
下一篇:如何在多表查詢中使用組合主鍵
