【问题标题】:mysql opposite of foreign key与外键相反的mysql
【发布时间】:2012-03-08 19:48:00
【问题描述】:

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

【问题讨论】:

    标签: mysql key


    【解决方案1】:

    您可以使用存储电子邮件并对电子邮件具有唯一约束的表,并从客户和附属公司引用该表。(仍然需要确保没有 2 条记录引用相同键)

    您可以在插入之前和更新之前使用触发器来检查电子邮件是否不存在。

    或者您可以将此验证留给应用程序逻辑 - 不在数据库中,而是在应用程序代码中。

    【讨论】:

    • 您的第一个解决方案如何防止客户表和附属公司表同时引用电子邮件表中的单个记录?
    • 是的,我同意 octern。但是您答案的第二部分是合法的。将其留给应用程序逻辑(在插入新记录之前运行检查)似乎是最简单的方法。编辑您的答案,我会接受。
    【解决方案2】:

    没有可以用来执行此操作的键,但听起来您不应该使用两个表。相反,您可以有一个包含客户/附属公司数据的表(需要在此表中唯一)和另一个具有类型(客户/附属公司)的表。

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

    【讨论】:

    • 虽然它没有完全标准化,但您也可以在表中有一列,0 代表客户,1 代表附属公司。
    • @Fls'Zen 大致相同(例如,您也可以使用enum)。取决于你想变得多么正常:)
    • 您基本上已将客户和附属公司合并到一张表(人员)中。问题是客户和附属公司有非常不同的领域,所以这对我来说真的不起作用。
    【解决方案3】:

    您可以尝试以下方法。 创建一个新表,它将作为客户和附属公司的主表:

    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  
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2012-01-29
      相关资源
      最近更新 更多