Mysql

Mysql根據條件更新不同的文件集

  • November 17, 2013

我有兩個表“a”:

CREATE TABLE `a` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `i1` int(11) DEFAULT NULL,
 `i2` int(11) DEFAULT NULL,
 `ib` int(11) DEFAULT NULL,
 KEY `id` (`id`)
)

+----+------+------+------+
| id | i1   | i2   | ib   |
+----+------+------+------+
|  1 |    1 |    1 |   10 |
|  2 |    1 |    1 |    1 |
|  3 |    1 |    1 |    2 |
|  4 |    1 |    1 |    3 |
|  5 |    1 |    1 |    5 |
+----+------+------+------+

和“b”

CREATE TABLE `b` (
 `i` int(11) DEFAULT NULL
)

+------+
| i    |
+------+
|    5 |
|    1 |
|   10 |
+------+

我的腳本解析外部數據(jid、j1、j2)並更新表“a”。使用 2 個命令:

update a set i1=j1, i2=j2 where id=jid 
  and not exists (select 1 from b where a.ib=b.i)

update a set i1=j1 where id=jid 
 and exists (select 1 from b where a.ib=b.i)

因此,如果我在“b”表中沒有相關記錄,我想更新兩個欄位 i1 和 i2,如果我有相關記錄,則只更新一個欄位 i1。

如果我有輸入數據

(1,2,3)
(2,5,6)
(3,7,8)

我的表“a”應該是:

+----+------+------+------+
| id | i1   | i2   | ib   |
+----+------+------+------+
|  1 |    2 |    1 |   10 |   <- i1 changed 
|  2 |    5 |    1 |    1 |   <- i1 changed
|  3 |    7 |    8 |    2 |   <- both i1 and i2 changed
|  4 |    1 |    1 |    3 |
|  5 |    1 |    1 |    5 |
+----+------+------+------+

我很確定 - 只需一個 sql 命令即可完成。

我喜歡 JOIN 語法,它比子查詢更清晰:

UPDATE a LEFT JOIN b ON (a.ib=b.i) 
SET i1 = j1, 
   i2 = if(isnull(b.i), j2 ,i2) 
WHERE a.id = jid;

這將更改 jid 記錄:i1 始終為 j1,如果不存在匹配項,則 i2 為 j2,如果匹配項存在,則更改為相同的值。如果有很多記錄並且您想要性能,您可能想要索引 bi(可能作為主鍵)。

引用自:https://dba.stackexchange.com/questions/53430