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,
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;