如果不存在MySql表插入,否则更新

时间:2011-05-17 11:25:42

标签: mysql insert

UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";

如果datenum存在,它会起作用,但如果datenum不存在,我想将此数据作为新行插入。

更新

datenum是唯一的但不是主键

3 个答案:

答案 0 :(得分:126)

Jai是正确的,你应该使用INSERT ... ON DUPLICATE KEY UPDATE

请注意,您不需要在update子句中包含datenum,因为它是唯一键,因此不应更改。您需要包含表中的所有其他列。您可以使用VALUES()函数确保在更新其他列时使用正确的值。

以下是使用MySQL的正确INSERT ... ON DUPLICATE KEY UPDATE语法重写的更新:

INSERT INTO AggregatedData (datenum,Timestamp)
VALUES ("734152.979166667","2010-01-14 23:30:00.000")
ON DUPLICATE KEY UPDATE 
  Timestamp=VALUES(Timestamp)

答案 1 :(得分:14)

尝试使用this

  

如果您指定ON DUPLICATE KEY UPDATE,并且插入的行会导致旧UNIQUE index or PRIMARY KEY , MySQL performs an [ UPDATE`中的重复值(http://dev.mysql.com/doc/refman/5.7/en/update.html)行...

     

ON DUPLICATE KEY UPDATE子句可以包含多个列分配,以逗号分隔。

     

对于ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为1;如果更新现有行,则为2,如果现有行设置为其当前值,则为0。如果在连接到mysql_real_connect()时将CLIENT_FOUND_ROWS标志指定为mysqld,则如果将现有行设置为其当前值,则受影响的行值为1(不为0)... < / p>

答案 2 :(得分:0)

我遇到的情况是我需要根据两个字段(两个外键)更新或插入表,我无法设置UNIQUE约束(因此INSERT ... ON DUPLICATE KEY UPDATE将不起作用)。这是我最终使用的内容:

replace into last_recogs (id, hasher_id, hash_id, last_recog) 
  select l.* from 
    (select id, hasher_id, hash_id, [new_value] from last_recogs 
     where hasher_id in (select id from hashers where name=[hasher_name])
     and hash_id in (select id from hashes where name=[hash_name]) 
     union 
     select 0, m.id, h.id, [new_value] 
     from hashers m cross join hashes h 
     where m.name=[hasher_name] 
     and h.name=[hash_name]) l 
  limit 1;

此示例来自我的一个数据库,输入参数(两个名称和一个数字)替换为[hasher_name],[hash_name]和[new_value]。嵌套的SELECT ... LIMIT 1拉出现有记录中的第一个或新记录(last_recogs.id是自动增量主键),并将其用作REPLACE INTO的值输入。