我正在尝试在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),但无法解决我的问题,能否帮助我/解释为什么出现此错误。
(对不起,我的英语,我是法语)
最佳答案
您需要在要引用的列上建立索引,或者至少它必须出现在多列索引的第一位置。
从the MySQL foreign keys documentation:
MySQL需要在外键和引用键上建立索引,以便外键检查可以快速进行,而无需进行表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列。
我认为这里最简单的解决方案是更改表parcelle
的主键中列的顺序,即更改:
PRIMARY KEY(code, code_parcelle)
至:
PRIMARY KEY(code_parcelle, code)
通过此更改,
code_parcelle
现在出现在复合索引的第一个位置,这使得可以将其引用为外键。Demo on DB Fiddle。
注意:创建一个单独的表存储
code_parcelle
,然后从所有其他表中引用它可能是一个好主意。关于mysql - MySQL不能应用外键约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54964810/