日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
MySQL批量更新數(shù)據(jù)的六種方法,你能想出第七種嗎?

我們都知道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