1

我的表如下:

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 指定一个主要联系号码。我正在考虑添加一个布尔列,但我不知道如何让它只允许一个“真实”值。ID。

4

3 回答 3

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;

这会创建一个循环引用:技术人员引用电话,电话引用技术人员。这没关系,但是当您执行删除表、恢复备份等操作时需要特殊处理。

于 2010-08-16T23:41:45.240 回答
1

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

  1. 有一个布尔列,但由您的应用程序来维护它
  2. 有一个整数,所以你再次存储优先级(0=prime,1=secondary,2=tertiary,...)你必须维护它
  3. 具有父子关系,因此父(技术员?)记录具有多个子(电话号码)记录。然后父记录也将包含主要子记录的 ID。唯一的缺点是添加记录要么变成多步骤(添加技术人员,添加电话号码,为技术人员设置主要电话号码),要么您需要一个智能 DAL 来为您完成:)

顺便说一句,我假设您实际上是指每个 TechnicianId 而不是每个 PhoneId 的一个主号码

于 2010-08-16T23:37:28.603 回答
1

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

UNIQUE 索引创建一个约束,使得索引中的所有值都必须是不同的。如果您尝试使用与现有行匹配的键值添加新行,则会发生错误。此约束不适用于 NULL 值,但 BDB 存储引擎除外。对于其他引擎,UNIQUE 索引允许包含 NULL 的列有多个 NULL 值。

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

于 2010-08-16T23:59:15.533 回答