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
来完成这项工作。谢谢