2014-05-15 148 views
1

在MYSQL中,如果存在其他行,如何更新(而不是替換),否則會創建一個新行。未使用REPLACE INTO或ON DUPLICATE KEY UPDATE

我需要測試的列不是主鍵,它包含一個電子郵件地址。

基本上我有一個表,用於存儲電子郵件和其他隨機數據。我由一次獨特的自動證其罪數列(ID)

我使用id列指會話數據,而不是電子郵件列的原因是因爲郵件引用行作爲保存會話由不知道id列存在的用戶輸入。

編輯:而我沒有通過電子郵件引用會話的原因是因爲電子郵件太長/不同長度(長故事,但他們使我的QR碼所有不同的大小,我不想揭露電子郵件)

我敢肯定的兩件事情:

REPLACE INTO 

,這看起來像它會破壞我的身份證號碼,因爲這方法複製該行同時刪除舊

ON DUPLICATE KEY UPDATE 

這似乎需要一個唯一的密鑰(ID),這是不是我需要它會更好,如果我可以做類似的比較:

ON DUPLICATE email UPDATE 

或者是這樣的(但我不認爲它是有效的MYSQL):

var email='[email protected]'; 
var mysql= 
"UPDATE table SET (...) WHERE email='"+email+"' "+ 
"IF @@ROWCOUNT=0 "+ 
"INSERT INTO table VALUES (...)"; 

MYSQL不可能這個可以嗎?

回答

0

從文檔:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html,您只需使用唯一的關鍵字段。我的意思是,如果你變換了電子郵件域作爲一個獨特的領域,在運行:

ALTER TABLE `your_table` ADD UNIQUE INDEX `email` (`email`); 

現在,當您嘗試插入行具有相同的郵件,使用INSERT ... ON DUPLICATE KEY UPDATE,它會更新所有字段的值同時保持電子郵件的價值不變:

a | b | email 
1 | 1 | [email protected] 

運行後......

INSERT INTO my_table (a, b, email) VALUES (2, 2, '[email protected]') 
on duplicate key update a=VALUES(a), b=VALUES(b) 

你必須

a | b | email 
2 | 2 | [email protected] 

留意上指定要更新哪些字段,如果不指定,它不會被更新!

編輯:現在,隨着SQLFiddle顯示它的工作:http://sqlfiddle.com/#!2/79e67/3

+0

我得到這個: #1170 - BLOB /在關鍵的規格沒有一個密鑰長度 –

+0

TEXT列「電子郵件」檢查我的更新,; D – Chococroc

+0

但是,當我嘗試使電子郵件唯一時出現錯誤...如果出現此錯誤,它將如何工作? –

1

其實,你自己回答了你的問題: 是的,任何可以回退插入的SQL-buildt-in更新/替換方法都需要一個唯一的字段。 要更新非唯一字段,您必須使用where-condition並檢查是否有任何行已被更改。 (保持交易記錄)

我看到,由於某種原因你不想要一個獨特的電子郵件列。您是否看到您可以有多列獨特零件

例如,如果您有一個通過電子郵件和時間戳的唯一索引,則可以使用ON DUPLICATE KEY UPDATE。如果郵件按2列的順序排在第一位,它甚至會替代非唯一的僅限電子郵件索引。

相關問題