MySQL Errno 150

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

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. Imansible creare la tabella “336_project.sections” (errno: 150)

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

Sto usando MySQL Workbench 5.2

Se si sta utilizzando il motore InnoDB, l’ ON DELETE SET DEFAULT rappresenta il problema. Ecco un estratto dal manuale:

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

È ansible utilizzare ON DELETE CASCADE o ON DELETE SET NULL , ma non ON DELETE SET DEFAULT . Ci sono più informazioni qui .

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

Puoi correre

 SHOW ENGINE INNODB STATUS 

leggere il motivo dell’errore in un formato leggibile dall’uomo

per 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. 

Potrebbe anche essere il caso se non si specifica affatto l’opzione ON DELETE ma si sta tentando 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; 

Quanto sopra genererà errno 150 . È necessario cambiare anche la prima tabella in InnoDB perché funzioni.

Per creare una 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 un tipo di dati diverso, ad esempio INT ma in un’altra tabella, è di tipo cioè VARCHAR .

Sta fallendo sul

 ON DELETE set default 

Non l’ho mai visto prima e non lo vedo nei manuali (ma poi è tardi)

Aggiornare

appena visto questo nel manuale

Mentre SET DEFAULT è consentito dal server MySQL, viene respinto 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 usare le tabelle InnoDB?

Qui il problema è nel motore di database (tabella1 MYISAM e table2 ENGINE ). Per impostare le CHIAVI STRANIERE,

  • 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 un’idea.

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

Per completezza, riceverai questo errore anche se fai un riferimento estraneo a una tabella che non è definita in quel momento;