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 :

Une clé primaire qui doit s'incrémenter automatiquement


Sujet :

MySQL

  1. #1
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut Une clé primaire qui doit s'incrémenter automatiquement
    bonjour, j'ai une application web qui dois être installé dans plusieurs centre afin d'enregistrer des dossiers, a chaque dossier on donne un numéro d'ordre sous la forme : 1706/09 avec 1706 est l'orde et le 09 est l'année, je sais pas comment ni ou je dois gérer ca : au niveau de mon codage ou de ma base de donnée, je dois pas donner aux utilisateur du centre de saisir ce numéro, donc c'est à mon systeme de le gérer, si vous avez une idée je serais reconnaissante ?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 207
    Points : 191
    Points
    191
    Par défaut
    Dans ta base de données tu peux toujours utiliser un champ de type identité. et mettre ton année dans un autre champ que tu pourras concatainé au chargement.

  3. #3
    Membre actif Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Points : 290
    Points
    290
    Par défaut
    Il est preferable de faire le travail dans la base de données pour éviter le max possile le pb d'accée multiples( insertion d'un clef déja existant)
    une idée : etendre ton cle(ou colonne) sur deux champs : le premier gére l'ordre et l'aure contient l'année et lors de selection tu peut les combiner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT COrder + '/' + CAnnee AS Code FROM MonTable WHERE ...
    a+

  4. #4
    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,
    Citation Envoyé par AJemni Voir le message
    Il est preferable de faire le travail dans la base de données pour éviter le max possile le pb d'accée multiples( insertion d'un clef déja existant)
    une idée : etendre ton cle(ou colonne) sur deux champs : le premier gére l'ordre et l'aure contient l'année et lors de selection tu peut les combiner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT COrder + '/' + CAnnee AS Code FROM MonTable WHERE ...
    a+
    Je crois qu'il vaudrait mieux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONCAT(COrder , '/' , CAnnee) AS Code
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    merci pour vos réponses pertinente, puisque j'avais pas de connexion ce weekend, j'ai essayé de faire autrement, j'ai changé le type de NumDossier comme int au lieu de varchar, et au niveau de mon codage j'ai mis une méthode qui me retourne le max des id, j'incrémente par un, et j'appelle ma méthode, je sais si cette méthode me créera elle aussi des problème lors de l'insertion multiple au non ? sinon pour la concaténation c'est une bon solution sauf que je vais pas ajouter un champs année puisque j'enregistre deja la date systeme, donc je vais extacter la date à partir de cette date !

  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
    Citation Envoyé par Msysteme Voir le message
    au niveau de mon codage j'ai mis une méthode qui me retourne le max des id, j'incrémente par un, et j'appelle ma méthode, je sais si cette méthode me créera elle aussi des problème lors de l'insertion multiple au non ?
    Et là je crie CASSE-COU
    à lire de toute urgence :
    http://mysql.developpez.com/faq/?pag..._INCREMENT_max
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    merci pour la réponse, donc c'est évident que je dois changer cette méthode, mais dans tout les cas je peux pas mettre numDossier comme autincrement, parce que j'ai déjà des coder des méthode en se basant sur le numDossier, ce que je propose maintenant c'est de laisser le numDossier en int, et d'utliser la même méthode mais au lieu d'utiliser le max des id je vais utiliser le , qu'est ce que vous en pensez ?

  8. #8
    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
    J'en pense que c'est plus sûr, mais,...car il y a un mais, tu perds la notion de série annuelle d'incrémentation (rédémarrage à zéro chaque année) notion qui me semblait sous-entendue dans ton post de départ.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    j'ai pas bien compris ce que vous voulez dire, comment je vais perdre cette initialisation à zéro après chaque an, sincérement je compte ajouter une colonne année et la clé primaire sera la concaténation des deux et dans l'an qui suis j'initialise manuellement à 0 ?

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Une clé primaire d'une table issue d'une entité du MCD est de type entier non null non signé et auto-incrémenté !

    Autrement dit, votre clé primaire n'est pas top !

    Si vous utilisez l'auto-incrémentation de MySQL, vous ne pourrez pas la remettre à zéro chaque année. Il faut donc procéder autrement.

    Votre table devrait avoir une structure de ce genre :
    Dossiers (D_Id, D_NumDossier, D_DateEnregistrement, ...)

    Un truc qui m'inquiète aussi :
    j'ai une application web qui doit[strike]s[/strike] être installée dans plusieurs centres afin d'enregistrer des dossiers
    Installée dans plusieurs centres :
    - avec chacun leur base de donnée indépendante ?
    - s'adressant tous à la même base de données ?

    Si plusieurs centres s'adressent à la même base de données, il faudra verrouiller l'accès à la table quand quelqu'un voudra enregistrer un dossier car il risque de se passer le phénomène décrit dans le lien qui a été donné par Maljuna Kris.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    Non, tous les centres se connecte à la même base de données, à ce que j'ai compris à travers ce lien, si j'utilise le lase insert id, j'aurais pas ce problème de violation de clé

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Mais last_insert_id te retourne le dernier id (la dernière valeur de clé primaire) insérée pour la session utilisateur.
    Si tu veux réinitialiser chaque année à 0, tu perds l'avantage de l'auto-incrément de la clé primaire.
    Pas sûr alors que le last_insert_id fonctionne.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    mais je vais pas mettre mon numDossier (clé primaire) en autoincrément, mais juste en int.

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si numDossier est la clé primaire, tu ne pourras pas la réinitialiser chaque année.

    En 2009, tu vas du n° 1 au n° 365
    En 2010, tu ne peux pas recommencer au n° 1 puisqu'il existe déjà en tant que clé primaire.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  15. #15
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    donc, la solution c'est de concaténer l'entier et l'année ????

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    La solution que je choisirais...

    Table Dossiers (D_Id, D_NumDossier, D_DateEnregistrement, ...)

    Création d'un dossier...
    - Blocage en écriture de la table
    - Requête de récupération du dernier numéro de dossier de l'année :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT MAX(D_NumDossier)
    FROM Dossiers
    - Incrémentation de la valeur obtenue

    - Ajout du nouveau dossier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO Dossiers(D_NumDossier, D_DateEnregistrement, ...)
    VALUES($numnouveaudossier, CURRENT_DATE, ...)
    - Déblocage de la table en écriture.

    Ceci de manière à protéger le dernier numéro de dossier extrait.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  17. #17
    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,
    Il faudrait peut-être quand même dans ce cas, déclarer le couple {D_NumDossier, D_DateEnregistrement} UNIQUE, au cas où.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  18. #18
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    et comment puis je Bloquer/débloquer en écriture ma table, à titre d'information il y aura plusieurs accès a mon application, donc en cas de blocage et un autre utilisateur tente d'insérer à la base, que se passe t'il ?

  19. #19
    Membre actif Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Points : 290
    Points
    290
    Par défaut
    Une solution est de récuperer le max des id inserer en faisant la requette d'insertion et la requette de selection dans la meme transaction,
    deux methode possiple : au niveau SQL : Begin transaction et commit
    l'autre :
    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
    using (SqlConnection connection = new SqlConnection("chaineConnection"))
                {
                    connection.Open();
                    using (SqlTransaction trans = connection.BeginTransaction())
                    {
                        try
                        {
                            Sauvegarder(trans);
                            // On valide la transaction
                            trans.Commit();
                        }
                        catch (SqlException)
                        {
                            // On annule la transaction
                            trans.Rollback();
                            throw;
                        }
                    }
                }
    et ce max tu le sauvgarde dans la base en créant une table contenant tous les max des id(table compteur) et lors de la prochaine insertion tu récupere la valeur max
    à partir de cette table, tu insere puis tu recupere la valeur max et tu l'insere de nouveau dans la table compteur :
    En resumé :
    - ouvrir la transaction.
    - Recupere la max des id se trouvant dans la table compteur.
    - Insertion.
    - selection du max
    - insertion dans la table compteur
    - commit
    il reste un simple gestion d'année dont tu peut la resuperer à partir du champ dateEnregistrement.
    c une idée il se peut qu'elle soit un peut complexe mais elle est fiable.

  20. #20
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    C'est à un truc dans le genre auquel je pensais mais ne l'ayant jamais mis en oeuvre moi-même, je laisse ça aux plus expérimentés que moi en ce domaine.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 03/12/2010, 16h03
  2. Réponses: 7
    Dernier message: 26/06/2007, 20h00
  3. [MySQL] Identifiant Primaire qui s'auto incrémente
    Par The Molo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/04/2007, 13h58
  4. Réponses: 7
    Dernier message: 01/07/2006, 16h40
  5. [TRANSACT-SQL] clé primaire qui s'auto-incrémente
    Par DonJR dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/05/2006, 11h16

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