SQL在使用ON DUPLICATE KEY UPDATE时插入多条记录

Day*_*een 5 mysql sql sql-insert

我有一个查询将多个数据作为单个查询一次性插入。

INSERT INTO tableName (COLUMN_1, COLUMN_2, COLUMN_3) 
SELECT 'test1', 'test2', 'test3'
UNION ALL
SELECT 'test4', 'test5', 'test6'
UNION ALL
SELECT 'test7', 'test8', 'test8'
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,有没有办法实现“ON DUPLICATE KEY UPDATE”?就像是:

INSERT INTO tableName (COLUMN_1, COLUMN_2, COLUMN_3)
SELECT 'test1', 'test2', 'test3'
ON DUPLICATE KEY UPDATE COLUMN_1='new', COLUMN_2='new', COLUMN_3='new'
UNION ALL
SELECT 'test1', 'test2', 'test3'
ON DUPLICATE KEY UPDATE COLUMN_1='new', COLUMN_2='new', COLUMN_3='new'
UNION ALL
SELECT 'test1', 'test2', 'test3'
ON DUPLICATE KEY UPDATE COLUMN_1='new', COLUMN_2='new', COLUMN_3='new';
Run Code Online (Sandbox Code Playgroud)

注意:可能是无关紧要或毫无意义的,但我正在使用 mysql 工作台执行此操作。

Nic*_*ick 3

你的查询基本上是正确的,只需去掉中间的ON DUPLICATE KEY.... 不需要派生表,因为您没有引用联合中的列。

INSERT INTO tableName (COLUMN_1, COLUMN_2, COLUMN_3) 
SELECT 'test8', 'test9', 'test10'
UNION ALL
SELECT 'test4', 'test5', 'test6'
UNION ALL
SELECT 'test9', 'test5', 'test6'
ON DUPLICATE KEY UPDATE COLUMN_1='new', COLUMN_2='new', COLUMN_3='new';
Run Code Online (Sandbox Code Playgroud)

您将遇到的问题是,如果您在INSERT. 在这种情况下,UPDATE将尝试将两行设置为具有相同的键(“新”),并且将INSERT失败。您可以通过更改查询来解决此问题,以便UPDATE包含旧列值的一部分。在这种情况下,由于您将引用列值,因此您将需要一个派生表:

INSERT INTO tableName (COLUMN_1, COLUMN_2, COLUMN_3) 
SELECT * FROM (
    SELECT 'test8', 'test9', 'test10'
    UNION ALL
    SELECT 'test4', 'test5', 'test6'
    UNION ALL
    SELECT 'test1', 'test5', 'test6') AS dt
ON DUPLICATE KEY UPDATE COLUMN_1=CONCAT('new', COLUMN_1), COLUMN_2='new', COLUMN_3='new';
Run Code Online (Sandbox Code Playgroud)

更新了 SQLFiddle