Ошибка MySQL 150 - Внешние ключи
-
05-07-2019 - |
Вопрос
Когда я выполняю следующие два запроса (я сократил их до абсолютно необходимых):
mysql> CREATE TABLE foo(id INT PRIMARY KEY);
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE bar ( id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB;
Я получаю следующую ошибку:ОШИБКА 1005 (HY000):Не удается создать таблицу './test/bar.frm' (ошибка отсутствует:150)
Где, черт возьми, моя ошибка?Я не нашел его, пока смотрел на это в течение получаса.
Решение
Из FOREIGN KEY код> Ограничения
Если вы воссоздаете таблицу, которая была упал, оно должно иметь определение соответствует внешнему ключу ограничения, ссылающиеся на это. Это должно иметь правильные имена и типы столбцов, и он должен иметь индексы на ссылочные ключи, как указано ранее. Если они не удовлетворены, MySQL возвращает ошибка номер 1005 и относится к ошибке 150 в сообщении об ошибке.
Мое подозрение заключается в том, что вы не создали foo
как InnoDB, так как все остальное выглядит хорошо.
Изменить: с той же страницы -
Обе таблицы должны быть таблицами InnoDB, и они не должны быть временными таблицами. Р>
Другие советы
Вы можете использовать команду SHOW ENGINE INNODB STATUS
для получения более конкретной информации об ошибке.
В результате появится столбец Status
, содержащий много текста.
Найдите раздел с именем LATEST FOREIGN KEY ERROR, который, например, может выглядеть следующим образом:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
190215 11:51:26 Error in foreign key constraint of table `mydb1`.`contacts`:
Create table `mydb1`.`contacts` with foreign key constraint failed. You have defined a SET NULL condition but column 'domain_id' is defined as NOT NULL in ' FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT' near ' ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT'.
Чтобы создать внешний ключ,
<Ол>Вы можете изменить механизм таблицы с помощью этой команды, пожалуйста, сделайте резервную копию перед выполнением этой команды.
изменить таблицу [имя таблицы] ENGINE = InnoDB;
У меня была такая же проблема, у тех, у кого это тоже возникает:
проверьте название таблицы, на которую ссылается таблица
Я забыл букву "s" в конце названия моей таблицы
например, клиент таблицы -> Клиенты
:)
Помимо многих других причин, в результате мы видим ошибку MySql 150 (при использовании InnoDB). Одной из вероятных причин является неопределенный KEY
в операторе создания таблицы, содержащей имя столбца, на которое ссылаются в качестве внешнего ключа в относительной таблице.
Допустим, оператор создания главной таблицы -
CREATE TABLE 'master_table' (
& nbsp; 'id' int (10) NOT NULL AUTO_INCREMENT,
& nbsp; 'record_id' char (10) NOT NULL,
& nbsp; 'name' varchar (50) NOT NULL DEFAULT '',
& nbsp; 'address' varchar (200) NOT NULL DEFAULT '',
& nbsp; ПЕРВИЧНЫЙ КЛЮЧ ('id')
) ENGINE = InnoDB CHARSET ПО УМОЛЧАНИЮ = utf8;
и синтаксис создания для таблицы относительной таблицы, в которой ограничение внешнего ключа установлено из первичной таблицы -
CREATE TABLE'lative_table '(
& nbsp; 'id' int (10) NOT NULL AUTO_INCREMENT,
& nbsp; 'salary' int (10) NOT NULL DEFAULT '',
& nbsp; 'grade' char (2) NOT NULL DEFAULT '',
& nbsp; 'record_id' char (10) DEFAULT NULL,
& nbsp; ПЕРВИЧНЫЙ КЛЮЧ ('id'),
& nbsp; CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') ССЫЛКИ 'master' ('record_id')
) ENGINE = InnoDB CHARSET ПО УМОЛЧАНИЮ = utf8;
Этот сценарий определенно завершится с ошибкой MySql 150 при использовании InnoDB.
Чтобы решить эту проблему, нам нужно добавить KEY
для столбца record_id
в таблице master_table
, а затем ссылку в относительная таблица
для использования в качестве постороннего ключа.
Наконец, оператор создания для master_table
будет -
CREATE TABLE 'master_table' (
& nbsp; 'id' int (10) NOT NULL AUTO_INCREMENT,
& nbsp; 'record_id' char (10) NOT NULL,
& nbsp; 'name' varchar (50) NOT NULL DEFAULT '',
& nbsp; 'address' varchar (200) NOT NULL DEFAULT '',
& nbsp; ПЕРВИЧНЫЙ КЛЮЧ ('id'),
& nbsp; KEY 'record_id' ('record_id')
) ENGINE = InnoDB CHARSET ПО УМОЛЧАНИЮ = utf8;
У меня была та же проблема, и причина была в "сопоставлении" колонн было по другому. Один был латинским, а другой - utf8
Это также может произойти, если вы не указали правильное имя столбца после " ссылки " ключевое слово.