MySQL不能应用外键约束

时间:2019-03-03 01:40:35

标签: mysql sql foreign-keys

我正在尝试在phpmyadmin上建立数据库,但是我在链接表方面遇到了一些问题。这是其中两个。

第一:

CREATE TABLE IF NOT EXISTS bati(
    code_bati CHAR(50) NOT NULL,
    code_parcelle CHAR(50) NOT NULL,
    surface_bati DOUBLE(15,2),
    ID_proprietaire CHAR(50),
    largeur DOUBLE(15,2),
    superficie DOUBLE(15,2),
    orientation CHAR(2),
    vocation VARCHAR(50),
    globalid VARCHAR(50),
    date_save DATE NOT NULL,
    date_last_mod DATE NOT NULL,
    ID_interne CHAR(50) NOT NULL,
    PRIMARY KEY(code_bati, code_parcelle)
)ENGINE = INNODB;

第二:

CREATE TABLE IF NOT EXISTS parcelle(
    fid_edi_parc INT UNSIGNED,
    code_lot CHAR(50),
    ID_parc CHAR(50),
    num SMALLINT(4),
    code_com CHAR(50),
    code_sec CHAR(50),
    code_sub_sec CHAR(50),
    figplan VARCHAR(50),
    code_apart VARCHAR(50),
    code_modif VARCHAR(50),
    code CHAR(50),
    code_parcelle CHAR(50),
    fid_perimetre_ppr DOUBLE(15,2),
    globalID CHAR(50),
    date_save DATE NOT NULL,
    date_last_mod DATE NOT NULL,
    ID_interne CHAR(50) NOT NULL,
    PRIMARY KEY(code, code_parcelle)
)ENGINE = INNODB;    

然后我执行此命令来链接它们:

    ALTER TABLE bati
        ADD CONSTRAINT bati__code_parcelle__fkey 
        FOREIGN KEY (code_parcelle) 
        REFERENCES parcelle(code_parcelle);

我收到此错误:

  

#1215-无法添加外键约束

我正在互联网上寻找解决方案(包括此MySQL Cannot Add Foreign Key Constraint),但我无法解决问题,请您帮我/解释为什么会出现此错误。

(抱歉我的英语,我是法语)

1 个答案:

答案 0 :(得分:0)

您需要在要引用的列上建立索引,或者至少它必须出现在多列索引的第一位置。

来自the MySQL foreign keys documentation

  

MySQL要求在外键和引用键上建立索引,以便外键检查可以快速进行,而无需进行表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列。

我认为,这里最简单的解决方案是更改表io.unsafeRunSync()的主键中列的顺序,即更改:

parcelle

收件人:

PRIMARY KEY(code, code_parcelle)

通过此更改,PRIMARY KEY(code_parcelle, code) 现在出现在复合索引的第一个位置,这使得可以将其引用为外键。

Demo on DB Fiddle

注意:创建一个单独的表来存储code_parcelle,然后从所有其他表中引用它可能是一个好主意。