新聞中心
我們都知道MYSQL中批量插入非常簡(jiǎn)單,那么批量更新呢?

站在用戶的角度思考問題,與客戶深入溝通,找到西豐網(wǎng)站設(shè)計(jì)與西豐網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋西豐地區(qū)。
1.IN
IN 語(yǔ)句有比較大的局限性,更新后的結(jié)果必須一致。比如下面是將所有滿足條件的行的狀態(tài)(status)設(shè)置為1。
如果想部分設(shè)置為1,部分設(shè)置為2等,則無法實(shí)現(xiàn),或者通過寫多條SQL語(yǔ)句實(shí)現(xiàn)。
Update users Set status=1 Where account IN ('xx1', 'xx2');2. For + Update
借助 For 循環(huán) + Update 語(yǔ)句,即逐一更新,優(yōu)點(diǎn)是清晰直觀,適用于大部分情況,不易出錯(cuò)。缺點(diǎn)是性能較差,容易造成堵塞。
如果是在MYSQL客戶端執(zhí)行,這種方法很不方便。一般需要生成多條Update語(yǔ)句,或者可以用存儲(chǔ)過程實(shí)現(xiàn)。
3. Insert into…on duplicate key update
利用主鍵(或唯一鍵)的唯一性進(jìn)行更新的好處是支持批量更新,更新結(jié)果不需要保持一致。缺點(diǎn)是一般第三方庫(kù)不支持這種語(yǔ)法,需要寫原生SQL,所有字段必須有默認(rèn)值(包括NULL)。
create table users
(
id int(11) PRIMARY KEY AUTO_INCREMENT,
name varchar(255) NOT NUll DEFAULT '',
age smallint,
job varchar(255)
);
INSERT INTO go_business.users (id, name, age, job) VALUES (1, 'name1', 1, 'job1');
INSERT INTO go_business.users (id, name, age, job) VALUES (2, 'namw2', 2, 'job2');
INSERT INTO go_business.users (id, name, age, job) VALUES (3, 'name3', 3, 'job3');
INSERT INTO go_business.users (id, name, age, job) VALUES (4, 'name4', 4, 'job4');
INSERT INTO go_business.users (id, name, age, job) VALUES (5, 'name5', 5, 'job5');
mysql> insert into users (id, job, age) values (1, 'job11', 11),(2, 'job22', 22)
on duplicate key update job=values(job), age=values(age);
mysql> select * from users where id in (1, 2);
+----+-------+------+-------+
| id | name | age | job |
+----+-------+------+-------+
| 1 | name1 | 11 | job11 |
| 2 | namw2 | 22 | job22 |
+----+-------+------+-------+
4. Replace into
眾所周知,它是一個(gè)替換,相當(dāng)于一個(gè) update。語(yǔ)法類似于第三種方法,但比第三種方法更危險(xiǎn),因?yàn)楦聲r(shí)如果字段不完整,未覆蓋的字段將被設(shè)置為默認(rèn)值。
replace into users(id, job, age) VALUES (1, 'job111', 111),(2, 'job222', 222);
mysql> select * from users where id in (1, 2);
+----+------+------+--------+
| id | name | age | job |
+----+------+------+--------+
| 1 | | 111 | job111 |
| 2 | | 222 | job222 |
+----+------+------+--------+
2 rows in set (0.00 sec)
原因是 replace into 操作的本質(zhì)是先刪除重復(fù)記錄再插入,所以如果更新的字段不完整,缺失的字段會(huì)被設(shè)置為默認(rèn)值,而 insert into 只是更新重復(fù)記錄,不會(huì)改變其他字段。
5. Set…case…when…where
- 優(yōu)點(diǎn):可以批量更新,也支持更新多個(gè)字段,更新多個(gè)結(jié)果。
- 缺點(diǎn):語(yǔ)句較長(zhǎng),實(shí)現(xiàn)起來比較麻煩,也比較容易出錯(cuò)。
通常它是通過主鍵或唯一鍵更新的。
update users
set job = case id
when 1 then 'job11'
when 2 then 'job12'
end,
age = case id
when 1 then 11
when 2 then 12
end
where id IN (1, 2);
mysql> select * from users where id in (1, 2);
+----+-------+------+-------+
| id | name | age | job |
+----+-------+------+-------+
| 1 | name1 | 11 | job11 |
| 2 | name2 | 12 | job12 |
+----+-------+------+-------+
一般這種方式也比較容易出錯(cuò),主要有兩種:
update users
set job = case id
when 1 then 'job11'
when 3 then 'job13'
end,
age = case id
when 1 then 11
when 2 then 12
end
where id IN (1, 2);
select * from users where id in (1, 2);
+----+-------+------+-------+
| id | name | age | job |
+----+-------+------+-------+
| 1 | name1 | 11 | job11 |
| 2 | name2 | 12 | NULL |
+----+-------+------+-------+
update users
set job = case id
when 1 then 'job11'
when 2 then 'job12'
end,
age = case id
when 1 then 11
when 2 then 12
end;
select * from users;
+----+-------+------+-------+
| id | name | age | job |
+----+-------+------+-------+
| 1 | name1 | 11 | job11 |
| 2 | name2 | 12 | job12 |
| 3 | name3 | NULL | NULL |
| 4 | name4 | NULL | NULL |
| 5 | name5 | NULL | NULL |
+----+-------+------+-------+
通過上面的測(cè)試,我們可以看出這種操作方式是相當(dāng)危險(xiǎn)的。一不小心,字段就會(huì)更新為默認(rèn)值,所以使用的時(shí)候一定要非常小心,一定不能漏掉Where子句。
6.創(chuàng)建臨時(shí)表
臨時(shí)表的方式是替換另一個(gè)表的數(shù)據(jù),但是一般情況下我們是沒有創(chuàng)建表的權(quán)限的,所以這個(gè)想法可能不太現(xiàn)實(shí)。
create temporary table users_tmp
(
id int(11) PRIMARY KEY AUTO_INCREMENT,
age smallint,
job varchar(255)
);
insert into users_tmp(id, job, age) values (1, 'job11', 11), (2, 'job22', 22);
update users, users_tmp set users.job=users_tmp.job, users.age=users_tmp.age where users.id=users_tmp.id;
網(wǎng)站欄目:MySQL批量更新數(shù)據(jù)的六種方法,你能想出第七種嗎?
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/dhpeccj.html


咨詢
建站咨詢
