2009-08-10 34 views
2

讓我們考慮一個用戶表: 用戶名,EMAIL1,EMAIL2兩列在MySQL與列1和列2之間的唯一性約束

現在,我要確保在這個表中沒有兩行有什麼常見的電子郵件地址。什麼是確保這一點的最佳方式?例如:如果表格有「Bill,bill @ email.com,bill @ gmail.com」的行,則 試圖插入一行像「Billy,billy @ yahoo.com,bill @ email.com」應該給出一個錯誤。

由於提前, Chandresh

回答

1

可悲的是,check約束不是的MySQL的一個特點。那麼,他們是,但他們被忽略。

使用trigger,而不是:

create trigger MyValidation after insert on user for each row 
begin 
    if (select count(*) from user where 
     email1 = new.email1 
     or email1 = new.email2 
     or email2 = new.email1 
     or email2 = new.email2) > 0 then 
     --I know that the delete could use this logic, but you can 
     --insert other instructions here. 

     delete from user where username = new.username 

    end if 
end 
+0

這是我提出的問題的正確答案。但不幸的是,我的要求稍有改變,因此,我將使用單獨的表格進行電子郵件用戶映射。 – Champ 2009-08-11 13:20:34

0

也許你可以使用某種類型的存儲過程,但是這可能是東西,你可以將你的數據之前檢查。

SELECT email1, email2 FROM yourTable 
WHERE email1 LIKE %@email% or email2 LIKE %@email% 
4

看起來你試圖用你的數據模型強制1:1和1:1之間的組合。您最好的選擇是分別存儲每個用戶名/電子郵件組合。一行爲「用戶名,電子郵件1」,另一行爲「用戶名,電子郵件2」。如果您有其他與「用戶名」相關的字段,那麼這些字段可能會保留在覈心用戶表中,而電子郵件則會移動到兩列電子郵件表格(用戶名,電子郵件)上具有多列唯一索引。

+0

當計劃查看此頁面尋求答案時,我只是想到了同樣的答案。我選擇這個的原因是'用戶名,電子郵件,反彈'...所以,你看我需要一個反彈旗,誰知道什麼更晚。 – Champ 2009-08-11 13:18:42

+0

噢,是的,這也可以防止用戶輸入電子郵件1和電子郵件2的相同電子郵件。 :-) – Champ 2009-08-11 13:22:35