【问题标题】:One to One relationship in MySQLMySQL中的一对一关系
【发布时间】:2010-03-11 18:14:58
【问题描述】:

我正在尝试在 MySQL 数据库中建立一对一的关系。我正在使用 InnoDB 引擎,基本表如下所示:

CREATE TABLE `foo` (
  `fooID` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `name` TEXT NOT NULL
)

CREATE TABLE `bar` (
  `barName` VARCHAR(100) NOT NULL,
  `fooID` INT(11) NOT NULL PRIMARY KEY,
  CONSTRAINT `contact` FOREIGN KEY (`fooID`) REFERENCES `foo`(`fooID`)
)

现在,一旦我设置了这些,我会更改 foo 表,以便 fooID 也成为 bar 中 fooID 的外键。 我面临的唯一问题是当我尝试插入其中任何一个时都会出现完整性问题。 我需要一些帮助,谢谢。

【问题讨论】:

    标签: mysql foreign-keys


    【解决方案1】:

    关系数据库中真正的一对一关系最好通过添加一列来实现;如果每条记录总是需要这两个表中的数据,那么表应该定义为 foo (fooID, name, barname)。

    【讨论】:

    • @chris-shaffer 不幸的是,它必须是两个单独的表。不会有某种方式通过交易来做吗?谢谢
    • @Botto:正如我在另一个答案中所写的那样 - 在其他数据库中,可以推迟约束。然而,'light' MySQL 在文档中没有提及它。
    • 如果必须是两个表,选择哪个表代表实际实体,然后编写代码来处理另一个表中的记录不存在的情况。我认为这是你能做到的最好的。
    【解决方案2】:

    您可以将约束检查推迟到事务结束。但是我没有为 MySQL 找到任何东西(它不是最先进的数据库)。对于 PostgreSQL(对于其他的语法不同):

    ALTER TABLE foo ADD FOREIGN KEY (fooID) REFERENCES bar DEFERRABLE;
    

    这意味着将在事务结束时检查约束。

    如果您必须使用 MySQL,请使用 Chris Shaffer 回答。

    【讨论】:

      【解决方案3】:

      我找到了一个“hacky”的解决方案,可以使用变量foreign_key_checks

      如果将 foo 中的 fooID 更改为在 bar 中具有外键约束,则可以将其插入

      SET foreign_key_checks = 0;
      INSERT...;
      INSERT...;
      SET foreign_key_checks = 1;
      

      正如我所说的“hacky”,我可能不会在生产系统上这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-08
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多