2010-06-03 6 views
3

Cela me fait transpirer - j'obtiens l'erreur 150 quand j'essaye de créer une table dans mySQL. J'ai parcouru les forums en vain. L'instruction utilise des contraintes de clé étrangère - les deux tables sont InnoDB, toutes les colonnes pertinentes ont le même type de données et les deux tables ont le même charset et le même classement. Voici l'instruction CREATE TABLE et l'instruction CREATE TABLE d'origine pour la table référencée. Des idées?Erreur n ° 150 mySQL

Nouvelle table:

CREATE TABLE `approval` (
    `rev_id` int(10) UNSIGNED NOT NULL, 
    `rev_page` int(10) UNSIGNED NOT NULL, 
    `user_id` int(10) UNSIGNED NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`rev_id`,`rev_page`,`user_id`), 
    KEY `FK_approval_user` (`user_id`), 
    CONSTRAINT `FK_approval_revision` FOREIGN KEY (`rev_id`, `rev_page`) REFERENCES `revision` (`rev_id`, `rev_page`), 
    CONSTRAINT `FK_approval_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

table de référence:

CREATE TABLE `revision` (
    `rev_id` int(10) unsigned NOT NULL auto_increment, 
    `rev_page` int(10) unsigned NOT NULL, 
    `rev_text_id` int(10) unsigned NOT NULL, 
    `rev_comment` tinyblob NOT NULL, 
    `rev_user` int(10) unsigned NOT NULL default '0', 
    `rev_user_text` varbinary(255) NOT NULL default '', 
    `rev_timestamp` binary(14) NOT NULL default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0', 
    `rev_minor_edit` tinyint(3) unsigned NOT NULL default '0', 
    `rev_deleted` tinyint(3) unsigned NOT NULL default '0', 
    `rev_len` int(10) unsigned default NULL, 
    `rev_parent_id` int(10) unsigned default NULL, 
    PRIMARY KEY (`rev_id`), 
    UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`), 
    KEY `rev_timestamp` (`rev_timestamp`), 
    KEY `page_timestamp` (`rev_page`,`rev_timestamp`), 
    KEY `user_timestamp` (`rev_user`,`rev_timestamp`), 
    KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`) 
) ENGINE=InnoDB AUTO_INCREMENT=4904 DEFAULT CHARSET=binary MAX_ROWS=10000000 AVG_ROW_LENGTH=1024; 
+1

Vous * ne * avez CREATE TABLE autorisations, non? – Matchu

Répondre

2

Mise à jour: Je dois avoir été aveugle:

La raison pour laquelle votre create table failes, est parce que votre "rev_page_id" la clé est dans le mauvais ordre (innodb exige que la clé soit du même ordre que la clé étrangère:

CREATE TABLE `revision` (
    `rev_id` int(10) unsigned NOT NULL auto_increment, 
    .... 
    `rev_parent_id` int(10) unsigned default NULL, 
    PRIMARY KEY (`rev_id`), 
    -- wrong: 
    -- UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`), 
    -- better: 
    UNIQUE KEY `rev_page_id` (`rev_id`, `rev_page`), 
    .... 

S'il vous plaît ignorer suggestion ci-dessous:


Essayez

SHOW ENGINE INNODB STATUS 

Rechercher lissée. comme "LAST INNODB FOREIGN KEY ERROR" Malheureusement, le message d'erreur n'est pas très intuitif la plupart du temps. Puisque vous avez dit les types sont tous les mêmes, je pense que cela pourrait être l'erreur suivante:

  • Le nom FK existe déjà (FK noms doivent être uniques accross la base de données). Pour être vrai, ils doivent être uniques pour toute instance de MySQL, mais en interne InnoDB ajoute le nom de base de données au nom de la clé étrangère (FK_approval_user est appelée en interne yourdbname # FK_approval_user)

Mise à jour:

Il ressemble il vous manque la clé pour « FK_approval_revision »

devrait ressembler à ceci:

CREATE TABLE `approval` (
    `rev_id` int(10) UNSIGNED NOT NULL, 
    `rev_page` int(10) UNSIGNED NOT NULL, 
    `user_id` int(10) UNSIGNED NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`rev_id`,`rev_page`,`user_id`), 
    KEY `FK_approval_user` (`user_id`), 
    KEY `FK_approval_revision` (`rev_id`, `rev_page`), 
    CONSTRAINT `FK_approval_revision` FOREIGN KEY (`rev_id`, `rev_page`) REFERENCES `revision` (`rev_id`, `rev_page`), 
    CONSTRAINT `FK_approval_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
4

cette erreur est généralement liée à des restrictions clés étrangères. Exécutez show innodb status et recherchez la section LATEST FOREIGN KEY ERROR pour obtenir des explications plus concrètes.

C'est ce que je reçois lors de la création de la deuxième table:

Error in foreign key constraint of table test/approval: FOREIGN KEY (rev_id , rev_page) REFERENCES revision (rev_id , rev_page),
CONSTRAINT FK_approval_user FOREIGN KEY (user_id) REFERENCES user (user_id)) ENGINE=InnoDB DEFAULT CHARSET=latin1: Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.

1

il ne fonctionnera que si vous changez l'ordre des colonnes dans la définition de contrainte:

FOREIGN KEY (`rev_page`,`rev_id`) REFERENCES `revision` (`rev_page`,`rev_id`) 

Votre requête d'origine ne fonctionne pas car l'ordre des champs doit être le même que dans l'index unique. Cependant, ajouter une colonne rev_page à une contrainte est superflu (revision.rev_id + revision.rev_page est 100% unique sans contrainte unique, puisque revision.rev_id est unique en soi).Donc, vous n'avez pas besoin clé unique sur (revision.rev_id + revision.rev_page), et il serait beaucoup mieux si vous changez contrainte

FOREIGN KEY (`rev_id`) REFERENCES `revision` (`rev_id`) 
+0

Merci alex07 qui l'a cloué. Matchu - oui j'ai CREATE TABLE privs! L'erreur 150 ne concerne en aucun cas les privilèges. – buddhamagnet

0

Afficher l'état InnoDB

ce cmd aider beaucoup

Questions connexes