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. 使用多個(gè) 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. 使用臨時(shí)表方式
-- 創(chuàng)建臨時(shí)表
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();
-- 刪除臨時(shí)表
DROP TEMPORARY TABLE temp_updates;
5. 使用 INSERT … ON DUPLICATE KEY UPDATE
適用于主鍵或唯一索引沖突時(shí)的更新:
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. 使用存儲(chǔ)過程進(jìn)行復(fù)雜批量更新
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)用存儲(chǔ)過程
CALL BatchUpdateUsers();
性能優(yōu)化建議
- 添加索引:在 WHERE 條件的字段上添加索引
- 分批處理:大量數(shù)據(jù)時(shí)建議分批更新
- 事務(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;
注意事項(xiàng)
- 批量更新前建議先備份數(shù)據(jù)
- 在生產(chǎn)環(huán)境執(zhí)行前先在測(cè)試環(huán)境驗(yàn)證
- 注意 WHERE 條件,避免誤更新
- 大量數(shù)據(jù)更新時(shí)考慮在業(yè)務(wù)低峰期執(zhí)行
選擇哪種方法取決于具體需求、數(shù)據(jù)量和性能要求。CASE WHEN 方式通常是最常用且性能較好的選擇。
到此這篇關(guān)于MySQL中批量更新數(shù)據(jù)的幾種常用方法的文章就介紹到這了,更多相關(guān)MySQL批量更新數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql優(yōu)化的重要參數(shù) key_buffer_size table_cache
MySQL服務(wù)器端的參數(shù)有很多,但是對(duì)于大多數(shù)初學(xué)者來說,眾多的參數(shù)往往使得我們不知所措,但是哪些參數(shù)是需要我們調(diào)整的,哪些對(duì)服務(wù)器的性能影響最大呢2016-05-05
MySQL 查詢結(jié)果以百分比顯示簡單實(shí)現(xiàn)
用到了MySQL字符串處理中的兩個(gè)函數(shù)concat()和left()實(shí)現(xiàn)查詢結(jié)果以百分比顯示,具體示例代碼如下,感興趣的朋友可以學(xué)習(xí)下2013-07-07
MySQL 使用SQL語句修改表名的實(shí)現(xiàn)
這篇文章主要介紹了MySQL 使用SQL語句修改表名的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
MySQL主從架構(gòu)中的Seconds_Behind_Master指標(biāo)問題解析
Seconds_Behind_Master 是 MySQL 提供的一個(gè)延遲指標(biāo),但其計(jì)算方式?jīng)Q定了它并不能完全反映真實(shí)延遲,本文給大家介紹MySQL主從架構(gòu)中的Seconds_Behind_Master指標(biāo)問題,感興趣的朋友跟隨小編一起看看吧2025-09-09
mysql的MVCC多版本并發(fā)控制的實(shí)現(xiàn)
這篇文章主要介紹了mysql的MVCC多版本并發(fā)控制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

