Почему мой MySQL выдает «ОШИБКА 1215 (HY000): не удается добавить ограничение внешнего ключа»

#mysql #sql #foreign-keys #create-table

#mysql #sql #внешние ключи #создать таблицу

Вопрос:

Получена ошибка:

ERROR 1215 (HY000): Cannot add foreign key constraint

Код:

 CREATE TABLE servers (
    serverID varchar(20) NOT NULL,
    serverPrefix varchar(1) NOT NULL,
    captchaEnabled boolean NOT NULL,
    giveawayEnabled boolean NOT NULL,
    pollsEnabled boolean NOT NULL,
    reactRolesEnabled boolean NOT NULL,
    serverStatsEnabled boolean NOT NULL,
    storyTimeEnabled boolean NOT NULL,
    suggestionsEnabled boolean NOT NULL,
    welcomeEnabled boolean NOT NULL,
    captchaChannelID varchar(20),
    storyTimeChannelID varchar(20),
    suggestionsChannelID varchar(20),
    reportChannelID varchar(20),
    PRIMARY KEY (serverID)
);

CREATE TABLE welcomeMessage(
    welcomeMessageID int NOT NULL AUTO_INCREMENT,
    serverID varchar(20) NOT NULL, 
    `description` varchar(300), 
    instruction varchar(300), 
    footer varchar(100), 
    welcomeChannelID varchar(20), 
    DM boolean NOT NULL, 
    PRIMARY KEY (welcomeMessageID), 
    FOREIGN KEY (`serverID`) REFERENCES servers (`serverID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
  

Ошибка выдается при «CREATE TABLE welcomeMessage». Я попытался отделить create от внешнего ключа с помощью:

 ALTER TABLE welcomeMessage ADD FOREIGN KEY (`serverID`) REFERENCES servers(`serverID`);
  

Однако он просто создает таблицу, а затем выдает ошибку в строке «Изменить».
Любая помощь приветствуется.

Комментарии:

1. ПОЖАЛУЙСТА, всегда показывайте нам ВСЕ сообщение об ошибке, а не бит или резюме. Обычно во всех частях сообщения об ошибке есть что-то полезное

2. Может быть, это потому, что вы указываете InnoDB только для welcomeMessage, а не для серверов?

3. Моя ставка на это заключается в том, что вы не указали механизм таблицы для таблицы servers, которая по умолчанию имеет значение MYISAM

4. @JeffHolt опередил меня в этом: D

5. Готов поспорить, что ваш тип базы данных по умолчанию — MYISAM!! Смотрите выше ^^^^ для получения дополнительной информации

Ответ №1:

Проблема в кодировке и сопоставлении. Чтобы внешний ключ был правильно сформирован, как родительский, так и дочерний столбцы должны иметь одинаковую кодировку и параметры сортировки. Первое утверждение опирается на настройки по умолчанию, в то время как второе имеет явные настройки. Если они отличаются от значений по умолчанию, происходит сбой.

Ваш код работает, если я просто закомментирую charset .... collate ... часть второго create table оператора, как вы можете видеть в этом скрипте db.

Оба механизма хранения также должны быть выровнены. Если ваша база данных использует MyISAM в качестве движка по умолчанию, код также не будет работать (поскольку второе утверждение явно использует InnoDB).

Комментарии:

1. Большое вам спасибо. Я добавил его в таблицу сервера, поскольку это необходимо для хранения некоторых данных. Не знал, что они должны быть одинаковыми. Ценю это 🙂