我有2张桌子,客户和附属机构。我需要确保customers.email和affiliates.email是独家的。换句话说,一个人不能既是客户又是联盟会员。它基本上与外键相反。有没有办法做到这一点?
答案 0 :(得分:1)
你可以使用没有键,但听起来你不应该使用两个表。相反,您可以拥有一个表,其中包含客户/会员数据(在此表中需要唯一)和另一个具有类型(客户/会员)的表。
CREATE TABLE People (
pplid,
pplEmail,
ptid,
UNIQUE KEY (pplEmail)
)
CREATE TABLE PeopleType (
ptid,
ptType
)
INSERT INTO PeopleType VALUES (1, 'affiliates'), (2, 'customers');
答案 1 :(得分:1)
您可以使用存储电子邮件的表格,并对电子邮件具有唯一约束,并从客户和关联公司引用该表。(仍需确保没有2条记录引用该电子邮件)键)
您可以在插入前和更新前使用触发器来检查电子邮件是否不存在。
或者您可以将此验证留给应用程序逻辑 - 不在数据库中,而是在应用程序中。
答案 2 :(得分: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
这样每一方只能是一种类型