2010-04-26 29 views
144

我有一个sql查询,我想在单个查询中插入多行。所以我用类似:MySQL在单个查询中插入多行的重复键更新

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

mysql_query($sql, $conn); 

问题是,当我执行此查询,我要检查是否唯一的密钥(这是不是主键),对于如。 'name'在上面的例子中应该被检查,如果这个'name'已经存在,那么相应的整行应该被更新,否则插入。

例如,在下面例如,如果'卡特里娜'已经存在于数据库中,则整个行,不管字段的数量如何,都应该被更新。再次,如果'Samia'不存在,则应该插入该行。

我想用的:

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

这是陷阱。我陷入困境并困惑如何继续。我有多行可以一次插入/更新。请给我方向。谢谢。

回答

338

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

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

谢谢。这正是我想要的....再次感谢... – Prashant 2010-04-27 05:10:34

+10

**美丽**,正是我所需要的。 *嘿,看看我在那里做了什么?* – 2015-08-05 05:43:08

+0

如果我们需要在UPDATE中包含一条IF语句,那么每行有不同的条件会怎么样? – logic 2016-04-09 21:05:19

-1

您可以使用Replace而不是INSERT ... ON DUPLICATE KEY UPDATE。

+16

是的,但是使用REPLACE删除旧行,然后插入新行。我想保留旧行以维护主要ID。 – Prashant 2010-04-26 15:21:10

+2

我没有意识到保留旧的PK对你来说很重要......当然,REPLACE在这种情况下不起作用...... – a1ex07 2010-04-26 17:04:50

+0

如果你不关心PK,就像我的情况一样,完美。 – MLeFevre 2014-09-11 10:02:09