2009-07-24 5 views
35

Sto ottenendo questo errore in MySQL creare. Sto facendo:MySQL errorno 121

CREATE TABLE `blogReply` (

    `Id`  INT(24)  NOT NULL AUTO_INCREMENT COMMENT 'Primary Key of This Table', 
    `blogId` INT(24)  NOT NULL COMMENT 'Blog where this reply was posted', 
    `userId` INT(24)  NULL COMMENT 'User the blog was posted by', 
    `name` VARCHAR(100) NULL DEFAULT 'Unknown' COMMENT 'The Name of the user that the reply was posted by', 
    `email` VARCHAR(100) NULL DEFAULT 'Unknown' COMMENT 'The Email of the user that the reply was posted by', 
    `http` VARCHAR(300) NULL DEFAULT 'Unknown' COMMENT 'The Webaddress of the user that the reply was posted by', 
    `message` TEXT   NOT NULL COMMENT 'text of the blog', 
    `votes` INT(10)  DEFAULT 0 COMMENT 'Rating of the Blog', 
    `ratedBy` TEXT   COMMENT 'People who have already Voted on this blog', 
    `dateReg` BIGINT  NOT NULL COMMENT 'Date the User was Registered', 

    PRIMARY KEY (`Id`), 

    CONSTRAINT `FK_userId` FOREIGN KEY(`userId`) 
     REFERENCES `user` (`Id`) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE, 

    CONSTRAINT `FK_blogId` FOREIGN KEY(`blogId`) 
     REFERENCES `blog` (`Id`) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 

) ENGINE = InnoDB; 

Qualsiasi idea? The Error States: Can't create table './xxxxxxxx/blogReply.frm' (errno: 121)

risposta

116

Verificare che tutti i vostri vincoli sono davvero scritte correttamente, anche controllare che non ci sia nessun altro tabelle che utilizza i nomi di vincolo FK_userId o FK_blogId

+0

Lasciatemi testare la teoria perché penso di aver nominato FK_userId prima, ma in una tabella diversa –

+18

Nice, non sapevo che le chiavi esterne dovessero avere nomi univoci attraverso le tabelle. Grazie :) – Shade

+0

Oggi ho ricevuto questo errore per la prima volta utilizzando mySQL per anni, ora. Era davvero una coincidenza che i nomi corrispondessero sempre. –

7

Errore 121 è un problema di vincolo di chiave esterna. La prima cosa da verificare è che le definizioni delle tue chiavi esterne siano corrette (tutte le tabelle e i nomi dei campi sono corretti, ecc.).

Si può provare a disabilitare i controlli di chiave esterna prima di creare la tabella e, in questo modo:

SET FOREIGN_KEY_CHECKS = 0; 

che ha lo svantaggio di gettare errori più tardi, quando si riattivare il controllo chiave (impostarlo su 1) tuttavia, se questo è il caso, significa che hai qualche record non valido da qualche parte che interferisce con la creazione della chiave esterna.

Tuttavia, questo problema può verificarsi anche se sono stati spostati manualmente i file di database, ad esempio rinominare fisicamente la directory data/your_database_name. InnoDB non è in grado di correlare cambiamenti fisici come quello al tablespace, quindi muck con gli interni.

Se questo è quello che hai fatto, la soluzione che funziona meglio è quella di spostare il vecchio database di nuovo a dove era, prendere una discarica o l'esportazione di esso, e fare un DROP DATABASE su di esso prima di ri-importazione.

+1

No im non fisicamente thisgs muoversi. Ho appena creato un file di installazione e lo faccio con una nuova copia per creare tutti i tavoli –

1

controllare che la chiave straniera che si sta creando è lo stesso in tutti gli aspetti come ad esempio il tipo di dati con la colonna della tabella indicata. Ogni nome di chiave esterna deve essere univoco per le tabelle in cui è stato creato, non deve essere utilizzato in altre tabelle. per il problema precedente il nome della chiave esterna "FK_userId" non deve essere utilizzato in nessun'altra tabella.

1

In Ho questo problema in MySQL 5.5 ma funziona bene in MySQL 5.6. Il problema è stato perché il nome del vincolo sembra essere unico, ma se questo è un nome lungo e viene troncato l'diventano non univoco, ad esempio:

long_constraint_name_1, long_constraint_name_2 può diventare long_constraint_name_