Partage
  • Partager sur Facebook
  • Partager sur Twitter

Autoincrémentation et clés primaires multiples

Sujet résolu
    10 septembre 2010 à 20:21:02

    Bonjour,

    CREATE TABLE contrat 	(
    	chainID TINYINT(2) NOT NULL,
    		FOREIGN KEY (chainID) REFERENCES casinoChain(ChainID) ON UPDATE CASCADE ON DELETE RESTRICT,
    	casinoID SMALLINT(3) NOT NULL,
    		FOREIGN KEY (casinoID) REFERENCES casino(casinoID) ON UPDATE CASCADE ON DELETE RESTRICT,
    	juriID SMALLINT(3) NOT NULL,
    		FOREIGN KEY (juriID) REFERENCES juridiction(juriID) ON UPDATE CASCADE ON DELETE RESTRICT,
    	year CHAR(2) NOT NULL,
    	month CHAR(2) NOT NULL,
    	seq TINYINT(2) NOT NULL AUTO_INCREMENT,
    	PRIMARY KEY(chainID,casinoID,juriID,year,month,seq)
                           )
    


    Mes 6 premiers champs doivent constituer une clée primaire unique. Pour certains contrats, les 5 premiers champs peuvent ètre identique c'est pour cela que j'ai rajouté un numéro de séquence "seq" qui doit s'autoincrémenter quand les 5 premiers champs sont identiques.
    Malheuresememt ceci ne marche pas et mysql me renvoie l'erreur suivante :

    Incorrect table definition; there can be only one auto column and it must be defined as a key

    Merci d'avance!
    • Partager sur Facebook
    • Partager sur Twitter
      10 septembre 2010 à 20:31:00

      Pourquoi t'embêter avec un système aussi tordu, quand une clé primaire "système" simple (bigint autoincrement) et éventuellement des clés étrangères te simplifieraient beaucoup la vie ?
      • Partager sur Facebook
      • Partager sur Twitter
        10 septembre 2010 à 20:34:02

        Je ne suis pas sur d'avoir compris ta réponse.
        Peux-tu m'éclairer un peu s'il te plait ? :)

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          10 septembre 2010 à 20:39:01

          Il me semble avoir lu une fois que dans le cas d'une PK sur plusieurs colonnes, la colonne auto incrémentée devait être déclarée en premier.
          • Partager sur Facebook
          • Partager sur Twitter
            10 septembre 2010 à 20:42:21

            Je ne comprends pas pourquoi tu cherches aussi compliqué.

            Tout ce dont tu as besoin, c'est :
            1- Un champ "ID", purement technique, typiquement un "bigint autoincrement" qui te sert de clé primaire.
            2- Le reste de ta table avec des clés étrangères et éventuellement des contraintes d'unicité (quoique pas dans ton cas).

            Tes 5 champs ne constituent pas naturellement une clé primaire. Pas la peine d'essayer d'en rajouter un 6ème artificiel, tu ne feras que te prendre la tête.

            Tu peux nous poster la modélisation de cette base, histoire qu'on y voie plus clair ?
            • Partager sur Facebook
            • Partager sur Twitter
              10 septembre 2010 à 21:11:52

              Merci Xena ca résout mon erreur mais ca ne fait pas exactement ce que je veux...

              Je vais essayer d'être plus clair :)
              Je dois develloper qui génère un code de contract en fonction de plusieurs paramètres. Les 3 premiers sont des champs propre à un casino et dont le code est chacun situé dans une table différente : casinoChain, casino et juridiction.
              Year et month sont directement rentrés par l'utilisateur.

              Seq doit se remettre à 1 CHAQUE FOIS que les 5 premiers champs sont à nouveau différents...

              Voila la déclaration des autres tables :

              // casinoChain
              mysql_query("CREATE TABLE casinoChain 	(
              	chainID TINYINT(2) NOT NULL AUTO_INCREMENT, PRIMARY KEY(chainID),
              	chainName TEXT NOT NULL 
              										) 
              	ENGINE = INNODB;")
               or die(mysql_error());  
              
              echo "Table casinoChain created.<BR/>";
              
              // casino
              mysql_query("CREATE TABLE casino 	(
              	casinoID SMALLINT(3) NOT NULL AUTO_INCREMENT, PRIMARY KEY(casinoID),
              	casinoName TEXT NOT NULL 
              									) 
              	ENGINE = INNODB;")
               or die(mysql_error());  
              
              echo "Table casino created.<BR/>";
              
              // juridiction
              mysql_query("CREATE TABLE juridiction 	(
              	juriID SMALLINT(3) NOT NULL AUTO_INCREMENT, PRIMARY KEY(juriID),
              	juriDesc TEXT NOT NULL 
              										) 
              	ENGINE = INNODB;")
               or die(mysql_error());  
              
              echo "Table juridiction created.<BR/>";
              


              En fait le vrai problème c'est que je dois remettre seq à 1 quand les 5 premiers champs varient.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                10 septembre 2010 à 21:45:23

                En fait ça marche comme tu le souhaites avec MyISAM, mais pas avec InnoDB...
                • Partager sur Facebook
                • Partager sur Twitter
                  10 septembre 2010 à 21:53:30

                  Je repose ma question pour la dernière fois : pourquoi pas une colonne simple ? Pourquoi "générer" cet ID à partir de tas d'autres infos ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 septembre 2010 à 22:00:46

                    Aaah je vois ce que tu veux dire SpaceFox! En effet c'est plus simple :) Je suis stagiaire et mon maitre de stage demande que la table soit structuré ainsi.. ^^

                    Anyway ta solution marche Enax, merci à tous les deux :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 septembre 2010 à 22:06:22

                      OK. Attention, avec MyISAM, tu perds les contraintes relationnelles.
                      A voir si tu peux pas convaincre ton maître de stage de faire autrement.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        10 septembre 2010 à 23:42:15

                        Citation : SpaceFox

                        OK. Attention, avec MyISAM, tu perds les contraintes relationnelles.
                        A voir si tu peux pas convaincre ton maître de stage de faire autrement.


                        Je plussoie.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Autoincrémentation et clés primaires multiples

                        × 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