SQL插入现有的多个记录/更新(在单个查询中)

时间:2018-08-09 09:17:19

标签: mysql sql

我正在尝试在单个查询中插入多个数据。

INSERT INTO tableName (`ITEM`, `QUANTITY`)
VALUES
    ('PAPER',   '1'),
    ('PENCIL',  '1'),
    ('FOLDER',  '1'),
    ('PEN',     '1'),
    ('ERASER',  '1') 

这有效。基本上,它所做的只是针对每个条目(或如上图所示的“ PAPER”,“ PENCIL”等项目),它只是将其作为一条记录插入。

我现在的问题是,如果记录已经存在怎么办?我不想插入一条新记录,该记录的详细信息与现有记录相同。

我正在尝试弄清楚如何进行重复密钥更新。

这是我的新查询:

INSERT INTO tableName (`ITEM`, `QUANTITY`)
VALUES
    ('PAPER',   '1'),
    ('PENCIL',  '1'),
    ('FOLDER',  '1'),
    ('PEN',     '1'),
    ('ERASER',  '1') 
ON DUPLICATE KEY UPDATE ITEM=ITEM, QUANTITY=QUANTITY;

尽管这在插入时效果很好,但我的问题是所有现有记录将具有应更新内容的固定值,而无法确定哪个记录应具有指定值作为新数据。

不用说,通过这种方法,我无法确定应插入哪个值作为对特定记录的更新,因为它会对所有现有数据进行更新。

我在想一种类似的方法:

INSERT INTO tableName (`ITEM`, `QUANTITY`)
VALUES
    ('PAPER',   '1') ON DUPLICATE KEY UPDATE ITEM=ITEM, QUANTITY='2',
    ('PENCIL',  '1') ON DUPLICATE KEY UPDATE ITEM=ITEM, QUANTITY='33',
    ('FOLDER',  '1') ON DUPLICATE KEY UPDATE ITEM=ITEM, QUANTITY='19',
    ('PEN',     '1') ON DUPLICATE KEY UPDATE ITEM=ITEM, QUANTITY='28',
    ('ERASER',  '1') ON DUPLICATE KEY UPDATE ITEM=ITEM, QUANTITY='14';

类似这样的东西可以帮助我将任意数量的记录插入表中,并且如果我要插入的某个记录已经存在,则将使用新数据进行更新。但是,当然这是行不通的。

我正在尝试找到一种方法来执行类似的操作,因为在单个查询中插入多个记录是必需的。

注意:我正在MySQL上工作。另外,我试图避免使用存储过程。

2 个答案:

答案 0 :(得分:2)

您遇到一种奇怪的情况,您要更新的值没有传入。

假设ITEM是唯一的:

INSERT INTO tableName (`ITEM`, `QUANTITY`)
    VALUES ('PAPER', 1),
           ('PENCIL', 1),
           ('FOLDER', 1),
           ('PEN', 1),
           ('ERASER', 1)
    ON DUPLICATE KEY UPDATE
       QUANTITY = (CASE ITEM
                       WHEN 'PAPER' THEN 2
                       WHEN 'PENCIL' THEN 33
                       WHEN 'FOLDER' THEN 19
                       WHEN 'PEN' THEN 28
                       WHEN 'ERASER' THEN 14
                   END);

这还假设QUANTITY是一个数字。数值常数周围不需要单引号。

答案 1 :(得分:0)

您可以在SQL Server中使用“合并”语句,请检查以下链接: https://www.red-gate.com/simple-talk/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/