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

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

它可以工作,如果datenum存在,但我想插入这个数据作为一个新的行,如果datenum不存在。

UPDATE

datenum是唯一的,但这不是主键

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

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

这里是你的更新使用适当的INSERT ... ON DUPLICATE KEY UPDATE语法重写MySQL:

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

尝试使用这个 :

如果你指定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。 如果在连接到mysqld时将mysql_real_connect()指定为CLIENT_FOUND_ROWS标志,则如果现有行被设置为其当前值,则受影响的行值为1(而不是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; 

这个例子是从我的一个数据库中分离出来的,input参数(两个名字和一个数字)被replace为[hasher_name],[hash_name]和[new_value]。 嵌套的SELECT … LIMIT 1抽取现有logging或新logging(last_recogs.id是自动增量主键)的第一个,并将其用作REPLACE INTO的值input。