ti-enxame.com

Erro do MySQL 1022 ao criar tabela

O MySQL Workbench criou o seguinte SQL para criar uma tabela:

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

o que parece bom para mim, e há muitas outras tabelas muito semelhantes no meu banco de dados que o MySQL estava perfeitamente feliz em criar.

Mas esse aqui ...

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

Pela minha vida, não consigo ver nenhuma chave duplicada aqui. Há apenas uma chave definida!

Estou executando o MySQL 5.6 com uma nova instalação padrão. Não há nada no log de erros.

Ideias?

Edit: através de um processo de eliminação (voltando à definição mais simples possível da tabela e adicionando bits gradualmente), o problema parece ser este bit:

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

o que é particularmente estranho, pois há código idêntico em várias outras definições de tabela e essas são perfeitamente aceitáveis!

20
Matt McLeod

O problema é que o nome de um chave estrangeira não pode ser o mesmo como outra chave estrangeira no todo modelo.

Imagine essa situação

Catálogo -> Fornecedor

Produto -> Fornecedor

se o nome da chave estrangeira na tabela Catálogo do fornecedor for "fornecedor" e você tiver atribuído o mesmo nome na tabela de produtos, os nomes das chaves estrangeiras "colidirão".

Você precisa nomeá-los de forma diferente ..

Por exemplo:

catalog_supplier product_supplier

66
Christian Adam

Parece que você está criando um índice nas colunas de chave estrangeira. Ao criar uma chave estrangeira no InnoDb, uma será criada automaticamente.

Veja este tópico .

2
Kermit