2012-03-08 77 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 

这样,每一方都只能是一个类型的