mysql - 如何修复创建外部约束时的索引错误

标签 mysql foreign-keys

我试图通过MySQL创建两个关系,当我创建第二个关系“t2”时,我向第一个关系“t1”添加了一个外部约束。

第一个表“t1”已成功构建,但在创建第二个表时显示“错误代码:1822。无法添加外键约束。引用表“t1”中缺少约束“FK2”的索引”表“t2”。

我检查了一些像我这样的问题,一些解决方案是第一个表中引用的属性应该是唯一的或主键。但“Mon”已经是第一个表中的PK了。

我的代码有什么问题?

create table t1
( Num       INT(10)        NOT NULL,
  Mon       VARCHAR(7)        NOT NULL,

  CONSTRAINT PK1 PRIMARY KEY (Num, Mon)
);

CREATE TABLE t2
( Num        INT(10)        NOT NULL,
  Mon       VARCHAR(7)        NOT NULL,
  Totle_Income        Decimal(9,2)   DEFAULT 0,
  CONSTRAINT PK2 PRIMARY KEY (Num, Mon),
  CONSTRAINT FK1 FOREIGN KEY (Num) REFERENCES t1(Num)
                       ON DELETE CASCADE      ON UPDATE CASCADE,
  CONSTRAINT FK2 FOREIGN KEY (Mon) REFERENCES t1(Mon)
                       ON DELETE CASCADE       ON UPDATE CASCADE
 );

最佳答案

t1.mon 只是主键的第二个组成部分,因此也只是索引的第二个组成部分。这并不能有效地索引 t1.mon,它必须是索引的第一个或唯一的组成部分。

但您可能想要引用完整的 key 。因此外键约束应该包括两列,而不是对键的每个部分都有两个约束。

...
CONSTRAINT FK1
           FOREIGN KEY (Num,
                        Mon)
                       REFERENCES t1
                                  (Num,
                                   Mon)
                       ON DELETE CASCADE
                       ON UPDATE CASCADE,
...

关于mysql - 如何修复创建外部约束时的索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55421148/

相关文章:

mysql - 忽略不匹配的表

php - 如何使用foreach进行多次插入和删除

vb.net - 在标签中显示 MySQL 数据 - Vb.Net

python - 在sqlalchemy中插入具有一对多关系的新记录

MySQL DB 忽略外键约束

c# - 如何使用外键关联到不同表的 ID

mysql - 仅当不再引用其他表时才删除条目

mysql - 在没有安装mysql的情况下在unix bash中运行mysql命令?

mysql - 简单添加外键返回#1215 无法添加外键约束

php - LEFT JOIN 不显示 NULL 结果