Вопрос

Когда я выполняю следующие два запроса (я сократил их до абсолютно необходимых):

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'.

Чтобы создать внешний ключ,

<Ол>
  • и основной столбец, и столбец ссылок должны иметь одинаковое определение.
  • движок обеих таблиц должен быть InnoDB.
  • Вы можете изменить механизм таблицы с помощью этой команды, пожалуйста, сделайте резервную копию перед выполнением этой команды.

    изменить таблицу [имя таблицы] 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

    Это также может произойти, если вы не указали правильное имя столбца после " ссылки " ключевое слово.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top