ОШИБКА 1215 (HY000): невозможно добавить ограничение внешнего ключа при создании таблицы

0

Я создаю три таблицы в MySQL, это программы, индикаторы и seguimientoProgramado.

Когда я пытаюсь создать третий, я получаю эту ошибку:

ERROR 1215 (HY000): Cannot add foreign key constraint

Табличные программы:

create table programas(
    programa int not null,
    nombrePrograma varchar(60),
    primary key (programa));

Табличные индикаторы:

create table indicadores(
    programa int not null,
    indicador varchar(10) not null,
    tipo enum('blanco','gris') not null,
    nombreIndicador varchar(300),
    periodicidad enum('anual','semestral','trimestral'),
    calculo enum('sumable','masAlto'),
    correlacion varchar(1000),
    comentarioTecnico varchar(1000),
    primary key (programa,indicador,tipo),
    foreign key (programa) references programas(programa)
    );

Таблица seguimientoProgramado:

create table seguimientoProgramado(
    programa int not null,
    indicador varchar(10) not null,
    trim1 int,
    trim2 int,
    trim3 int,
    trim4 int,
    avanceProgramado int,
    primary key (programa,indicador),
    foreign key (programa) references indicadores(programa),
    foreign key (indicador) references indicadores(indicador)
    );

Что я делаю неправильно?

Теги:

1 ответ

0
Лучший ответ

Из "13.1.18.6 Использование ограничений FOREIGN KEY":

  • MySQL требует индексов на (...) ссылочных ключах (...)

У вас есть используемые индексы для indicadores.programa, потому что primary key (programa,indicador,tipo) и foreign key (programa) references programas(programa) неявно создающие индексы, а programa - их первый столбец.

Но у вас нет полезного индекса на indicadores.indicador. primary key (programa,indicador,tipo) имеет никакого эффекта здесь, потому что indicador является вторым столбцом в индексе.

Чтобы исправить это, поставьте индекс на indicadores.indicador. Например, изменив оператор CREATE для indicadores:

create table indicadores(
    programa int not null,
    ...
    comentarioTecnico varchar(1000),
    primary key (programa,indicador,tipo),
    foreign key (programa) references programas(programa),
    key (indicador)
    );

key (indicador) примечания key (indicador).

  • 0
    Огромное спасибо. Я решил это, добавив ENGINE=MyISAM в конце оператора create, но это означало изменение механизма для всех таблиц. С вашей помощью мне не нужно менять движок, и это помогло мне лучше понять, как работают индексы и ключи

Ещё вопросы

Сообщество Overcoder
Наверх
Меню