mysql对应外键

时间:2012-03-08 19:48:01

标签: mysql key

我有2张桌子,客户和附属机构。我需要确保customers.email和affiliates.email是独家的。换句话说,一个人不能既是客户又是联盟会员。它基本上与外键相反。有没有办法做到这一点?

3 个答案:

答案 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  

这样每一方只能是一种类型