Подтвердить что ты не робот

Ошибка MySQL 1022 при создании таблицы

MySQL Workbench разработал следующий SQL для создания таблицы:

CREATE  TABLE IF NOT EXISTS `mydb`.`errors_reports` (
   `error_id` INT NOT NULL ,
   `report_short` VARCHAR(15) NOT NULL ,
PRIMARY KEY (`error_id`, `report_short`) ,
INDEX `error_id_idx` (`error_id` ASC) ,
INDEX `report_short_idx` (`report_short` ASC) ,
CONSTRAINT `error_id`
   FOREIGN KEY (`error_id` )
   REFERENCES `mydb`.`errors` (`error_id` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION,
CONSTRAINT `report_short`
   FOREIGN KEY (`report_short` )
   REFERENCES `mydb`.`reports` (`report_short` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)
ENGINE = InnoDB

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

Но этот...

ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports'

Я не могу для жизни меня видеть здесь дубликаты ключей. Там определен только один ключ!

Я запускаю MySQL 5.6 со свежей установкой по умолчанию. В журнале ошибок ничего нет.

Идеи?

Изменить: через процесс устранения (возвращаясь к самому простому определению таблицы, а затем постепенно добавляя бит) проблема кажется такой бит:

CONSTRAINT `error_id`
    FOREIGN KEY (`error_id` )
    REFERENCES `mydb`.`errors` (`error_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,

что особенно странно, поскольку в нескольких других определениях таблиц есть одинаковый код, и это совершенно нормально!

4b9b3361

Ответ 1

Проблема заключается в том, что имя внешнего ключа не может быть тем же, что и другой внешний ключ во всей модели.

Представьте себе эту ситуацию

Каталог → Поставщик

Продукт → Поставщик

если имя внешнего ключа в таблице "Каталог для поставщика" является "поставщиком", и вы присвоили одно и то же имя в таблице продуктов, тогда имена внешних ключей будут "сталкиваться".

Вам нужно назвать их по-другому..

Например:

catalog_supplier product_supplier

Ответ 2

Кажется, вы создаете индекс для столбцов внешнего ключа. При создании внешнего ключа в InnoDb каждый будет создан автоматически.

См. эту тему.

Ответ 3

Попробуйте использовать INSERT IGNORE вместо INSERT, где INSERT IGNORE не будет вставлять новую строку, если найден дубликат первичного ключа. Это должно помочь решить проблему временно, но я бы рекомендовал обрезать таблицу.