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
是唯一的,但不是主键。
Jai的建议是正确的,你应该使用INSERT ... ON DUPLICATE KEY 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)
ALTER TABLE AggregatedData ADD UNIQUE (Timestamp)
创建 Timestamp
的 UNIQUE
约束。 - Avyakt尝试使用this:
如果您指定了
ON DUPLICATE KEY UPDATE
,并且插入一行会导致在UNIQUE索引或
PRIMARY KEY中出现重复值,则MySQL将对旧行执行[更新](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),如果将现有行设置为其当前值...
这个方法还不错,但我们实际上可以将所有内容合并为一个查询。我在互联网上找到了不同的解决方案。最简单的,但只适用于MySQL
的解决方案是:
INSERT INTO wp_postmeta (post_id, meta_key)
SELECT
?id,
‘page_title’
FROM
DUAL
WHERE
NOT EXISTS (
SELECT
meta_id
FROM
wp_postmeta
WHERE
post_id = ?id
AND meta_key = ‘page_title’
);
UPDATE
wp_postmeta
SET
meta_value = ?page_title
WHERE
post_id = ?id
AND meta_key = ‘page_title’;
我遇到了这样一种情况:我需要根据两个字段(都是外键)更新或插入表格,但我无法设置唯一约束条件(因此 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的值输入。