MySQL中批量更新數(shù)據(jù)的幾種常用方法
本文介紹MySQL中批量更新數(shù)據(jù)的幾種常用方法:
1. 使用 CASE WHEN 語句(推薦)
UPDATE users
SET
status = CASE id
WHEN 1 THEN 'active'
WHEN 2 THEN 'inactive'
WHEN 3 THEN 'pending'
END,
updated_at = CASE id
WHEN 1 THEN '2024-01-01'
WHEN 2 THEN '2024-01-02'
WHEN 3 THEN '2024-01-03'
END
WHERE id IN (1, 2, 3);
2. 使用多個 WHEN THEN 條件
UPDATE products
SET
price = CASE
WHEN id = 1 THEN 19.99
WHEN id = 2 THEN 29.99
WHEN id = 3 THEN 39.99
ELSE price
END,
stock = CASE
WHEN id = 1 THEN 100
WHEN id = 2 THEN 50
WHEN id = 3 THEN 200
ELSE stock
END
WHERE id IN (1, 2, 3);
3. 使用 VALUES 和 JOIN 方式
UPDATE orders o
JOIN (
SELECT 1 as id, 'shipped' as status, '2024-01-01' as ship_date
UNION ALL
SELECT 2, 'processing', '2024-01-02'
UNION ALL
SELECT 3, 'delivered', '2024-01-03'
) AS temp ON o.id = temp.id
SET
o.status = temp.status,
o.ship_date = temp.ship_date,
o.updated_at = NOW();
4. 使用臨時表方式
-- 創(chuàng)建臨時表
CREATE TEMPORARY TABLE temp_updates (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
-- 插入要更新的數(shù)據(jù)
INSERT INTO temp_updates VALUES
(1, '張三', 'zhangsan@email.com'),
(2, '李四', 'lisi@email.com'),
(3, '王五', 'wangwu@email.com');
-- 執(zhí)行批量更新
UPDATE users u
JOIN temp_updates t ON u.id = t.id
SET
u.name = t.name,
u.email = t.email,
u.updated_at = NOW();
-- 刪除臨時表
DROP TEMPORARY TABLE temp_updates;
5. 使用 INSERT … ON DUPLICATE KEY UPDATE
適用于主鍵或唯一索引沖突時的更新:
INSERT INTO users (id, name, email, status, updated_at)
VALUES
(1, '張三', 'zhangsan@email.com', 'active', NOW()),
(2, '李四', 'lisi@email.com', 'inactive', NOW()),
(3, '王五', 'wangwu@email.com', 'active', NOW())
ON DUPLICATE KEY UPDATE
name = VALUES(name),
email = VALUES(email),
status = VALUES(status),
updated_at = NOW();
6. 批量更新相同值
-- 更新所有符合條件的記錄為相同值
UPDATE products
SET
category = 'electronics',
updated_at = NOW()
WHERE id IN (1, 2, 3, 4, 5);
-- 基于條件的批量更新
UPDATE employees
SET
salary = salary * 1.1, -- 漲薪10%
last_raise_date = NOW()
WHERE department = 'Engineering'
AND performance_rating >= 4;
7. 使用存儲過程進行復雜批量更新
DELIMITER //
CREATE PROCEDURE BatchUpdateUsers()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE user_id INT;
DECLARE user_status VARCHAR(20);
DECLARE cur CURSOR FOR SELECT id, status FROM users WHERE status = 'pending';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO user_id, user_status;
IF done THEN
LEAVE read_loop;
END IF;
-- 根據(jù)業(yè)務(wù)邏輯更新
UPDATE users
SET status = 'processed', processed_at = NOW()
WHERE id = user_id;
END LOOP;
CLOSE cur;
END //
DELIMITER ;
-- 調(diào)用存儲過程
CALL BatchUpdateUsers();
性能優(yōu)化建議
- 添加索引:在 WHERE 條件的字段上添加索引
- 分批處理:大量數(shù)據(jù)時建議分批更新
- 事務(wù)控制:使用事務(wù)確保數(shù)據(jù)一致性
START TRANSACTION; UPDATE large_table SET status = 'updated' WHERE id BETWEEN 1 AND 10000; UPDATE large_table SET status = 'updated' WHERE id BETWEEN 10001 AND 20000; COMMIT;
注意事項
- 批量更新前建議先備份數(shù)據(jù)
- 在生產(chǎn)環(huán)境執(zhí)行前先在測試環(huán)境驗證
- 注意 WHERE 條件,避免誤更新
- 大量數(shù)據(jù)更新時考慮在業(yè)務(wù)低峰期執(zhí)行
選擇哪種方法取決于具體需求、數(shù)據(jù)量和性能要求。CASE WHEN 方式通常是最常用且性能較好的選擇。
到此這篇關(guān)于MySQL中批量更新數(shù)據(jù)的幾種常用方法的文章就介紹到這了,更多相關(guān)MySQL批量更新數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DBeaver連接mysql和oracle數(shù)據(jù)庫圖文教程
DBeaver是一款免費的數(shù)據(jù)庫管理工具,支持多種數(shù)據(jù)庫,包括MySQL,下面這篇文章主要給大家介紹了關(guān)于DBeaver連接mysql和oracle數(shù)據(jù)庫的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-05-05
mysql和oracle默認排序的方法 - 不指定order by
這篇文章主要介紹了mysql和oracle默認排序的方法 - 不指定order by。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
登錄mysql報錯Can‘t connect to MySQL server&n
這篇文章主要給大家介紹了登錄mysql報錯 Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)解決方法,文中有詳細的解決步驟,需要的朋友可以參考下2023-09-09
mysql日期函數(shù)TO_DAYS()函數(shù)的詳細講解
在SQL中我們經(jīng)常需要根據(jù)時間字段查詢數(shù)據(jù),今天用到一個好用的時間字段,用來查詢一整天的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于mysql日期函數(shù)TO_DAYS()函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-08-08
sql腳本函數(shù)編寫postgresql數(shù)據(jù)庫實現(xiàn)解析
這篇文章主要介紹了sql腳本函數(shù)編寫postgresql數(shù)據(jù)庫實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09
解決mysql數(shù)據(jù)庫數(shù)據(jù)遷移達夢數(shù)據(jù)亂碼問題
最近接手一個java項目,需要進行重構(gòu),使用國產(chǎn)數(shù)據(jù)庫達夢8替換mysql數(shù)據(jù)庫需要滿足這個要求,在遷移過程中遇到mysql數(shù)據(jù)庫數(shù)據(jù)遷移達夢數(shù)據(jù)亂碼問題,怎么解決呢,下面把過程分享給大家一起看看吧2021-08-08
MySQL?根據(jù)多字段查詢重復數(shù)據(jù)的示例代碼
本文介紹了如何使用 MySQL 根據(jù)多個字段查詢重復數(shù)據(jù),我們介紹了如何根據(jù)多個字段查詢重復數(shù)據(jù),并提供了相應(yīng)的代碼示例,通過這些方法,我們可以快速準確地找到和處理重復數(shù)據(jù),提高數(shù)據(jù)庫的數(shù)據(jù)質(zhì)量,需要的朋友可以參考下2023-11-11

