Mysql
Mysql根據條件更新不同的文件集
我有兩個表“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(可能作為主鍵)。