UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
它的工作原理,如果datenum
存在,但我想插入這個數據作爲新行如果datenum
不存在。MySQL表插入如果不存在,否則更新
UPDATE
的datenum是獨一無二的,但事實並非主鍵
UPDATE AggregatedData SET datenum="734152.979166667",
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";
它的工作原理,如果datenum
存在,但我想插入這個數據作爲新行如果datenum
不存在。MySQL表插入如果不存在,否則更新
UPDATE
的datenum是獨一無二的,但事實並非主鍵
潔是正確的,你應該使用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)
對於具有多個唯一或主鍵的表,對錶使用INSERT ... ON DUPLICATE KEY UPDATE時要小心。取自[MySQL文檔](http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html):_另外,從MySQL 5.5.24開始,INSERT ... ON對具有多個唯一或主鍵的表的DUPLICATE KEY UPDATE語句也被標記爲不安全。 (錯誤#11765650,錯誤#58637)_錯誤58637描述http://bugs.mysql.com/bug.php?id=58637 – broadband 2014-09-02 13:28:40
可能需要爲'Timestamp'創建'UNIQUE'約束,方法是使用'ALTER TABLE AggregatedData ADD UNIQUE(Timestamp)' – Avyakt 2015-01-19 19:13:34
嘗試使用this:如果指定ON DUPLICATE KEY UPDATE
,行插入,將在導致重複值a
UNIQUE index or
PRIMARY KEY, MySQL performs an [
UPDATE`](http://dev.mysql.com/doc/refman/5.7/en/update.html)舊行...The
ON DUPLICATE KEY UPDATE
子句可以包含多個由逗號分隔的列分配。使用
ON DUPLICATE KEY UPDATE
,如果行作爲新行插入,每行受影響的行值爲1,如果更新現有行,則爲2;如果現有行被設置爲其當前值,則每次行爲0。如果您連接到mysqld時指定CLIENT_FOUND_ROWS
標誌mysql_real_connect()
時,受影響的行值爲1(不爲0),如果現有的行設置爲當前值...
但我datenum不是主鍵。 – 2011-05-17 11:49:31
這不是必需的。唯一的需求是一個唯一的關鍵。 – Jai 2011-05-17 11:50:35
所以在我的情況下,什麼是解決方案,我試過這個,沒有任何解決方案:INSERT INTO forwind.aggregateddata(datenum,Timestamp,Min_F1_baro_20_)VALUES('1','2','3') ON DUPLICATE KEY UPDATE datenum = datenum; – 2011-05-17 11:57:20
我有地方,我需要更新或根據兩個領域(包括外鍵)上表中插入情況我無法設置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的值輸入。
「datenum」是否是唯一的?如果是,您可以使用[INSERT ... ON DUPLICATE KEY UPDATE](http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html)。 – Jacob 2011-05-17 11:29:46
[插入到MySQL表或更新如果存在]可能重複(http://stackoverflow.com/questions/4205181/insert-into-a-mysql-table-or-update-if-exists) – 2016-06-07 14:40:46