2012-03-08 40 views
0

我有2個表,客戶和分支機構。我需要確保customers.email和affiliates.email是獨佔的。換句話說,一個人不能既是顧客又是會員。它基本上與外鍵相反。有沒有辦法做到這一點?mysql對外鍵

回答

1

您可以使用存儲電子郵件和對電子郵件唯一約束的表,並從客戶和會員引用該表。 (仍然需要確保沒有引用相同密鑰的2條記錄)

您可以在插入之前和更新之前使用觸發器來檢查電子郵件是否不存在。

或者您可以將此驗證留給應用程序邏輯 - 不是在數據庫中,而是在應用程序中。

+1

您的第一個解決方案如何防止客戶表和關聯公司表引用電子郵件表中的單個記錄? – octern 2012-03-08 20:02:26

+0

是的,我同意octern。但你的答案的第二部分是合法的。將它留給應用程序邏輯(在插入新記錄之前運行檢查)似乎是最簡單的方法。編輯你的答案,我會接受它。 – user617123 2012-03-08 20:36:32

+0

@ user617123筆記記錄,回答編輯。 – 2012-03-08 20:43:22

1

沒有關鍵你可以做到這一點,但它聽起來像你不應該使用兩個表。相反,您可以擁有一個包含客戶/關聯企業數據(在此表中必須是唯一的)和另一個具有類型(客戶/關聯企業)的表。

CREATE TABLE People (
    pplid, 
    pplEmail, 
    ptid, 
    UNIQUE KEY (pplEmail) 
) 
CREATE TABLE PeopleType (
    ptid, 
    ptType 
) 
INSERT INTO PeopleType VALUES (1, 'affiliates'), (2, 'customers'); 
+0

雖然它並不像歸一化,你也可以在列客戶爲0,子公司爲1。 – 2012-03-08 19:52:49

+0

@ Fls'Zen或多或少是一樣的(例如,你也可以使用'enum')。取決於你想成爲多麼正常:) – 2012-03-08 19:58:11

+0

你基本上已經把客戶和聯營公司合併成一張桌子(人)。問題在於客戶和分支機構的領域非常不同,所以這對我並不適用。 – user617123 2012-03-08 20:28:26

0

您可以嘗試以下操作。 創建新表,這將是爲客戶和分支機構主:

CREATE TABLE party 
( 
    id int not null auto_increment primary key , 
    party_type enum('customer','affiliate') not null, 
    email varchar(100), 
    UNIQUE (id,party_type) 
); 
--Then 
CREATE TABLE customer 
(
    .... 
    party_id INT NOT NULL, 
    party_type enum('customer') NOT NULL DEFAULT 'customer', 
    PRIMARY KEY (party_id,party_type) 
    FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type) 
); 
CREATE TABLE affiliates 
(
    .... 
    party_id INT NOT NULL, 
    party_type enum('affiliate') NOT NULL DEFAULT 'affiliate', 
    PRIMARY KEY (party_id,party_type) 
    FOREIGN KEY (party_id,party_type) REFERENCES party(id,party_type) 
) 
-- enum is used because mysql still doesn't have CHECK constraints 

這樣,每一方都只能是一個類型的