2013-02-22 26 views
18

MySQL Workbench si avvicinò con il seguente SQL per creare una tabella:errore MySQL 1022 durante la creazione tabella

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 

che guarda bene a me, e ci sono un sacco di altri tavoli molto simili nel mio database che MySQL era perfettamente felice di creare.

Ma questo ...

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

non posso per la vita di me vedere duplicati delle chiavi qui. C'è solo una chiave definita!

Sto eseguendo MySQL 5.6 con una nuova installazione predefinita. Non c'è niente nel log degli errori.

Idee?

Edit: attraverso un processo di eliminazione (tornare al più semplice definizione possibile del tavolo, poi gradualmente aggiunta di bit nel) il problema sembra essere questo bit:

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

particolarmente strano come c'è un codice identico in molte altre definizioni di tabella e quelle sono perfettamente a posto!

+0

Non ho alcun problema con questa query .. sembra che ci può essere qualcos'altro –

+0

Non è sicuro di dover creare in modo esplicito un indice per le colonne FK. Avevo l'impressione che la creazione del riferimento avrebbe creato un indice. – Kermit

+0

Estrarre le istruzioni INDICE non fa differenza. –

risposta

-1

Provare a utilizzare INSERT IGNORE anziché INSERT dove INSERISCI IGNORE non inserirà una nuova riga se viene trovata una chiave primaria duplicata. Questo dovrebbe aiutare a risolvere il problema temporaneamente, ma consiglierei di troncare la tabella.

+0

Questo sta creando la tabella, non inserendo dati. Non c'è INSERT in corso qui. –

+0

Giusto.È sicuramente il problema della chiave esterna (errore 105 per me). Assicurati che la chiave esterna e la colonna di riferimento abbiano gli stessi tipi di dati come regole di confronto, attributi predefiniti e così via. –

2

Sembra che si stia creando un indice sulle colonne chiave esterna. Quando si crea una chiave esterna in InnoDb, ne verrà creata automaticamente una.

See this thread.

+0

Il codice è stato prodotto da MySQL Workbench, che sembra aggiungerlo esplicitamente. Non che faccia differenza. –

+0

@MattMcLeod È possibile creare i vincoli dopo che la tabella è stata creata? Puoi provare anche [controllando gli indici] (http://stackoverflow.com/a/5213364/679449) prima/dopo aver creato la tabella? – Kermit

+1

Aha! Questo mi ha portato a quella che credo sia la soluzione: un'altra tabella aveva già applicato lo stesso vincolo: error_id, e Workbench dava a entrambi lo stesso nome di vincolo. La modifica del nome del vincolo ha permesso di crearlo. –

59

Il problema è che il nome di un estera chiave non può essere lo stesso come un'altra chiave esterna nell'intero modello.

Immaginate questa situazione

Catalogo -> Fornitore

prodotto -> Fornitore

se il nome della chiave esterna nella tabella di catalogo per il fornitore è "fornitore" e che è stato assegnato lo stesso nome nella tabella del prodotto, i nomi delle chiavi esterne si "scontrano".

È necessario assegnare loro un nome diverso ..

Ad esempio:

catalog_supplier product_supplier

+0

Grazie! Aveva lo stesso problema e non poteva capire che dato il massaggio di errore. BTW il nome della chiave straniera in collisione NON è uguale al nome della colonna, ma solo un nome MySql interno per la chiave. – uzilan

+2

questa è la risposta! grande! –

+1

Sai perché questo vincolo esiste in MySQL? – vipw

Problemi correlati