2013-04-26 13 views
20

Sto creando alcune semplici tabelle e non riesco a passare questo errore di chiave esterna e non sono sicuro del perché. Ecco lo script qui sotto.MySQL Errno 150

create TABLE Instructors (

ID varchar(10), 
First_Name varchar(50) NOT NULL, 
Last_Name varchar(50) NOT NULL, 
PRIMARY KEY (ID) 
); 

create table Courses (

Course_Code varchar(10), 
Title varchar(50) NOT NULL, 
PRIMARY KEY (Course_Code) 

); 


create table Sections (
Index_No int, 
Course_Code varchar(10), 
Instructor_ID varchar(10), 
PRIMARY KEY (Index_No), 
FOREIGN KEY (Course_Code) REFERENCES Courses(Course_Code) 
    ON DELETE cascade 
    ON UPDATE cascade, 
FOREIGN KEY (Instructor_ID) REFERENCES Instructors(ID) 
    ON DELETE set default 

); 

Codice errore: 1005. Non è possibile creare la tabella '336_project.sections' (errno: 150)

I miei tipi di dati sembrano identici e la sintassi sembra corretta. Qualcuno può far notare quello che non vedo qui?

Sto usando MySQL Workbench 5.2

risposta

23

Se stai utilizzando il motore InnoDB, lo ON DELETE SET DEFAULT è il tuo problema. Ecco un estratto dal manuale:

Mentre SET DEFAULT è consentito dal MySQL Server, esso è respinto come non valido per InnoDB. Le istruzioni CREATE TABLE e ALTER TABLE che utilizzano questa clausola non sono consentite per le tabelle InnoDB.

È possibile utilizzare ON DELETE CASCADE o ON DELETE SET NULL, ma non ON DELETE SET DEFAULT. C'è più informazioni here.

+0

Ciao, grazie per la tua rapida risposta. Ho provato a cambiare a SET NULL e ancora non funziona. Ho anche rimosso tutte le linee ON UPDATE/DELETE e ancora mi dà l'errore. Dovrei specificare un motore particolare da usare? – Sixers17

+1

Ignora l'ultimo commento, l'ho risolto. Avevi ragione, ho dovuto cambiare il valore predefinito in null, ma ho anche creato indici per ogni riferimento di chiave esterna. Una volta che l'ho fatto, ha funzionato! – Sixers17

+0

@ Sixers17 - solo per quello che sai, quando ho provato le tue istruzioni 'CREATE TABLE' qui, l'unica cosa che dovevo fare per farle funzionare era la modifica a 'ON DELETE SET NULL'. Non ho dovuto aggiungere indici. Detto questo, è una buona idea avere indici lungo i tuoi FK comunque va tutto bene :) –

1

Si sta venendo a mancare sul

ON DELETE set default 

io non ho incontrato che prima e non sto vedendo che nei manuali o (ma poi è tardi)

Aggiornamento

appena visto questo in manual

Mentre SET DEFAULT è consentito dal server MySQL, viene rifiutato come non valido da InnoDB. Le istruzioni CREATE TABLE e ALTER TABLE che utilizzano questa clausola non sono consentite per le tabelle InnoDB.

Immagino che potresti utilizzare le tabelle InnoDB?

+0

Devo inserire Engine = InnoDB dopo le dichiarazioni della tabella? – Sixers17

+0

Nvm, provato a farlo, non ha funzionato neanche. – Sixers17

3

Può anche essere il caso se non si specifica il ON DELETE a tutti, ma sta cercando di fare riferimento a una tabella MyISAM dalla tabella InnoDB:

CREATE TABLE `table1`(
    `id` INT UNSIGNED NOT NULL, 
    `name` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MYISAM CHARACTER SET UTF8; 

CREATE TABLE `table2`(
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `table1_id` INT UNSIGNED NOT NULL, 
    `some_value` VARCHAR(255) NOT NULL, 


    PRIMARY KEY (`id`), 
    KEY `fk_table1_id`(`table1_id`), 

    CONSTRAINT FOREIGN KEY (`table1_id`) REFERENCES `table1`(`id`) 
) ENGINE=INNODB CHARACTER SET UTF8; 

È possibile che questo getterà errno 150. È necessario cambiare anche la prima tabella in InnoDB perché funzioni.

33

Questo errore si verifica anche se si mettono in relazione colonne di diverso tipo, ad es. int nella tabella di origine e BigInt nella tabella di destinazione.

+3

o la tabella di riferimento non ha il motore InnoDB – Gavriel

0

Qui il problema si trova nel motore di database (tabella1 MYISAM e tabella2 ENGINE). Per impostare i CHIAVI ESTERI,

  • Entrambe le tabelle devono essere nello stesso MOTORE e nello stesso set di caratteri.
  • La colonna PK nella colonna principale e FK deve essere nello stesso tipo di dati e nello stesso tipo di confronto.

Spero che tu abbia avuto un'idea.

16

È possibile eseguire

SHOW ENGINE INNODB STATUS 

per leggere il motivo del fallimento in un formato leggibile

esempio

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
150331 15:51:01 Error in foreign key constraint of table foobar/#sql-413_81: 
FOREIGN KEY (`user_id`) REFERENCES `foobar`.`users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE: 
You have defined a SET NULL condition though some of the columns are defined as NOT NULL. 
0

Assicurarsi che il tipo di tabella sia InnoDB, MyISAM non supporta la chiave esterna, afaik.

0

Per completezza - si otterrà questo errore anche se si crea un riferimento esterno a una tabella che non è definita in quel momento;

1

Per creare un FOREIGN KEY con riferimento a un'altra tabella, le chiavi di entrambe le tabelle devono essere PRIMARY KEY e con lo stesso tipo di dati.

Nelle sezioni della tabella, PRIMARY KEY è di tipo di dati diverso, ad esempio INT ma in un'altra tabella è di tipo i.

Problemi correlati