2013-04-07 31 views
0

我有一個帶有3個主鍵(我們稱之爲FirstName,SecondName,VersionID)和一個數據列(EmailAddress)的表。使用索引或觸發器來確保唯一性

我想確保當插入數據時,數據列對於前2列中的任何列都是唯一的。

即,對於FirstName,SecondName的任何組合,任何EmailAddress都是唯一的。然而,可以有同一個EmailAddress具有相同的FirstName和SecondName但是具有不同版本ID的多個值。

我最初的想法是在這些列上創建一個索引以確保唯一性,但我無法完全解決如何這樣做......然後我考慮了觸發器,但我不確定如何構造他們。

什麼是最有效的方法,我將如何繼續?

+0

您正在尋找的是多列唯一約束。 – 2013-04-07 01:06:58

+0

是的,我認爲這可能是它,但我該如何構造它?如果我在FirstName,SecondName,EmailAddress上創建索引,那麼JohnSmith和JakeSmith可以具有相同的EmailAddress – mcmillab 2013-04-07 01:09:00

回答

0
# firstname, secondname & emailaddress together must be unique 
ALTER TABLE mytable 
ADD CONSTRAINT ux_email_firstname_secondname_versionid 
UNIQUE (firstname, secondname, emailaddress); 

# emailaddress and versionid together must be unique 
ALTER TABLE mytable 
ADD CONTRAINT ex_emailaddress_versionid 
UNIQUE (emailaddress, versionid); 

這樣的事情使得三個柱頭的組合獨一無二,但是如果變化的話,它不再是一個相似的匹配。

+0

如果我在FirstName,SecondName,EmailAddress上創建索引,那麼JohnSmith和JakeSmith不能具有相同的EmailAddress?這不是我在 – mcmillab 2013-04-07 01:11:55

+0

之後@mcmillab:他們可以,但是你說數據庫中可能會有多個電子郵件,只要它們的版本ID是不同的。你可以爲'(EmailAddress,versionID)'添加另一個約束'... – 2013-04-07 01:23:50

+0

,但是然後JohnSmith版本1和JakeSmith版本2可以使用相同的電子郵件地址 – mcmillab 2013-04-07 01:30:46

0

多個唯一性約束:

ALTER TABLE your_table 
    ADD CONSTRAINT constraint_name_name UNIQUE (FirstName, SecondName, versionID , EmailAddress) 
+0

如果我在FirstName,SecondName,EmailAddress上創建一個索引,那麼JohnSmith和JakeSmith可以擁有相同的EmailAddress嗎?這不是我在 – mcmillab 2013-04-07 01:12:36

+0

@mcmillab後將4列定義爲多重唯一索引,所以應該沒問題。 – TheEwook 2013-04-07 01:18:46

+0

那麼JohnSmith版本1和JohnSmith版本2不能具有相同的電子郵件地址 – mcmillab 2013-04-07 01:31:23

0

我扔了有關觸發器的任何想法,你在說什麼。並根據您的意見,你只需要一個電子郵件地址的唯一約束。

ALTER TABLE Table_Name 
    ADD CONSTRAINT constraint_name UNIQUE (EmailAddress) 

我會反對這項建議,因爲用戶可以輸入將無法正確輸入自己的電子郵件地址,阻止其他用戶的電子郵件地址有誤。

您最好的選擇是使用由@TheEwook書面查詢:

多個唯一性約束:

ALTER TABLE your_table ADD CONSTRAINT constraint_name_name UNIQUE (名字,SecondName,VERSIONID,EmailAddress的)分享|編輯

如果你擔心有2個用戶試圖使用相同的電子郵件地址,那麼你會想通過檢查s來處理插入操作ee每個用戶的最大版本是什麼,並將該電子郵件與正在插入的電子郵件進行比較。

+0

對,這聽起來像是一個觸發器不是嗎? – mcmillab 2013-04-07 07:29:35