【发布时间】:2012-03-08 19:48:00
【问题描述】:
我有 2 张桌子,客户和附属公司。我需要确保customers.email 和affiliates.email 是专有的。换句话说,一个人不能既是客户又是附属公司。它基本上与外键相反。有没有办法做到这一点?
【问题讨论】:
我有 2 张桌子,客户和附属公司。我需要确保customers.email 和affiliates.email 是专有的。换句话说,一个人不能既是客户又是附属公司。它基本上与外键相反。有没有办法做到这一点?
【问题讨论】:
您可以使用存储电子邮件并对电子邮件具有唯一约束的表,并从客户和附属公司引用该表。(仍然需要确保没有 2 条记录引用相同键)
您可以在插入之前和更新之前使用触发器来检查电子邮件是否不存在。
或者您可以将此验证留给应用程序逻辑 - 不在数据库中,而是在应用程序代码中。
【讨论】:
没有可以用来执行此操作的键,但听起来您不应该使用两个表。相反,您可以有一个包含客户/附属公司数据的表(需要在此表中唯一)和另一个具有类型(客户/附属公司)的表。
CREATE TABLE People (
pplid,
pplEmail,
ptid,
UNIQUE KEY (pplEmail)
)
CREATE TABLE PeopleType (
ptid,
ptType
)
INSERT INTO PeopleType VALUES (1, 'affiliates'), (2, 'customers');
【讨论】:
enum)。取决于你想变得多么正常:)
您可以尝试以下方法。 创建一个新表,它将作为客户和附属公司的主表:
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
这样每一方只能是一种类型
【讨论】: