通过连接表的唯一约束“所有者拥有的属性”

时间:2017-04-12 16:36:39

标签: mysql sql unique jointable

我有以下场景:'phone'子表可以通过连接表提供多个父表,如下所示:

enter image description here

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

);

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

1 个答案:

答案 0 :(得分:0)

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

$("#order_form").submit(function(event){

  if(! $("#firstName").val() ){
  formSubmissionOK = false;
    $("#firstNameError").text("Error: You have submited without inputting your name.");
  }

  if(formSubmissionOK == false){
    event.preventDefault();
  }
});





$("#flag").change(function(){
  var productCost = $(this).data("cost");
  var subtotal = productCost * $(this).val();
  $("#flagTotal").text(subtotal);
});

$("#wine").change(function(){
  var productCost = $(this).data("cost");
  var subtotal = productCost * $(this).val();
  $("#wineTotal").text(subtotal);
});

这将防止给定员工或(使用等效约束)供应商的重复。

如果您希望alter table employee_phone add constraint unq_employeephone_employee_phone unique (employee, phone); 表中的所有电话号码都是唯一的,那么只需在phone上添加唯一约束/索引:

phone

(您可能也希望包含该类型)。

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