【问题标题】:MySQL Foreign Key Constraint - Integer ColumnMySQL外键约束 - 整数列
【发布时间】:2010-10-28 20:01:03
【问题描述】:

我有一个整数列,我想在其中添加一个外键约束。唯一的问题是,如果该列没有/不需要值,默认情况下 MySQL 会输入“0”值。这显然打破了外键约束,因为主表中没有 PK 为 0 的记录。

我该如何克服这个问题?

【问题讨论】:

    标签: sql mysql foreign-keys


    【解决方案1】:

    您可能希望将外键设置为接受NULL 值,并使用NULL 而不是0 值。

    从概念上讲,NULL 表示缺少未知值。如果您的行“没有/不需要价值”,我相信 NULL 非常适合。

    是的,NULL 值不会破坏您的外键约束。

    让我们构建一个基本示例:

    CREATE TABLE parents (
       id      int PRIMARY KEY, 
       value   int
    ) ENGINE = INNODB;
    
    CREATE TABLE children (
       id         int PRIMARY KEY, 
       parent_id  int,
       FOREIGN KEY (parent_id) REFERENCES parent (id)
    ) ENGINE = INNODB;
    

    然后:

    INSERT INTO parents VALUES (1, 100);
    Query OK, 1 row affected (0.00 sec)
    
    INSERT INTO children VALUES (1, 1);
    Query OK, 1 row affected (0.00 sec)
    
    INSERT INTO children VALUES (2, 0);
    ERROR 1452 (23000): A foreign key constraint fails
    
    INSERT INTO children VALUES (2, NULL);
    Query OK, 1 row affected (0.00 sec)
    
    SELECT * FROM children;
    +----+-----------+
    | id | parent_id |
    +----+-----------+
    |  1 |         1 |
    |  2 |      NULL |
    +----+-----------+
    2 rows in set (0.01 sec)
    

    【讨论】:

      【解决方案2】:

      但是,请考虑漫长而艰难的,以允许该 FK 列为空。 Null 意味着您可以在没有父母的情况下拥有子记录。这真的是一个有效的商业案例吗?你能举一个有效的例子吗?

      此外,空 FK(或任何空列)意味着您现在正在对空值的含义做出假设。您如何判断该字段是否真的不应该具有值,而不是有人忘记输入值?您可以在应用程序中实现 Not Null 逻辑并以这种方式绕过问题,但这仍然存在风险。 比我更聪明的人说过,允许空值会导致数据库设计不太稳定。 YMMV。也许考虑一个像 -1 这样的默认值,它仍然强制一个非空 FK 并查找一个虚拟记录。

      【讨论】:

        【解决方案3】:

        也许允许在您的外键列中使用空值并将默认值设置为空值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-24
          • 1970-01-01
          • 2011-01-01
          • 2014-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多