2013-02-22 4 views
18

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

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, 

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

+0

У меня нет никаких проблем с этим запросом .. кажется, что там может быть что-то еще –

+0

Не уверен, что вам нужно явно создать индекс для столбцов FK. У меня создалось впечатление, что создание ссылки создаст индекс. – Kermit

+0

Вывод заявлений INDEX не имеет значения. –

ответ

-1

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

+0

Это создает таблицу, не вставляя данные. Здесь нет INSERT. –

+0

Право.Это определенно проблема внешнего ключа (ошибка 105 для меня). Убедитесь, что внешний ключ и ссылочный столбец имеют одинаковые типы данных, такие как сортировка, атрибуты по умолчанию и т. Д. –

2

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

See this thread.

+0

Код был подготовлен MySQL Workbench, который, как представляется, явно добавляет его. Не то чтобы это имело значение. –

+0

@MattMcLeod Можете ли вы создать ограничения после создания таблицы? Можете ли вы также попробовать [проверить индексы] (http://stackoverflow.com/a/5213364/679449) до/после создания таблицы? – Kermit

+1

Aha! Это привело меня к тому, что, по моему мнению, является решением: в другой таблице уже было такое же ограничение, примененное re: error_id, а Workbench дал оба из тех же имен ограничений. Изменение имени ограничения позволило создать его. –

59

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

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

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

продукта -> Поставщик

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

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

Например:

catalog_supplier product_supplier

+0

Спасибо! Имела та же самая проблема и не могла понять, что с учетом массажа ошибок. Кстати, имя встречного внешнего ключа не совпадает с именем столбца, а просто для внутреннего имени MySql для ключа. – uzilan

+2

это ответ! Великий! –

+1

Вы знаете, почему это ограничение существует в MySQL? – vipw

Смежные вопросы