MySQL Error 1005: ограничение внешнего ключа сформировано неправильно - PullRequest
0 голосов
/ 13 июня 2018

Я работаю над базой данных с MySQL, у меня есть основная календарная таблица дата , в которой некоторые столбцы (год и месяц) совместно используются с другим astreinte_mensu , я создал ПЕРВИЧНЫЙКЛЮЧИ успешно, но когда я пришел сделать ИНОСТРАННЫЕ КЛЮЧИ, я получил следующую ошибку:

ERROR 1005 (HY000) at line 33: Can't create table `testDB`.`astreinte_mensu`
(errno: 150 "Foreign key constraint is incorrectly formed")

Подробный вывод ошибки:

Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.

Таблица дат:

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)
) Engine=innoDB;

Astreinte_mensu table:

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;

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

Кто-нибудь знает, что может бытьнеправильно ??

Заранее спасибо

1 Ответ

0 голосов
/ 13 июня 2018

Внешние ключи в 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, который является уникальным.Если нет, то это станет еще одной причиной ошибки.

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