用于更新多列的MySQL CASE

brvekthn  于 2023-01-08  发布在  Mysql
关注(0)|答案(4)|浏览(107)

我想使用case语句更新表中的多个列,但我找不到方法(这可能吗)。我产生了以下无效引用查询:

UPDATE tablename SET
    CASE name
        WHEN 'name1' THEN col1=5,col2=''
        WHEN 'name2' THEN col1=3,col2='whatever'
        ELSE col1=0,col2=''
    END;

有没有什么方法可以用有效的SQL来达到预期的结果?

new9mtju

new9mtju1#

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
;
ar5n3qh5

ar5n3qh52#

我不知道有什么干净的方法来做你所要求的。一个等效的有效SQL更新将是:

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;

当然,这并不漂亮,需要多次重复相同的情况(例如'name1'),但我认为没有其他可能的方式。

3bygqnnd

3bygqnnd3#

如果name具有唯一索引,并且已知您的值存在于表中,则可以使用以下技巧:

INSERT INTO tablename (name, col1, col2)
VALUES ('name1', 5, '')
     , ('name2', 3, 'whatever')
ON DUPLICATE KEY UPDATE
       col1 = VALUES(col1)
     , col2 = VALUES(col2);

如果NOT NULL列中还有没有默认值的列,你必须为它们添加一个伪值,只要把它们从ON DUPLICATE KEY UPDATE列中去掉,它们就会被忽略。

yshpjwxd

yshpjwxd4#

您有两个选项,在此问题的不同答案中涵盖:

  • 第一个月
  • INSERT INTO ... ON DUPLICATE KEY

我有以下要求:

  • 使用4列值批量更新100000+条记录
  • 源文件可能有一些记录没有触发“重复键”,因此只是插入新的数据而不是更新。2同时我不想要这些新记录。

所以有两个不好的选择:

  • 在更新100000多条记录时,对多列使用UPDATE ... CASE会使数据库的开销非常大
  • 使用INSERT INTO ... ON DUPLICATE KEY可能会插入我不需要的记录

我的解决方案:将INSERT INTO ... ON DUPLICATE KEY与虚拟数据一起使用,然后删除包含带有UNWANTED_INSERTED_DATA标志的列的所有记录

我用UNWANTED_INSERTED_DATA作为标志更新了另外两列,这样我可以保证这些值永远不会成为任何真实的数据的一部分。

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
  • 我想要的记录只使用update,因此不会接收到UNWANTED_INSERTED_DATA列的伪数据。
  • 我不希望的记录包含虚拟数据。

然后,我可以在一个删除查询中删除所有不需要的插入记录和伪数据:

DELETE FROM tablename WHERE col2 = 'UNWANTED_INSERTED_DATA'

相关问题