2016-08-25 216 views
-2

我有一個需要更新記錄,如果它存在,否則插入它。我已經嘗試過以前的相關答案,但這些都不足以MYSQL:插入記錄,如果它已經存在更新記錄

我有一個表名與data_meta

meta_id | token | meta_key | meta_value 
1     1  terms_conditions terms conditions content 
2     1  is_config_enable  1 
3     2  terms_conditions terms conditions content 

我有一個基於令牌& meta_key。對於同樣的道理meta_key不重複進行更新。

我插入查詢

"INSERT INTO data_meta (token, meta_key, meta_value) 
         VALUES (" . $token . ", '" . $key . "', '" . $value . "')"; 

我的更新查詢

"UPDATE data_meta SET meta_value = '" . $value . "' WHERE meta_key = '" . $key . "' AND token=" . $token ; 
+0

你可以把你的腳本嗎? – Boby

+0

爲什麼其他答案不足? - 爲什麼你不能用'SELECT'做一個簡單的檢查?然後根據該選擇的結果插入/更新? – Epodax

+0

觸發器怎麼樣? – sagi

回答

0

MySQL爲此僅提供REPLACE INTO statement

REPLACE INTO data_meta (token, meta_key, meta_value) VALUES (x, y, z); 

對於這項工作的(標記,meta_key)的組合應該是主鍵,或者你需要爲(令牌,meta_key)

0

顯然你meta_id組合創建唯一索引是你的自動增加指數。

您忘記在更新查詢中使用它。沒有它,該查詢將無法正常工作,更新需要WHERE條件。

一旦你掌握了這一點,解決方案是顯而易見的。那麼它是怎樣工作的?

如果您不知道meta_id您插入,如果你知道它可以更新。就這麼簡單。

0

創建(令牌,meta_key)潮頭指數如果不是存在:

create unique index data_meta_tm on data_meta(token, meta_key); 

查詢:

"INSERT INTO data_meta (token, meta_key, meta_value) 
         VALUES (" . $token . ", '" . $key . "', '" . $value . "') 
    ON DUPLICATE KEY UPDATE meta_value = VALUES(meta_value)"; 
+0

這可能不會重複因爲「meta_value」是重複的,因此請做任何更新,即「更改某些內容」。 –

+0

@KIKOSoftware爲什麼? MySQL ON UPDATE子句中的函數VALUES從插入值部分獲取指定列的值。 – Mike

+0

你說得對。在http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html它說它只檢查UNIQUE索引或PRIMARY KEY中的值是否會導致重複。我認爲它會檢查所有列。你不能只讀這個SQL,你必須知道表結構。 –

相關問題