Partage
  • Partager sur Facebook
  • Partager sur Twitter

MySQL : Erreur Errno: 150

    21 mai 2011 à 20:17:42

    Bonjour,

    Voici ma première table :
    CREATE TABLE utilisateur (
    	uid MEDIUMINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    	login VARCHAR(32) NOT NULL UNIQUE,
    	hash_password VARCHAR(40) NOT NULL,
    	salt_password VARCHAR(20) NOT NULL,
    	username VARCHAR(32) NOT NULL,
    	email VARCHAR(64) NOT NULL UNIQUE,
    	est_admin BIT(1) NOT NULL DEFAULT 0,
    	date_creation DATETIME NOT NULL,
    	date_derniere_connexion DATETIME NULL,
    	code_activation VARCHAR(32) NULL,
    	langue VARCHAR(2) NULL DEFAULT NULL,
    	FOREIGN KEY (langue) REFERENCES langue(lid) ON UPDATE CASCADE ON DELETE SET NULL
    )ENGINE=InnoDB;
    


    J’exécute dans PHPMyAdmin, pas de problèmes pour la création !

    Maintenant je veux créer la table session :
    CREATE TABLE session (
    	sid VARCHAR(40) PRIMARY KEY,
    	uid MEDIUMINT UNSIGNED UNIQUE NOT NULL,
    	est_admin BIT(1) NOT NULL DEFAULT 0,
    	langue VARCHAR(2) NULL DEFAULT NULL,
    	date_creation DATETIME NOT NULL,
    	date_derniere_connexion DATETIME NOT NULL,
    	token VARCHAR(32) NOT NULL,
            FOREIGN KEY (uid) REFERENCES utilisateur(uid) ON UPDATE CASCADE ON DELETE CASCADE,
    	FOREIGN KEY (langue) REFERENCES utilisateur(langue) ON UPDATE CASCADE ON DELETE CASCADE,
    	FOREIGN KEY (est_admin) REFERENCES utilisateur(est_admin) ON UPDATE CASCADE ON DELETE CASCADE
    )ENGINE=InnoDB;
    


    Erreur Errno: 150.
    Connaissant bien l'erreur Errno: 150, qui fait référence à un problème de clé étrangère. Je test la création de la table session sans les clauses FOREIGN KEY. Ça passe...

    Je rajoute la clause FOREIGN KEY (uid), ça passe...
    Je rajoute la clause FOREIGN KEY (langue), ça passe...

    Je rajoute la clause FOREIGN KEY (est_admin), ça plante (ernno 150) !!! J'en déduis donc que ça vient de la clause FOREIGN KEY (est_admin).

    Le problème c'est que je ne vois pas pourquoi ??!! J'ai changé le type de l'attribut est_admin dans utilisateur et dans la syntaxe SQL de création de la table session par les types BOOL, TINYINT(1), BIT, ENUM('0','1') pour voir si ça changeai quelque chose mais ça ne fonctionne pas !!

    Une idée ???!!!
    • Partager sur Facebook
    • Partager sur Twitter
      21 mai 2011 à 20:25:46

      Normal, ta déclaration de foreign key est du grand n'importe quoi puisque tu réfères à des colonnes non uniques de la table utilisateurs.

      A partir du moment où tu as l'id de l'utilisateur dans ta table session, tu n'as pas besoin des autres colonnes, et donc des autres références...
      • Partager sur Facebook
      • Partager sur Twitter
        21 mai 2011 à 20:51:30

        Citation : Lord Casque Noir

        Normal, ta déclaration de foreign key est du grand n'importe quoi puisque tu réfères à des colonnes non uniques de la table utilisateurs.

        A partir du moment où tu as l'id de l'utilisateur dans ta table session, tu n'as pas besoin des autres colonnes, et donc des autres références...


        En fait ce que je voulais faire avec langue et est_admin dans la table session c'est d'éviter de faire la jointure session/utilisateur (qui me sera couteuse si le nombre d'utilisateur est important dans utilisateur) pour récupérer les informations langue et est_admin que j'utilise beaucoup.

        Une autre remarque sinon ?!
        • Partager sur Facebook
        • Partager sur Twitter
          21 mai 2011 à 23:27:19

          > c'est d'éviter de faire la jointure session/utilisateur
          > (qui me sera couteuse si le nombre d'utilisateur est
          > important dans utilisateur)

          Pas prouvé...

          Alors déclare-le comme ça :

          FOREIGN KEY (uid,langue,is_admin) REFERENCES utilisateur(uid,langue,admin) ON UPDATE CASCADE ON DELETE CASCADE
          • Partager sur Facebook
          • Partager sur Twitter
            21 mai 2011 à 23:39:44

            Citation : Lord Casque Noir

            > c'est d'éviter de faire la jointure session/utilisateur
            > (qui me sera couteuse si le nombre d'utilisateur est
            > important dans utilisateur)

            Pas prouvé...

            Alors déclare-le comme ça :

            FOREIGN KEY (uid,langue,is_admin) REFERENCES utilisateur(uid,langue,admin) ON UPDATE CASCADE ON DELETE CASCADE



            Pour la déclaration de la contrainte sous la forme :
            FOREIGN KEY (uid,langue,is_admin) REFERENCES utilisateur(uid,langue,admin) ON UPDATE CASCADE ON DELETE CASCADE
            


            J'ai déjà tenté ça aussi, mais j'avais oublié de le préciser dans mon précédent post ^^
            Et ça fonctionne pas, sinon je ne serai pas ici :p

            D'ailleurs, j'avais aussi tenté :
            FOREIGN KEY (uid,langue) REFERENCES utilisateur(uid,langue) ON UPDATE CASCADE ON DELETE CASCADE
            

            qui ne fonctionne pas.
            Alors que :
            FOREIGN KEY (uid) REFERENCES utilisateur(uid) ON UPDATE CASCADE ON DELETE CASCADE,
            FOREIGN KEY (langue) REFERENCES utilisateur(langue) ON UPDATE CASCADE ON DELETE CASCADE
            

            fonctionne... Bref je n'y comprends rien !
            • Partager sur Facebook
            • Partager sur Twitter
              21 mai 2011 à 23:52:41

              Celui qui ne "fonctionne pas", fonctionne très bien, il suffit d'avoir un index sur (uid,langue,est_admin) dans la table utilisateurs...
              • Partager sur Facebook
              • Partager sur Twitter
                2 août 2017 à 19:10:48

                bonjour

                Je raccroche ce message à ce tuto pour le même code erreur.

                Par contre je suis totalement noob et ne connais pas grand chose à mysql ou phpmyadmin, je suis en fait bloqué à cause de cette erreur lors d'une migration d’hébergeur de mon site perso.

                Chez mon nouvel hébergeur ils me répondent  qu'il ne peuvent intervenir car ils ne connaissent pas le langage sql, donc à moi de me débrouiller....et je ne le peux absolument pas....

                Donc pour faire court, lors de l'ouverture et le transfert de mon site+data vers ce nouvel hébergeur, lorsque j'importe ma ou mes dernières bases de données dans phpmyadmin, j'obtient ce message d'erreur : 

                Erreur

                Requête SQL :

                CREATE TABLE `wp_slim_outbound` ( `outbound_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `outbound_domain` varchar(255) DEFAULT '', `outbound_resource` varchar(2048) DEFAULT '', `type` tinyint(3) unsigned DEFAULT '0', `notes` varchar(512) DEFAULT '', `position` varchar(32) DEFAULT '', `id` int(10) unsigned NOT NULL DEFAULT '0', `dt` int(10) unsigned DEFAULT '0', PRIMARY KEY (`outbound_id`), KEY `odt_idx` (`dt`), KEY `fk_wp_id` (`id`), CONSTRAINT `fk_wp_id` FOREIGN KEY (`id`) REFERENCES `wp_slim_stats` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

                MySQL a répondu: Documentation

                #1005 - Ne peut créer la table `nicopointcom_bddmysql`.`wp_slim_outbound` (Errcode: 150 "Foreign key constraint is incorrectly formed") (Détails…)

                je ne vous donne pas d'autres détails pour l'instant.En cherchant sur différents tutos j'ai trouvé quelques bribes d'infos mais je suis trop limité pour intervenir et réussir à solver ce pb avec ce langage.

                Si quelqu'un peut m'aider.

                cdt 

                -
                Edité par nicopointcom2 2 août 2017 à 19:19:44

                • Partager sur Facebook
                • Partager sur Twitter
                  7 août 2017 à 11:00:33

                  Bonjour,

                  Tu donnes le même nom à ton index (KEY) et à ta contrainte.

                  Essayes de changer le nom de l'index :

                  CREATE TABLE `wp_slim_outbound` (
                  	`outbound_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
                  	`outbound_domain` varchar(255) DEFAULT '',
                  	`outbound_resource` varchar(2048) DEFAULT '',
                  	`type` tinyint(3) unsigned DEFAULT '0',
                  	`notes` varchar(512) DEFAULT '',
                  	`position` varchar(32) DEFAULT '',
                  	`id` int(10) unsigned NOT NULL DEFAULT '0',
                  	`dt` int(10) unsigned DEFAULT '0',
                  	PRIMARY KEY (`outbound_id`),
                  	KEY `odt_idx` (`dt`),
                  	KEY `oid_idx` (`id`), -- nom différent
                  	CONSTRAINT `fk_wp_id` -- de celui-ci
                  		FOREIGN KEY (`id`)
                  		REFERENCES `wp_slim_stats` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
                  ) ENGINE=InnoDB DEFAULT CHARSET=utf8
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    16 septembre 2017 à 22:31:30

                    Bonsoir, 

                    Merci pour ton message !je ne le vois que maintenant désolé, pas activé les notifications via mail :S
                    Et c'est bien dommage, car ce message aurait pu m'éviter de reconstruire 30% de mon site, migré chez un autre hébergeur...

                    Je reviendrais si je trouve encore des problèmes à ce niveau là, mais .... j'espère que non, plus jamais !

                    Merci encore, 

                    Cdt

                    • Partager sur Facebook
                    • Partager sur Twitter

                    MySQL : Erreur Errno: 150

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown