代码之家  ›  专栏  ›  技术社区  ›  Emma

MySQL电话表:如何为每个ID指定唯一的主要联系人号码?

  •  1
  • Emma  · 技术社区  · 15 年前

    我的表格如下:

    CREATE TABLE IF NOT EXISTS PHONES (
        number VARCHAR(10),
        id INT,
        type VARCHAR(10),
        PRIMARY KEY (number),
        FOREIGN KEY (id)
            REFERENCES TECHNICIANS(id)
            ON DELETE CASCADE
    ) ENGINE = INNODB;
    

    我想为每个id指定一个主要联系人号码。我想添加一个布尔列,但我不知道如何使它每个列只允许一个“真”值。身份证件。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Basic    15 年前

    1. 有一个布尔列,但它是由您的应用程序来维护它
    2. 有一个整数,这样您就可以存储优先级(0=prime,1=secondary,2=teeric,…),您还必须保持它
    3. 具有亲子关系,因此父(技师?)记录具有多个子(电话号码)记录。父记录还将包含主子记录的Id。唯一不好的一面是,添加记录要么是多步骤的(添加技术人员、添加电话号码、设置技术人员的主要电话号码),要么你需要一个智能DAL来帮你:)

        2
  •  2
  •   Bill Karwin    15 年前

    我会把技术人员的外键加回到手机上:

    ALTER TABLE TECHNICIANS
      ADD COLUMN primary_number VARCHAR(10),
      ADD CONSTRAINT FOREIGN KEY (primary_number) REFERENCES PHONES (number)
        ON UPDATE CASCADE
        ON DELETE SET NULL;
    

    这将创建一个循环引用:技师引用电话,电话引用技师。这是可以的,但当您执行诸如删除表、恢复备份等操作时,需要进行特殊处理。

        3
  •  1
  •   Tore A.    15 年前

    使用MySQL中的“漏洞”。MySQL文档 says :

    唯一索引创建约束 与众不同。如果您 尝试添加具有键值的新行 约束不适用于NULL 除BDB存储以外的值 引擎。对于其他发动机,独特的 索引允许多个空值

    这意味着您可以创建一个具有两个值的布尔列:true(或1)和NULL。 在该列+键上创建唯一索引。这只允许您将一条记录设置为true,但任意数量的记录都可以为NULL。