2015-09-15 1 views
0

J'ai les tableaux suivants et j'essaye de les exécuter en MySQL mais je continue à obtenir un errno 150. Je ne sais pas exactement pourquoi, mais MySQL ne semble pas pouvoir créer la contrainte de clé étrangère. J'ai déjà regardé les règles pour configurer les FK pour InnoDB et tout semble correct. Est-ce que quelqu'un pourrait me prêter un autre regard et une expertise?MySQL InnoDB Problèmes de clé étrangère

-- Table publication_type (parent table) 
CREATE TABLE publication_type (
    id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    publication_type varchar(55) NOT NULL, 
    tstamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    CONSTRAINT publication_type_pk PRIMARY KEY (id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

-- Table publication (child table) 
CREATE TABLE publication (
    id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    authors varchar(255) NOT NULL, 
    publication_title varchar(100) NOT NULL, 
    publication_type_id int(11) UNSIGNED NOT NULL, 
    user_id int(11) UNSIGNED NOT NULL, 
    CONSTRAINT publication_pk PRIMARY KEY (id), 
    CONSTRAINT publication_type_fk FOREIGN KEY (publication_type_id) REFERENCES publication_type(id) ON DELETE SET NULL ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

Répondre

0

Les types ne correspondent pas:

publication_type.id est de type int UNSIGNED

publication.publication_type_id est de type int

Voir aussi les docs: http://dev.mysql.com/doc/refman/5.1/en/create-table-foreign-keys.html, plus précisément:

Colonne correspondante s dans la clé étrangère et la clé référencée doit avoir des types de données similaires. La taille et le signe des types entiers doivent être les mêmes. La longueur des types de chaînes n'a pas besoin d'être la même. Pour colonnes de chaîne (caractère) non binaires, le jeu de caractères et le classement doivent être identiques.

emphase mienne.

+0

Merci @ Matteo, mais j'ai édité le script (voir ci-dessus) et il donne toujours la même erreur. – gabz

+0

Exécutez ensuite SHOW INNODB STATUS et vérifiez l'erreur réelle. –