UPDATE tablename
SET col1 = CASE WHEN name = 'name1' THEN 5
WHEN name = 'name2' THEN 3
ELSE 0
END
, col2 = CASE WHEN name = 'name1' THEN ''
WHEN name = 'name2' THEN 'whatever'
ELSE ''
END
;
UPDATE tablename SET
col1 = CASE name WHEN 'name1' THEN 5 WHEN 'name2' THEN 3 ELSE 0 END,
col2 = CASE name WHEN 'name1' THEN '' WHEN 'name2' THEN 'whatever' ELSE '' END;
INSERT INTO tablename (name, col1, col2)
VALUES ('name1', 5, 'UNWANTED_INSERTED_DATA')
, ('name2', 3, 'UNWANTED_INSERTED_DATA')
ON DUPLICATE KEY UPDATE
col1 = VALUES(col1)
, col2 = VALUES(col2)
; # DO NOT include the UNWANTED_INSERTED_DATA in the update part
4条答案
按热度按时间new9mtju1#
ar5n3qh52#
我不知道有什么干净的方法来做你所要求的。一个等效的有效SQL更新将是:
当然,这并不漂亮,需要多次重复相同的情况(例如
'name1'
),但我认为没有其他可能的方式。3bygqnnd3#
如果
name
具有唯一索引,并且已知您的值存在于表中,则可以使用以下技巧:如果
NOT NULL
列中还有没有默认值的列,你必须为它们添加一个伪值,只要把它们从ON DUPLICATE KEY UPDATE
列中去掉,它们就会被忽略。yshpjwxd4#
您有两个选项,在此问题的不同答案中涵盖:
INSERT INTO ... ON DUPLICATE KEY
我有以下要求:
所以有两个不好的选择:
UPDATE ... CASE
会使数据库的开销非常大INSERT INTO ... ON DUPLICATE KEY
可能会插入我不需要的记录我的解决方案:将
INSERT INTO ... ON DUPLICATE KEY
与虚拟数据一起使用,然后删除包含带有UNWANTED_INSERTED_DATA标志的列的所有记录我用UNWANTED_INSERTED_DATA作为标志更新了另外两列,这样我可以保证这些值永远不会成为任何真实的数据的一部分。
然后,我可以在一个删除查询中删除所有不需要的插入记录和伪数据: