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

Langage SQL Discussion :

auto_increment ne fonctionne pas comme je veux


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut auto_increment ne fonctionne pas comme je veux
    Bonjour,

    Je me retrouve avec un problème ou quand je crée ma table Constructeur et Modele et qu'ensuite je fais mes insertion et bien je vois que l'Id_Modele ne prends pas des valeurs en continue mais revient à 1 quand l'id_Constructeur change, ce sera plus parlant en image voici la table Modele :

    Nom : tableModele.png
Affichages : 211
Taille : 48,4 Ko

    Là on voit bien que l'Id_Modele vaut 1 et 2 pour l'Id_Constructeur 1 mais ensuite pour l'Id_Constructeur 2 on repart avec Id_Modele à 1 et donc sa me pose des problèmes quand je veux faire des requêtes précise.

    Voici la création de mes tables.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    CREATE TABLE Constructeur(
       Id_Constructeur INT AUTO_INCREMENT,
       libelle VARCHAR(50) NOT NULL,
       CONSTRAINT Constructeur_PK PRIMARY KEY(Id_Constructeur)
    )ENGINE=InnoDB;
     
     
    #-------------------------------------------------------------------------
    # La table qui pose problème.
    #-------------------------------------------------------------------------
     
    CREATE TABLE Modele(
       Id_Modele INT,
       Id_Constructeur INT,
       libelle VARCHAR(50) NOT NULL,
       CONSTRAINT Modele_PK PRIMARY KEY(Id_Constructeur, Id_Modele),
       CONSTRAINT MODELE_AK UNIQUE (Id_Constructeur,Id_Modele),
       CONSTRAINT Modele_Constructeur_FK FOREIGN KEY(Id_Constructeur) REFERENCES Constructeur(Id_Constructeur),
       CONSTRAINT MODELE_UK UNIQUE (Id_Constructeur,libelle)
    )ENGINE=InnoDB;
     
    #-------------------------------------------------------------------------
    # Les autres tables.
    #-------------------------------------------------------------------------
    CREATE TABLE Caracteristique(
       Id_Caracteristique INT AUTO_INCREMENT,
       libelle VARCHAR(50) NOT NULL,
       CONSTRAINT Caracteristique_PK PRIMARY KEY(Id_Caracteristique)
    )ENGINE=InnoDB;
     
    CREATE TABLE Caracteristique_value(
       Id_Caracteristique_value INT AUTO_INCREMENT,
       valeur VARCHAR(50),
       Id_Constructeur INT NOT NULL,
       Id_Modele INT NOT NULL,
       Id_Caracteristique INT NOT NULL,
       CONSTRAINT Caracteristique_value_PK PRIMARY KEY(Id_Caracteristique_value),
       CONSTRAINT Caracteristique_value_Modele_FK FOREIGN KEY(Id_Constructeur, Id_Modele) REFERENCES Modele(Id_Constructeur, Id_Modele),
       CONSTRAINT Caracteristique_value_Caracteristique_FK FOREIGN KEY(Id_Caracteristique) REFERENCES Caracteristique(Id_Caracteristique)
    )ENGINE=InnoDB;
     
    CREATE TABLE Utilisateur(
       Id_user INT AUTO_INCREMENT,
       estAdmin TINYINT(1),
       email VARCHAR(50),
       motDePasse VARCHAR(50),
       CONSTRAINT Utilisateur_PK PRIMARY KEY(Id_user)
    )ENGINE=InnoDB;
     
    CREATE TABLE Adresse(
       Id_Adresse INT AUTO_INCREMENT,
       adresse VARCHAR(50),
       complement VARCHAR(50),
       codePostal VARCHAR(5),
       commune VARCHAR(45),
       pays VARCHAR(50),
       CONSTRAINT Adresse_PK PRIMARY KEY(Id_Adresse)
    )ENGINE=InnoDB;
     
    CREATE TABLE Professionnel(
       Id_Professionnel INT AUTO_INCREMENT,
       estHomme TINYINT(1),
       societe VARCHAR(50),
       nom VARCHAR(50),
       prenom VARCHAR(50),
       siret VARCHAR(14),
       telephone VARCHAR(10),
       dateInscription DATE,
       Id_user INT NOT NULL,
       CONSTRAINT Professionnel_PK PRIMARY KEY(Id_Professionnel),
       CONSTRAINT Professionnel_Utilisateur_FK FOREIGN KEY(Id_user) REFERENCES Utilisateur(Id_user)
    )ENGINE=InnoDB;
     
    CREATE TABLE Garage(
       Id_Garage INT AUTO_INCREMENT,
       nom VARCHAR(50),
       email VARCHAR(50),
       telephone VARCHAR(10),
       Id_Adresse INT NOT NULL,
       Id_Professionnel INT NOT NULL,
       CONSTRAINT Garage_PK PRIMARY KEY(Id_Garage),
       CONSTRAINT Garage_Adresse_FK FOREIGN KEY(Id_Adresse) REFERENCES Adresse(Id_Adresse),
       CONSTRAINT Garage_Professionnel_FK FOREIGN KEY(Id_Professionnel) REFERENCES Professionnel(Id_Professionnel)
    )ENGINE=InnoDB;
     
    CREATE TABLE Annonce(
       Id_Annonce INT AUTO_INCREMENT,
       annee DATE,
       kilometrage INT,
       prix INT,
       description VARCHAR(200),
       dateAnnonce DATE,
       Immatriculation VARCHAR(50),
       garantie INT,
       reference VARCHAR(50),
       Id_Constructeur INT NOT NULL,
       Id_Modele INT NOT NULL,
       Id_Garage INT NOT NULL,
       CONSTRAINT Annonce_PK PRIMARY KEY(Id_Annonce),
       CONSTRAINT Annonce_Modele_FK FOREIGN KEY(Id_Constructeur, Id_Modele) REFERENCES Modele(Id_Constructeur, Id_Modele),
       CONSTRAINT Annonce_Garage_FK FOREIGN KEY(Id_Garage) REFERENCES Garage(Id_Garage)
    )ENGINE=InnoDB;
     
    CREATE TABLE Photo(
       Id_Photo INT AUTO_INCREMENT,
       emplacement VARCHAR(255),
       estPrincipal TINYINT(1),
       Id_Annonce INT NOT NULL,
       CONSTRAINT Photo_PK PRIMARY KEY(Id_Photo),
       CONSTRAINT Photo_Annonce_FK FOREIGN KEY(Id_Annonce) REFERENCES Annonce(Id_Annonce)
    )ENGINE=InnoDB;
    Et voici les insertions :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    INSERT INTO constructeur (libelle)
    VALUES 
      ('BMW'),
      ('Mercedes'),
      ('Renault'),
      ('Peugeot'),
      ('Honda'),
      ('Toyota'),
      ('Fiat'),
      ('Ford');
     
    INSERT INTO modele (
      id_Constructeur,
      libelle 
    )
    VALUES
    -- BMW
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'BMW')), 'Série 6'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'BMW')), 'Série 1'),
     
    -- MERCEDES
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Mercedes')), 'Classe C4'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Mercedes')), 'Classe E5'),
     
    -- RENAULT
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Renault')), 'Scenic 4'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Renault')), 'Megan 4 Rs'),
     
    -- PEUGEOT
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Peugeot')), '208'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Peugeot')), '308'),
     
    -- HONDA
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Honda')), 'Civic 10'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Honda')), 'Civic 8'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Honda')), 'Cr-v 5'),
     
    -- TOYOTA
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Toyota')), 'Gt86'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Toyota')), 'Land Cruiser'),
     
    -- Fiat
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Fiat')), 'Fullback'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Fiat')), 'Punto 3'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Fiat')), '500 C'),
     
    -- FORD
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Ford')), 'Mustang 6'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Ford')), 'Puma 2');

  2. #2
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    Citation Envoyé par hbx360 Voir le message

    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
    20
    21
    22
     
     
    #-------------------------------------------------------------------------
    # La table qui pose problème.
    #-------------------------------------------------------------------------
     
    CREATE TABLE Modele(
       Id_Modele INT,
    [...]
       CONSTRAINT Modele_PK PRIMARY KEY(Id_Constructeur, Id_Modele),
    [...]
     
    INSERT INTO modele (
      id_Constructeur,
      libelle 
    )
    VALUES
     
    -- PEUGEOT
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Peugeot')), '208'),
      (((SELECT id_Constructeur FROM constructeur WHERE libelle = 'Peugeot')), '308'),
    [...]
    Bonjour,
    Je suis plus Oracle que MySQL, mais on va essayer...

    Pourquoi n'y a-t-il pas de AUTO_INCREMENT sur id_modele ?
    Pourquoi la PK de cette table fait-elle référence à la table Constructeur ?
    Il semble que MySQL déduit de cette PK qu'il faut incrémenter id_modele par id_constructeur et non sur l'ensemble des valeurs insérées.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    J'ai résolue mon problème en en enlevant Id_Constructeur de cette ligne là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CONSTRAINT MODELE_AK UNIQUE (Id_Modele)
    J'ai enlevé l'auto-increment car sinon je ne peux pas utilisé ENGINE=InnoDB pour créer les liens dans le concepteur de phpMyAdmin.

    Merci pour ton aide.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 779
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 779
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Ce problème est connu, il s'agit d'un bug de MySQL (on pourrait même parler de tare, car c'est c'est lourd de conséquences).
    MySQL n'accepte pas de PK multi colonnes .
    Dans les faits, l'identification relative classiquement utilisée pour les entité-type faibles telles que les chambres identifiées relativement à leur hôtel, les lignes de commande identifiées relativement à leur commande ou celles des factures, bref, tous ces cas nombreux où la PK multicolonne se justifie n'est pas utilisable.

    Dans ce cas de figure, il faut créer une PK mono-colonne et ajouter une contrainte unique sur la combinaison de colonnes souhaitée mais qui ne pourra pas être utilisée comme PK.

    Du même tonneau, MySQL impose que la PK et l'index cluster ne fassent qu'un. Autre bizarrerie des concepteurs de ce SGBD.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Merci pour ton aide.

Discussions similaires

  1. [AC-2007] Expressions régulières qui ne fonctionnent pas comme je veux!
    Par Titom1978 dans le forum VBA Access
    Réponses: 3
    Dernier message: 16/12/2015, 11h37
  2. mon while fonctionne pas comme je veux
    Par domxaline dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 02/06/2015, 16h09
  3. Mon programme ne fonctionne pas comme je veux
    Par menoulette dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 22/04/2011, 00h16
  4. Mon filtre automatique ne fonctionne pas comme je veux
    Par La Zélie dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/11/2008, 17h32
  5. un if qui ne fonctionne pas comme je veux
    Par Kelly182 dans le forum Access
    Réponses: 4
    Dernier message: 27/07/2006, 15h12

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