【问题标题】:UNIQUE index spanning multiple tables跨多个表的唯一索引
【发布时间】:2013-12-04 15:34:33
【问题描述】:

我有以下架构。对于给定的 child.group_id、child.type 和 parent.status,如何确保 child 中的所有值都是唯一的?请注意父母和孩子之间的一对一关系。如果 parent 和 child 是一个表,一个简单的 UNIQUE 索引就可以了,但是,我希望将两个表分开。理想情况下,不会使用存储过程,但是,如有必要,我对它们持开放态度。我正在使用最新版本的 MySQL。谢谢

CREATE  TABLE IF NOT EXISTS group (
  id INT NOT NULL AUTO_INCREMENT ,
  moreData VARCHAR(45) NULL ,
  PRIMARY KEY (id) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS parent (
  id INT NOT NULL AUTO_INCREMENT ,
  status VARCHAR(45) NOT NULL ,
  moreData VARCHAR(45) NULL ,
  PRIMARY KEY (id) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS child (
  parent_id INT NOT NULL ,
  group_id INT NOT NULL ,
  type INT NOT NULL ,
  moreData VARCHAR(45) NULL ,
  PRIMARY KEY (parent_id) ,
  INDEX fk_child_group1_idx (group_id ASC) ,
  CONSTRAINT fk_child_parent
    FOREIGN KEY (parent_id )
    REFERENCES parent (id )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT fk_child_group1
    FOREIGN KEY (group_id )
    REFERENCES group (id )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

【问题讨论】:

  • 我不明白什么应该是独一无二的。 (除此之外,请尽量避免问题的混乱。当一个简单的附录refererences T(key) 足以在列声明行上时,我们不需要 5 行约束。尝试提供问题的最小示例)
  • @JoSo child.group_id、child.type 和 parent.status

标签: mysql sql database-design foreign-keys unique-index


【解决方案1】:

我认为您正在寻找类似的东西。

在“父级”中创建一个重叠约束。 (“id”列是唯一的,所以 {id, any-other-column} 也必须是唯一的。)

CREATE  TABLE IF NOT EXISTS parent (
  id INT NOT NULL AUTO_INCREMENT ,
  status VARCHAR(45) NOT NULL ,
  moreData VARCHAR(45) NULL ,
  PRIMARY KEY (id),
  UNIQUE (id, status) 
)
ENGINE = InnoDB;

在“child”中添加状态栏。

CREATE  TABLE IF NOT EXISTS child (
  parent_id INT NOT NULL ,
  parent_status VARCHAR(45) NOT NULL ,
  group_id INT NOT NULL ,
  type INT NOT NULL ,
  moreData VARCHAR(45) NULL ,

主键约束没有可以改变。

  PRIMARY KEY (parent_id) ,
  INDEX fk_child_group1_idx (group_id ASC) ,

引用这对列。

  CONSTRAINT fk_child_parent
    FOREIGN KEY (parent_id, parent_status )
    REFERENCES parent (id, status )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT fk_child_group1
    FOREIGN KEY (group_id )
    REFERENCES group (id )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION) ,

是否应该在 fk_child_parent 中级联更新取决于应用程序。考虑一下。

并在您说应该是唯一的列集上添加唯一约束。

  CONSTRAINT uq_child
    UNIQUE (group_id, type, parent_status)
    REFERENCES group (id)) 
 ENGINE = InnoDB;

【讨论】:

  • 是的,我想我需要做这样的事情。出于规范化目的,我还需要将 parent.moreData 移动到单独的表中(特别是因为它不止一列)。
【解决方案2】:

一种选择是创建before insert 触发器来执行此验证,mysql 不支持check constraints 所以这不是一个选项。

【讨论】:

    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多