MySQL не может применить ограничение внешнего ключа - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь создать базу данных на 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Добавьте ограничение внешнего ключа ), но я не могу решить мою проблему, вы можете мне помочь / объяснить, почему эта ошибка.

(извините за мой английский, я француз)

1 Ответ

0 голосов
/ 03 марта 2019

Вам нужен индекс для столбца, на который ссылаются, или, по крайней мере, он должен появиться на первой позиции в многостолбцовом индексе.

С Документация по внешним ключам MySQL :

MySQL требует индексов внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы.В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке.

Я думаю, что самым простым решением здесь было бы изменить порядокстолбцы в первичном ключе таблицы parcelle, то есть изменение:

PRIMARY KEY(code, code_parcelle)

Кому:

PRIMARY KEY(code_parcelle, code)

С этим изменением code_parcelle теперь появляется в первой позиции в составноминдекс, который позволяет ссылаться на него как на внешний ключ.

Демонстрация на DB Fiddle .

Примечание: это, вероятно, будетХорошая идея - создать отдельную таблицу для хранения code_parcelle, а затем обратиться к ней из всех других таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...