2011-05-17 148 views
71
UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667"; 

它的工作原理,如果datenum存在,但我想插入這個數據作爲新行如果datenum不存在。MySQL表插入如果不存在,否則更新

UPDATE

的datenum是獨一無二的,但事實並非主鍵

+1

「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

+1

[插入到MySQL表或更新如果存在]可能重複(http://stackoverflow.com/questions/4205181/insert-into-a-mysql-table-or-update-if-exists) – 2016-06-07 14:40:46

回答

106

潔是正確的,你應該使用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) 
+11

對於具有多個唯一或主鍵的表,對錶使用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

+1

可能需要爲'Timestamp'創建'UNIQUE'約束,方法是使用'ALTER TABLE AggregatedData ADD UNIQUE(Timestamp)' – Avyakt 2015-01-19 19:13:34

13

嘗試使用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),如果現有的行設置爲當前值...

+0

但我datenum不是主鍵。 – 2011-05-17 11:49:31

+0

這不是必需的。唯一的需求是一個唯一的關鍵。 – Jai 2011-05-17 11:50:35

+0

所以在我的情況下,什麼是解決方案,我試過這個,沒有任何解決方案: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

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的值輸入。

相關問題