IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 MySQL Discussion :

Problème avec les Identifiants relatifs


Sujet :

MySQL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème avec les Identifiants relatifs
    Bonjour !
    Je réalise pour mon stage de 1°année le site de la radio de mon lycée avec un collègue.
    Je viens quérir un ptit cop de pouce car mon MCD est validé mais j'ai un problème avec mon script de création de base sous MySQL :
    Il ya dans le lot deux tables Disque et Morceau.
    Je voudrais que le numéro de morceau soit relatif au numéro de disque :
    par exemple le disque 15 a des morceaux de 1 à 9 et le disque 27 des morceaux de 1 à 14.
    j'a donc dait ceci dans mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    CREATE TABLE Disque (
    	NoDisque INTEGER NOT NULL AUTO_INCREMENT,
    	TitreDisque VARCHAR(60) NOT NULL,
    	Artiste VARCHAR(40),
    	PRIMARY KEY(NoDisque)
    )
    TYPE=InnoDB;
     
     
    CREATE TABLE Morceau (
    	NoDisque INTEGER NOT NULL,
    	NoMorceau INTEGER NOT NULL AUTO_INCREMENT,
    	TitreMorceau VARCHAR(50) NOT NULL,
    	DureeMorceau INTEGER(3) NOT NULL,
    	PRIMARY KEY(NoDisque, NoMorceau)
    	FOREIGN KEY(NoDisque) REFERENCES Disque(NoDisque)
    )
    TYPE=InnoDB;
    Mais lors de l'execution, MySQL me renvoie l'erreur :

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

    J'ai beau retourner ça dans tous les sens je ne vois pas ce qui cloche, ça correspond bien à ce qu'on a fait au niveau des schémas relationnels dans l'année...
    de plus (mais j'ai peut etre mal compris quelque chose ) le champ NoDisque de MORCEAU ne devrait pas etre considéré comme auto-incrémenté vu que c'est juste un appel des valeurs qui sont dans DISQUE... Il n'y a donc qu'un seul champ auto-incrémenté dans ma table et il est bien dans la clef primaire.

    Merci d'avance aux bonne âmes qui voudront bien jeter un ptit coup d'oeil la dessus et qui pourraient me proposer une syntaxe valable dans MySQL pour ce souci

    (J'ai parcouru un peu le forum mais je n'ai pas vu de titres se rapportant aux identifiants relatifs, et l'aide MySQl ne m'a pas vraiment avancé...)

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Je suppose que c'est une contrainte de mysql de ne pouvoir définir une pk sur 2 colonnes dont une est incrémentée.

    En utilisant la pk sur ta colonne auto-incrémentée seule, et en mettant un unique sur NoDisque, NoMorceau, ça devrait-être mieux.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    merci pour ta réponse
    Oui j'ai tout de suite envisagé de faire simple en ne gardant en PK que le NoMorceau, et le NoDisque en FK simple, mais ça m'obligera à numéroter les morceaux de chaque disque par programmation pour affichage, cela dit ça me tuera pas mais j'aurais bien aimé pouvoir faire ça "bien comme la théorie vue en cours" ^^
    Je ne comprend pas ce que tu veux dire par
    en mettant un unique sur NoDisque, NoMorceau
    si j'ai NoMorceau en PK, (nodisque,nomorceau) sera forcement unique dans ma table, non ?

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Citation Envoyé par PodBanane Voir le message
    si j'ai NoMorceau en PK, (nodisque,nomorceau) sera forcement unique dans ma table, non ?
    Parce que c'est cela justement qui pose problème à mysql non ?
    Ou alors j'ai mal cerné le problème.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ben justement, je comprend pas vraiment ce qui pose problème à MySQL ^^
    mais comme tu dis Xunil il se peut qu'il aime pas qu'on le prenne pour un idiot en lui précisant 2 fois les choses parce que c'est vrai que c'est un peu ce qui se passe...

    Peut être en utilisant un Index ? (notion pas trop trop abordée qui est encore un peu floue dans ma tête et où elle se confond avec les PK... :p)
    quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE Morceau (
    	NoDisque INTEGER NOT NULL,
    	NoMorceau INTEGER NOT NULL AUTO_INCREMENT,
    	TitreMorceau VARCHAR(50) NOT NULL,
    	DureeMorceau INTEGER(3) NOT NULL,
    	PRIMARY KEY(NoMorceau),
    	FOREIGN KEY(NoDisque) REFERENCES Disque(NoDisque),
                 INDEX IdMorceau(NoDisque, NoMorceau)
    )
    TYPE=InnoDB;
    J'avoue que sur ce coup je suis un peu dépassé ^^
    Vu que les délais sont assez sérrés, et qu'il reste beaucoup à faire, je pense que je vais faire en sorte de contourner le problème en utilisant la prog php pour numéroter à l'affichage les morceaux dans l'ordre du disque.

    Si une solution existe pour mettre en oeuvre directement les identifiants relatifs je suis toujours preneur, j'aime pas faire les choses de manière détournée (c'est l'exemple typique de trucs qui font que je préfère de très loin la phase conception/reflexion à la phase production :p)

    Merci à Xunil pur ta contribution, et à toute personne qui pourrait éventuellement éclairer ma lanterne.

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Extrait de la doc
    Pour les tables MyISAM et BDB vous pouvez spécifier AUTO_INCREMENT sur une colonne secondaire d'une clef multi-colonnes. Dans ce cas, la valeur générée pour la colonne auto-incrémentée est calculée de la façon suivante : MAX(auto_increment_column)+1) WHERE prefix=given-prefix. C'est utile lorsque vous voulez placer des données dans des groupes ordonnés.
    Comme tu le vois ce que tu veux obtenir n'est pas possible avec le moteur InnoDB.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour ta réponse. C'est vrai que je n'ai pas pensé à regarder du coté du moteur.
    A final je vais opter pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    CREATE TABLE Disque (
    	NoDisque INTEGER NOT NULL AUTO_INCREMENT,
    	TitreDisque VARCHAR(60) NOT NULL,
    	Artiste VARCHAR(40),
    	PRIMARY KEY(NoDisque)
    )
    TYPE=InnoDB;
     
     
    CREATE TABLE Morceau (
    	NoDisque INTEGER NOT NULL,
    	NoMorceau INTEGER NOT NULL,
    	TitreMorceau VARCHAR(50) NOT NULL,
    	DureeMorceau INTEGER(3) NOT NULL,
    	PRIMARY KEY(NoDisque, NoMorceau),
    	FOREIGN KEY(NoDisque) REFERENCES Disque(NoDisque)
    )
    TYPE=InnoDB;
    ce qui devrait fonctionner normalement (si on s'est bien compris avec ma prof :p)
    et je m'occuperai par programmation de faire s'incrémenter le NoMorceau lors des saisie !
    merci pour votre participation

Discussions similaires

  1. [Doctrine] Problème avec les identifiants relatifs.
    Par jeanchristophe22 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/05/2011, 11h48
  2. problème avec les liens relatifs
    Par Balbuzard dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2009, 15h04
  3. JasperReport problème avec les chemins relatif
    Par baradoss dans le forum Jasper
    Réponses: 3
    Dernier message: 15/07/2008, 09h15
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo