【问题标题】:Unique constraint 'owner-owned attribute' through join table通过连接表的唯一约束“所有者拥有的属性”
【发布时间】:2017-09-08 13:31:14
【问题描述】:

我有以下场景:一个'phone'子表可以通过join表服务多个父表,如下:

CREATE TABLE phone (

    id BIGINT AUTO_INCREMENT,
    number VARCHAR(16) NOT NULL,
    type VARCHAR(16) NOT NULL,

    PRIMARY KEY(id)     

);

CREATE TABLE employee_phone (

    id BIGINT AUTO_INCREMENT,
    employee BIGINT NOT NULL,
    phone BIGINT NOT NULL,

    PRIMARY KEY(id),
    CONSTRAINT empl_phone_u_phone UNIQUE(phone),
    CONSTRAINT empl_phone_fk_employee
        FOREIGN KEY(employee)
        REFERENCES employee(id) ON DELETE CASCADE,
    CONSTRAINT empl_phone_fk_phone
        FOREIGN KEY(phone)
        REFERENCES phone(id) ON DELETE CASCADE

);

让爱丽丝和鲍勃住在同一所房子里,并成为同一家公司的员工。 HR 有两个为 Alice 注册的电话号码,而他们只有一个为 Bob 注册的电话号码,即房子的固定电话号码。 有没有办法在数据库级别强制使用此配置,不能为同一员工(或供应商,或以后出现的任何父母)重复电话号码(号码类型)?或者我会必须在应用层处理这些限制?我宁愿不使用触发器或表非规范化(如网站上的相关问题中所见,例如this one,它适用于 ID,而不适用于其他字段),但如果没有其他选择,我愿意这样做。我正在使用 MySQL。感谢您的关注。

【问题讨论】:

  • 我很困惑。 Alice 和 Bob 可以使用相同的电话号码吗?
  • @GordonLinoff 是的。例如,他们可能是住在同一所房子里的一对夫妇。 HR 需要每个人的电话号码。

标签: mysql sql unique jointable


【解决方案1】:

如果我理解正确,您只需要连接表上的唯一约束:

alter table employee_phone add constraint unq_employeephone_employee_phone unique (employee, phone);

这将防止给定员工或(具有同等约束的)供应商重复。

如果您希望所有电话号码在phone 表中都是唯一的,那么只需在phone 上放置一个唯一约束/索引:

alter table phone add constraint unq_phone_phone unique (phone);

(您可能还想包含类型)。

如果您尝试添加重复的手机,代码将返回错误。

【讨论】:

  • 谢谢。可悲的是,重复的电话号码是一种可能的情况,不能强制要求是唯一的。这就是连接表中的唯一约束仅涵盖电话列的原因(请参阅我在问题中的第一条评论)。
  • @jpangamarca 。 . .员工和电话列上join 表中的唯一约束完全符合您的要求:“在数据库级别强制要求同一员工(或供应商)不能重复电话号码(号码类型) ,或以后出现的任何父级)”。
  • 对不起,我说得不够清楚。是的,约束的工作方式与 ID 类似,但我需要的是禁止同一员工使用两个相同的数字(数字类型,让我们忘记 ID),但允许另一个员工使用相同的数字类型员工。我不能在电话表中有任何独特的约束。我现在清楚了吗?
猜你喜欢
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 2014-12-16
  • 2015-08-04
  • 1970-01-01
  • 2022-07-05
相关资源
最近更新 更多