首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL不能应用外键约束

问MySQL不能应用外键约束
EN

Stack Overflow用户
提问于 2019-03-03 01:40:35
回答 1查看 179关注 0票数 1

我试图在phpmyadmin上创建一个数据库,但是我没有什么问题要链接我的表。这是其中的两个。

第一:

代码语言:javascript
复制
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;

第二:

代码语言:javascript
复制
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;    

然后我用这个命令将它们连接起来:

代码语言:javascript
复制
    ALTER TABLE bati
        ADD CONSTRAINT bati__code_parcelle__fkey 
        FOREIGN KEY (code_parcelle) 
        REFERENCES parcelle(code_parcelle);

我得到了一个错误:

#1215 -无法添加外键约束

我在网上寻找解决方案(包括这个MySQL不能添加外键约束),但是我不能解决我的问题,你能帮我解释一下为什么会出现这个错误吗?

(对不起,我的英语,我是法语)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-03 01:51:29

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

来自MySQL外键文档

MySQL需要对外键和引用键进行索引,这样外键检查就可以快速而不需要表扫描。在“引用”表中,必须有一个索引,其中将外键列按相同顺序列为第一列。

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

代码语言:javascript
复制
PRIMARY KEY(code, code_parcelle)

至:

代码语言:javascript
复制
PRIMARY KEY(code_parcelle, code)

随着这一变化,code_parcelle现在出现在复合索引的第一个位置,这使得将它作为外键引用成为可能。

DB Fiddle演示。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54964810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档