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。