【问题标题】:MySQL error cannot add foreign key constraintMySQL错误无法添加外键约束
【发布时间】:2013-04-05 19:36:21
【问题描述】:

怎么了?

mysql> create table price(
    -> p_code char(1) not null,
    -> p_description varchar(20),
    -> p_rentfee decimal(2,2) not null,
    -> p_dylatefee decimal(2,2));
Query OK, 0 rows affected (0.18 sec)

mysql> create table movie(
    -> mv_no char(4) not null,
    -> mv_name varchar(50) not null,
    -> mv_year char(4) not null,
    -> mv_cost decimal(2,2) not null,
    -> mv_genre varchar(15) not null,
    -> p_code char(1) not null,
    -> foreign key (p_code) references price(p_code));
ERROR 1215 (HY000): Cannot add foreign key constraint

mysql>

【问题讨论】:

  • p_code 是您的 price 表中的主键吗?
  • 这只是一个猜测,但price.p_code 和movie.p_code 不应该是它们自己表中的索引吗?

标签: mysql


【解决方案1】:

price.p_code 不是price 的主键。试试:

create table price(
p_code char(1) not null PRIMARY KEY,
p_description varchar(20),
p_rentfee decimal(2,2) not null,
p_dylatefee decimal(2,2));

一般来说,外键必须引用一个主/唯一键、一个完整的主/唯一键,并且只能引用一个主/唯一键。

在某些 RDBMS 中,例如 SQL Server,您可以引用具有唯一 索引(非键)的列(请参阅 can we have a foreign key which is not a primary key in any other table?),但这不是- 标准行为。

【讨论】:

    【解决方案2】:
    • Engine 应该是相同的 e.g. InnoDB
    • Datatype 应该相同,并且具有相同的长度。 例如VARCHAR(20)
    • Collat​​ion 列字符集应该相同。 例如utf8
      注意:即使您的表具有相同的排序规则,列仍然可能具有不同的排序规则。
    • 唯一 - 外键应指被引用表中唯一的字段(通常是主键)。

    【讨论】:

    • 感谢您提供这些有用的详细信息。有同样的问题。我用DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 创建了一个表,而引用的表仅用DEFAULT CHARSET=utf8mb4 创建。使用相同的排序规则,一切都按预期工作。 :)
    【解决方案3】:

    p_code 应该是price 表中的主键:

    create table price(
    -> p_code char(1) not null,
    -> p_description varchar(20),
    -> p_rentfee decimal(2,2) not null,
    -> p_dylatefee decimal(2,2),
    -> PRIMARY KEY ( p_code ));
    

    【讨论】:

      【解决方案4】:

      将 p_code 设置为键,将其设置为 唯一键 或 主键。

      【讨论】:

        【解决方案5】:
        1. 引用的列price.p_code 必须是唯一的(需要创建主键或唯一键)。
        2. 两个表都必须是InnoDb表,在CREATE TABLE语句中使用ENGINE = INNODB。

        【讨论】:

          【解决方案6】:

          子列的数据类型必须与父列完全匹配。例如,由于 price.p_code 是 char(1),movie.p_code 也需要是 char(1),price.p_code 需要是主键或需要创建索引。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-02
            • 2018-04-28
            相关资源
            最近更新 更多