2010-02-22 67 views
1

假設我有一個表Foo。此表有IDUniqueCode像這樣定義的列:關於多鍵表中特定鍵的重複鍵更新

CREATE TABLE Foo 
(
    ID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, 
    UniqueCode VARCHAR(255) NOT NULL, 
    PRIMARY KEY (ID), 
    CONSTRAINT UNIQUE(UniqueCode) 
); 

現在讓我們假設我有以下查詢:

INSERT INTO Foo (ID, UniqueCode) VALUES ($id, $uniqueCode) 
ON DUPLICATE KEY UPDATE UniqueCode = $uniqueCode; 

在這種情況下,我想ON DUPLICATE KEY UPDATE只有火,如果ID是一個重複,但不是當UniqueCode是重複的。我意識到這將導致一個唯一的鍵約束錯誤。我的第一個想法是首先檢查並確認$uniqueCode是否正在使用,如果是,則更改它。有什麼方法可以在MySQL語句中指定它嗎?

編輯:在僞什麼,我想有是:

INSERT INTO Foo(ID, UniqueCode) VALUES ($id, $uniqueCode) 
ON DUPLICATE KEY UPDATE 
(
    IF (duplicate key is ID) 
     update uniqueCode = $uniqueCode where ID = $id 
    ELSE // i.e. the duplicate key was UniqueCode and not the ID column 
     do nothing 
) 

回答

0

我認爲我希望的行爲是不會在唯一代碼是重複的機會上發生錯誤。我已經實現了一種方法來檢查在將其插入數據庫之前是否存在唯一代碼。之後,我插入該行,然後ON DUPLICATE KEY UPDATE只能在ID重複時觸發。

2

像這樣的事情?

mysql> insert into Foo (Id, UniqueCode) values (3, "bar") on duplicate key update 
UniqueCode=IF(UniqueCode='bar','bar','no_unique_dupe');