2013-01-09 81 views
3

我有一個表,其中包括一個ENUM字段。我希望ENUM的一個特定值需要參考ID列的唯一性。所以我們可以說我有這樣的:MySQL信號重複鍵錯誤

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
`type` ENUM('single','multi') NOT NULL, 
`refid` INT UNSIGNED NOT NULL, 
`extra` TEXT, 
PRIMARY KEY (`id`) 

我想(type,refid)是唯一的關鍵,但只有當typesingle。這不能用傳統的按鍵完成,所以我想我會使用觸發器來檢測插入行,檢查type='single',查找與type='single' and refid=new.refid一行,並且如果找到了一個重複的條目錯誤。

我使用的是MySQL 5.5,所以SIGNAL SQLSTATE對我有用。我可以使用它來觸發重複鍵錯誤,以便處理查詢的ON DUPLICATE KEY UPDATE部分,如果是這樣,怎麼辦?

作爲一種替代方法,我可以更新Trigger中的行並返回一個通用的錯誤條件,但我認爲ON DUPLICATE KEY UPDATE工作起來會更好(或至少更直觀)。

回答

0

REPLACE INTO。 DERP!忘了這一切。

0

嘗試觸發下方。我不擅長寫觸發器。我沒有執行下面的代碼。您可以將其用作原型。

CREATE TRIGGER checkDuplicateEntry 
    BEFORE INSERT OR UPDATE OF type, ref_id ON employees 
    DECLARE @duplicateCount INT; 
    FOR EACH ROW 
    IF (new.type <> 'single') 
     BEGIN 
      @duplicateCount = count(*) from yourTableName where type = 'single' AND refid = new.refid 
     END; 

    IF (duplicateCount > 0) 
     BEGIN 
      SIGNAL SQLSTATE VALUE '99999' 
      SET MESSAGE_TEXT = 'Duplicate Entry'; 
     END 
+0

我不認爲這會觸發'重複密鑰更新' –

+0

這將在'UPDATE'和'INSERT'之前運行。 – Sahal

+0

我認爲不是。事實上,這會觸發語法錯誤。兩次,如果我沒有弄錯。 –