成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL批量更新數據的六種方法,你能想出第七種嗎?

數據庫 MySQL
我們都知道MYSQL中批量插入非常簡單,那么批量更新呢?

我們都知道MYSQL中批量插入非常簡單,那么批量更新呢?

1.IN

IN 語句有比較大的局限性,更新后的結果必須一致。比如下面是將所有滿足條件的行的狀態(status)設置為1。

如果想部分設置為1,部分設置為2等,則無法實現,或者通過寫多條SQL語句實現。

Update users Set status=1 Where account IN ('xx1', 'xx2');

2. For + Update

借助 For 循環 + Update 語句,即逐一更新,優點是清晰直觀,適用于大部分情況,不易出錯。缺點是性能較差,容易造成堵塞。

如果是在MYSQL客戶端執行,這種方法很不方便。一般需要生成多條Update語句,或者可以用存儲過程實現。

3. Insert into…on duplicate key update

利用主鍵(或唯一鍵)的唯一性進行更新的好處是支持批量更新,更新結果不需要保持一致。缺點是一般第三方庫不支持這種語法,需要寫原生SQL,所有字段必須有默認值(包括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

眾所周知,它是一個替換,相當于一個 update。語法類似于第三種方法,但比第三種方法更危險,因為更新時如果字段不完整,未覆蓋的字段將被設置為默認值。

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 操作的本質是先刪除重復記錄再插入,所以如果更新的字段不完整,缺失的字段會被設置為默認值,而 insert into 只是更新重復記錄,不會改變其他字段。

5. Set…case…when…where

  • 優點:可以批量更新,也支持更新多個字段,更新多個結果。
  • 缺點:語句較長,實現起來比較麻煩,也比較容易出錯。

通常它是通過主鍵或唯一鍵更新的。

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 |
+----+-------+------+-------+

一般這種方式也比較容易出錯,主要有兩種:

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 |
+----+-------+------+-------+

通過上面的測試,我們可以看出這種操作方式是相當危險的。一不小心,字段就會更新為默認值,所以使用的時候一定要非常小心,一定不能漏掉Where子句

6.創建臨時表

臨時表的方式是替換另一個表的數據,但是一般情況下我們是沒有創建表的權限的,所以這個想法可能不太現實。

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;


責任編輯:華軒 來源: 今日頭條
相關推薦

2010-10-08 11:13:22

MySQL修改密碼

2022-05-30 16:42:20

數據中心

2011-02-24 10:56:34

人才

2023-09-06 08:00:00

ChatGPT數據分析

2011-05-30 13:37:46

JSP

2011-12-16 14:45:36

JavaJSP

2016-09-28 20:05:22

2021-11-19 10:10:14

手機移動設備網絡攻擊

2015-06-09 15:23:50

2022-09-30 10:48:12

AR制造業

2022-10-27 08:09:33

2023-04-18 15:57:30

2024-07-29 08:00:00

2025-01-02 08:21:32

2023-12-08 08:53:37

數據中心人工智能自動化

2022-01-21 10:42:55

IT領導者IT事業職業顧問

2023-04-26 08:41:16

Git撤消更改

2023-04-03 20:29:00

Linux環境變量

2021-07-02 10:43:52

IT人才首席信息官人才招聘

2009-10-29 16:32:24

查看Oracle用戶的
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲美女网站 | 欧美日韩视频一区二区 | 三级在线视频 | 黄色片在线看 | 国产一区中文字幕 | 国产日韩视频 | 国产激情在线 | 欧美日韩国产一区二区 | 黄色网址在线免费观看 | 日韩最新网址 | 亚洲成人免费视频 | 国产欧美一区二区三区国产幕精品 | 久久久九九| 色偷偷噜噜噜亚洲男人 | 久久激情视频 | 日本一区二区三区在线观看 | 免费一区二区三区 | 日本午夜在线视频 | 亚洲精品免费看 | 国产欧美精品一区二区色综合朱莉 | 中文字幕 国产精品 | 99国产精品久久久久老师 | 精品视频999 | 性色网站 | 天天看逼 | www日日日 | 亚洲 成人 在线 | 久草福利 | 一区二区三区精品 | 最新中文字幕在线 | 国产2区 | 国产成人精品综合 | 嫩草91在线 | 国产一区二区三区四 | 亚洲欧洲精品一区 | 国内精品久久久久 | 日韩在线不卡 | 久久亚洲综合 | 成人免费视频网站在线看 | 欧美成人h版在线观看 | 人人艹人人 |