Внешние ключи в MySQL должны ссылаться на столбец в другой таблице, у которой есть индекс, в идеале уникальный индекс.Это обычно происходит, когда этот другой столбец является первичным ключом, но он также не может быть первичным ключом, пока существует индекс.В вашем текущем коде вы сделали первичный ключ из пяти столбцов:
CONSTRAINT PK_date PRIMARY KEY (dateID, annee, mois, semaine, jour)
Но все это означает, что каждая комбинация этих пяти значений вместе должна быть уникальной.Это не означает, что любой из столбцов имеет индекс.
Непосредственная проблема, которую я вижу в вашем коде, заключается в том, что вы ссылаетесь на annee
и mois
из таблицы astreinte_mensu
.Мы можем попробовать добавить уникальные ограничения для этих столбцов.Вот версия вашего кода, которая может работать:
CREATE TABLE date (
dateID int NOT NULL,
annee int NOT NULL,
mois int NOT NULL,
semaine int NOT NULL,
jour int NOT NULL,
CONSTRAINT PK_date PRIMARY KEY (dateID, annee, mois, semaine, jour),
UNIQUE KEY idx_annee (annee),
UNIQUE KEY idx_mois (mois)
) Engine=innoDB;
CREATE TABLE astreinte_mensu (
annee int,
mois int,
Personne1Nuit int,
Personne2Nuit int,
Personne1Jour int,
Personne2Jour int,
FOREIGN KEY (annee) REFERENCES date(annee),
FOREIGN KEY (mois) REFERENCES date(mois),
FOREIGN KEY (Personne1Nuit) REFERENCES contact(PersonID),
FOREIGN KEY (Personne2Nuit) REFERENCES contact(PersonID),
FOREIGN KEY (Personne1Jour) REFERENCES contact(PersonID),
FOREIGN KEY (Personne2Jour) REFERENCES contact(PersonID)
) Engine=innoDB;
Я предполагаю, что в таблице contact
есть столбец PersonID
, который является уникальным.Если нет, то это станет еще одной причиной ошибки.