代码之家  ›  专栏  ›  技术社区  ›  motia

一对一和一对多关系

  •  0
  • motia  · 技术社区  · 9 年前

    MySQL Workbench

    使用Mysql Workbench,我发现one_to_one表和one_to.many表的sql类似。两者都使用非唯一外键来实现它们的关系。

        CREATE TABLE IF NOT EXISTS `mydb`.`one_to_one` (
          `id` INT NOT NULL,
          `parent_id` INT NOT NULL,
          PRIMARY KEY (`id`, `parent_id`),
          INDEX `fk_one_to_one_parent1_idx` (`parent_id` ASC),
          CONSTRAINT `fk_one_to_one_parent1`
            FOREIGN KEY (`parent_id`)
            REFERENCES `mydb`.`parent` (`id`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION)
        ENGINE = InnoDB
    

    因此,我可以在one_to_one表中插入引用父表中同一行的行,就像one_to_many表一样。

    这不是对一对一关系的侵犯吗?或者我应该用唯一的外键定义一对一关系吗?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Tung Nguyen    9 年前

    外键约束仅检查表one_to_one中parent_id列的值是否存在于父表中。 您可以通过在one_to_one表中为parent_id添加唯一索引来处理这个问题。

    ALTER TABLE `mydb`.`one_to_one` 
    ADD UNIQUE INDEX `parent_id_UNIQUE` (`parent_id` ASC);