UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
如果datenum
存在,它会起作用,但如果datenum
不存在,我想将此数据作为新行插入。
更新
datenum是唯一的但不是主键
答案 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的值输入。