我想更新由唯一鍵標識的多行而不插入新行。使用唯一鍵更新多個行
下面是我的表:
CREATE TABLE `insert_update_ignore` (
`obj_id` int(11) NOT NULL,
`obj_type` tinyint(4) NOT NULL,
`value` int(11) DEFAULT '-1',
UNIQUE KEY `unique_key` (`obj_id`,`obj_type`))
ENGINE=InnoDB DEFAULT CHARSET=utf8
表有一些現有的記錄:
mysql> select * from insert_update_ignore;
+--------+----------+-------+
| obj_id | obj_type | value |
+--------+----------+-------+
| 1 | 1 | -1 |
| 1 | 2 | -1 |
| 2 | 1 | -1 |
| 2 | 2 | -1 |
+--------+----------+-------+
我有一些值更新表中的列value
。
INSERT INTO insert_update_ignore(obj_id, obj_type, value)
VALUES(1, 1, 1),
(1, 2, 3),
(2, 1, 1),
(2, 2, 5),
(3, 1, 10)
ON DUPLICATE KEY UPDATE
value = VALUES(value);
除了最後一個值,即(3,1,10)被插入表格之外,這幾乎完成了工作。這個不應該被插入,因爲唯一的鍵(3,1)以前不存在。
我該怎麼做UPDATE
部分,而不是INSERT
?如果 存在更好的實現,則可以更改表架構。要更新的值是從其他數據庫(運行在不同的機器和不同端口上)計算得出的。
我挖出下面的一個做這項工作,但是如果這個值是幾千,那麼這個陳述就太大了。任何更優雅的方式來做到這一點?謝謝,如果任何人可以幫助這一點。 P.S我在Python中編寫這個代碼並使用MySQLdb庫。
UPDATE insert_update_ignore
SET value = CASE
WHEN (obj_id = 1 AND obj_type = 1) THEN 1
WHEN (obj_id = 1 AND obj_type = 2) THEN 3
WHEN (obj_id = 2 AND obj_type = 1) THEN 1
WHEN (obj_id = 2 AND obj_type = 2) THEN 5
WHEN (obj_id = 3 AND obj_type = 1) THEN 10
ELSE value
END
WHERE (obj_id, obj_type) IN ((1, 1), (1,2), (2, 1), (2, 2), (3, 1));
請讓我看看'UPDATE' SQL?我很困惑。 – schemacs
已被加入到答案。 – MichaelRushton
如果找不到更好的替代方法,我將使用'cursor.executemany'來完成這項工作。謝謝。 – schemacs