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

时间:2010-08-16 23:33:44

标签: mysql database create-table

我的表格如下:

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

答案 0 :(得分:2)

我将一个来自TECHNICIANS的外键添加回PHONES:

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;

这创建了一个周期性参考:技术人员参考电话,电话参考技术人员。这没关系,但是在执行诸如删除表,恢复备份等操作时需要特殊处理。

答案 1 :(得分:1)

你基本上有3个选择......

  1. 有一个布尔列,但由应用程序来维护它
  2. 有一个整数,所以你再次存储优先级(0 =黄金,1 =二级,2 =三级......),你将不得不维护它
  3. 有父子关系,所以父母(技师?)记录有多个子(电话号码)记录。然后,父记录还将包含主子记录的Id。唯一的缺点是添加记录要么是多步骤(添加技术人员,添加电话号码,为技术人员设置主要电话号码),或者您需要一个智能DAL,它可以为您完成:)
  4. 顺便提一下,我假设你实际上是指每个Technician的一个主要数字而不是每个PhoneId

答案 2 :(得分:1)

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

  

UNIQUE索引创建约束   这样索引中的所有值都必须   与众不同。如果你发生错误   尝试添加具有键值的新行   与现有行匹配。这个   约束不适用于NULL   除BDB存储之外的值   发动机。对于其他引擎,一个独特的   index允许多个NULL值   可以包含NULL的列。

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