Я создаю три таблицы в 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)
);
Что я делаю неправильно?
Из "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)
.
ENGINE=MyISAM
в конце оператора create, но это означало изменение механизма для всех таблиц. С вашей помощью мне не нужно менять движок, и это помогло мне лучше понять, как работают индексы и ключи