Mysql 使用唯一键更新多行

Mysql 使用唯一键更新多行,mysql,database,python-db-api,Mysql,Database,Python Db Api,我想更新由唯一键标识的多行,而不插入新行 以下是我的表格: 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 CHARSE

我想更新由唯一键标识的多行,而不插入新行

以下是我的表格:

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)

我如何只执行
更新
部分,而不执行
插入
?如果需要,可以更改表架构 存在更好的实施。要更新的值是从其他数据库(在不同的计算机和不同的端口上运行)计算出来的

我找出下面的一个来做这项工作,但是如果值是以千为单位的话,这个语句就太大了。还有更优雅的方法吗?如果有人能帮上忙,谢谢。 另外,我正在用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));

INSERT
的全部目的是插入新行,因此它当然要插入新行(如果没有找到重复键,则更新它)。如果只想更新现有行,请使用
update
查询

而不是使用
CASE。。。什么时候然后。。。其他的结束
迭代每个唯一键并更新。。。其中…

编辑:

例如:

UPDATE `insert_update_ignore` SET `value` = 1 WHERE `obj_id` = 1 AND `obj_type` = 1;
UPDATE `insert_update_ignore` SET `value` = 3 WHERE `obj_id` = 1 AND `obj_type` = 2;
UPDATE `insert_update_ignore` SET `value` = 1 WHERE `obj_id` = 2 AND `obj_type` = 1;
UPDATE `insert_update_ignore` SET `value` = 5 WHERE `obj_id` = 2 AND `obj_type` = 2;
UPDATE `insert_update_ignore` SET `value` = 10 WHERE `obj_id` = 3 AND `obj_type` = 1;

前4个查询将更新与
WHERE
子句中的条件匹配的行,而最后一个查询则不会,因为没有行满足条件。

您可以首先将要更新的所有值放入临时表中。 然后从临时表中更新原始表中的所有值(如果可以合并)

create temporary table temp like insert_update_ignore;

insert into temp
    values(1, 1, 1),
          (1, 2, 3),
          (2, 1, 1),
          (2, 2, 5),
          (3, 1, 10);

update insert_update_ignore i
 join temp t
 using (obj_id, obj_type)
 set i.value = t.value;

drop temporary table temp;

我也把所有这些都放进了a中。

如果找不到更好的替代方案,我将使用
cursor.executemany
来完成这项工作。谢谢