UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
如果datenum
存在,它就可以工作,但是如果不存在,我想将此数据作为新行插入datenum
。
更新
datenum是唯一的,但这不是主键
UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
如果datenum
存在,它就可以工作,但是如果不存在,我想将此数据作为新行插入datenum
。
更新
datenum是唯一的,但这不是主键
Answers:
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)
UNIQUE
用于约束Timestamp
用ALTER TABLE AggregatedData ADD UNIQUE (Timestamp)
尝试使用这个:
如果您指定
ON DUPLICATE KEY UPDATE
,则会插入一行,这将导致旧行的UNIQUE index or
PRIMARY KEY, MySQL performs an [
UPDATE`](PRIMARY KEY UPDATE`](http://dev.mysql.com/doc/refman/5.7/en/update.html)中的值重复。 ..该
ON DUPLICATE KEY UPDATE
子句可以包含多个列分配,以逗号分隔。使用
ON DUPLICATE KEY UPDATE
,如果将行插入为新行,则每行的受影响行值为1;如果更新了现有行,则为2;如果将现有行设置为其当前值,则为0。如果在连接到mysqld时指定CLIENT_FOUND_ROWS
标志,则在现有行设置为其当前值mysql_real_connect()
时,受影响的行值为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;
这个示例来自我的一个数据库,其中输入参数(两个名称和一个数字)被替换为[hasher_name],[hash_name]和[new_value]。嵌套的SELECT ... LIMIT 1提取现有记录或新记录中的第一个(last_recogs.id是自动增量主键),并将其用作输入到REPLACE INTO中的值。