MySQL ON DUPLICATE KEY UPDATE用于在单个查询中插入多行


199

我有一个SQL查询,我想在单个查询中插入多行。所以我用了类似的东西:

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

问题是当我执行此查询时,我想检查是否应检查例如上面的UNIQUE键(不是PRIMARY KEY),'name'如果'name'已经存在,则应更新相应的整行,否则将其插入。

例如,在下面的示例中,如果'Katrina'数据库中已经存在该行,则应更新整行,而无论字段数如何。再次,如果'Samia'不存在,则应插入该行。

我想到使用:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

这是陷阱。我对如何进行感到困惑和困惑。我一次有多行要插入/更新。请给我一个方向。谢谢。

Answers:


479

使用关键字VALUES来引用新值(请参阅文档)。

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...

2
如果我们需要在UPDATE中包括对每行都有不同条件的IF语句怎么办?
逻辑

2
@logic:有几个与此相关的问题:StackOverflow搜索。如果他们都回答不了您的问题,请张贴一个新的解释您的确切需求。
彼得·郎

@logic您找到了解决问题的方法吗?目前我正面临着同样的问题
Parth kharecha

很棒的建议。如果要在重复时增加一个值,请将其添加到“ ON DUPLICATE KEY UPDATE”部分之后:total = total + VALUES(total)
凤凰城

1

INSERT INTO ... ON DUPLICATE KEY UPDATE仅适用于MYSQL,不适用于SQL Server。

对于SQL Server,解决此问题的方法是先声明一个临时表,在该临时表中插入值,然后使用MERGE

像这样:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);

15
谁使用SQL Server:D
Jeremy Belolo '18

-3

您可以使用 Replace代替INSERT ... ON DUPLICATE KEY UPDATE。


28
是的,但是使用REPLACE会在插入新行之前删除旧行。我想保留旧行以维护主ID。
Prashant 2010年

2
我没有意识到保留旧的PK对您来说很重要...当然,在这种情况下,REPLACE无法正常工作
a1ex07

4
PS:“替换为”需要删除和插入权限!
Oliver M Grech 2014年

2
并且由于上述删除/插入原因,它们在这些情况下也要慢得多。
罗斯

1
如果要更新几列怎么办?替换将更新所有内容。
imVJ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.