2014-11-21 80 views
0

我需要更新mySQL數據庫中的一行,但存在約束時不可能這樣做。mySQL更新,同時忽略表約束

約束條件要求兩列的組合是唯一的。

作爲示例,名字和姓氏字段必須是唯一的。一個SHOW CREATE TABLE用戶可能包含這樣的事情:

UNIQUE KEY `uniquePortTermCode` (`firstname`,`lastname`) 

當我嘗試更新,我違反了這個關鍵,所以我得到的錯誤:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'Bob-Smith' for key 'uniqueFirstnameLastname' 

可以說,我需要交換的名字兩個姓氏相同的用戶。所以我想把鮑勃史密斯設定爲吉姆史密斯,並且我想把吉姆史密斯設定爲鮑勃史密斯。當我嘗試第一個更新語句時,我將遇到唯一的鍵錯誤。

我認爲一個解決方法是SET foreign_key_checks=0,但作爲變量表明這只是外鍵,而不是唯一鍵,所以我仍然得到錯誤。

我也看到,在mySQL unique_checks有一個變量,但將其設置爲false仍然不能解決我的問題,我仍然得到錯誤。

有沒有一種方法可以忽略唯一的密鑰,同時執行此操作時不會像滑動拼圖一樣更改數據?

+0

SET foreign_key_checks = 0不會忽略唯一字段。你使用的是什麼數據庫引擎? myISAM或InnoDB?你有沒有試過UNIQUE_CHECKS = 0;禁用鍵? – 2014-11-21 11:13:47

+0

[如何在不違反唯一約束的情況下交換MySQL中兩行的值?](http://stackoverflow.com/questions/11207574/how-to-swap-values-of-two-rows-in-mysql -without-violating-unique-constraint) – piotrm 2014-11-21 11:15:49

+0

是的,這實際上是重複的。我會關閉這個。 – JackalopeZero 2014-11-21 11:17:56

回答

0

如果你想交換「鮑勃·史密斯」和「吉姆·史密斯」,你可以用三個更新做到這一點:

update table t 
    set firstname = 'In the process of swapping names from Bob to Jim' 
    where firstname = 'Bob' and lastname = 'Smith'; 

update table t 
    set firstname = 'Bob' 
    where firstname = 'Jim' and lastname = 'Smith'; 

update table t 
    set firstname = 'Jim' 
    where firstname = 'In the process of swapping names from Bob to Jim' and lastname = 'Smith'; 

我建議讓他們在邏輯上作爲一個執行在單個事務中包裝這些單個塊並將其放入存儲過程中。

另一種方法是刪除或禁用表上的檢查。這會產生影響 - 在多用戶環境中,其他線程可能會發生錯誤。或者,系統可能會關閉,並在檢查關閉時恢復。

在這種方法中可能發生的最壞情況是記錄會得到一個非常尷尬的名字,可以很容易地修復。 (如果交易正常,則不會發生這種情況。)