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 :

Modifier le compteur ID


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 166
    Par défaut Modifier le compteur ID
    bonjour
    j'ai l'impression (c'est même sûr) que lorsque je modifie ma BDD avec une instruction "INSERT INTO `matable` VALUES etc

    le numéro ID qui est en incrément auto ne prend pas en compte le dernier numéro écrit mais un compteur interne qui tient compte de toutes les insertions faites
    si bien que si l'on supprime des lignes on se retrouve avec des trous dans les numéro d'ordre.

    Comment peut-on faire pour que ce compteur ait la valeur du dernier ID écrit dans la table?

    Merci

  2. #2
    Invité de passage
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2013
    Messages : 45
    Par défaut
    Citation Envoyé par noradan Voir le message
    si bien que si l'on supprime des lignes on se retrouve avec des trous dans les numéro d'ordre.
    Bonsoir, oui, c'est normal et cela ne pose aucun problème. Le SGBD gère très bien cela.

    Citation Envoyé par noradan Voir le message
    Comment peut-on faire pour que ce compteur ait la valeur du dernier ID écrit dans la table?
    LAST_INSERT_ID() c'est indiqué dans la FAQ
    https://mysql.developpez.com/faq/?pa...autoincremente

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 022
    Billets dans le blog
    6
    Par défaut
    Aucun système d'auto incrément ne "récupère" les trous. Sinon il faudrait des transactions tellement bloquante qu'un seul utilisateur ne pourrait jamais insérer puisqu'il faudrait bloquer les autres utilisateurs si l'un fait une insertion. Or un SGBDR est fait pour servir un maximum d'utilisateur à la fois. De plus l'attribution d'une nouvelle valeur est arbitraire dans le sens ou le système (IDENTITY ou SEQUENCE selon la norme SQL) peut recommencer au début si l'on a épuisé les valeurs séquentielle, ou encore, vous pouvez vous même réajuster les valeurs de départ et le pas d'incrément qui n'est pas forcément de 1.

    Lisez mon cours sur le SQL à ce sujet :
    https://sqlpro.developpez.com/livre/...ions#LIII-10-5

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 720
    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 720
    Billets dans le blog
    10
    Par défaut
    Lisez mon article de blog à ce sujet ICI

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 166
    Par défaut
    Oh je me doute bien que ça ne pose aucun problème puisqu'en théorie on se fiche pas mal de la valeur de l'id.
    C'est un peu esthétique pour moi !
    Ma table a 32 lignes et le compteur est à 157 ça fait un peu bizarre !

    LAST_INSERT_ID ne répond pas à ma question si j'ai bien lu.
    Je ne veux pas récupérer la valeur, je l'ai sous les yeux... je voudrais qu'après avoir supprimer 120 lignes le compteur passe à 33 et pas 158!
    Mais si j'en crois ton blog "escartefigue" il n'y a pas moyen... Méééheu !

    C'est comme dans une liste numérotée (et pas "ordonnée" comme on dit en html, une liste étant TOUJOURS ordonnée par définition d'une liste !)
    En théorie on pourrait numéroter n'importe comment (du moment que ça reste croissant...) mais ça ferai un peu étrange d'avoir une liste 1, 7, 12, 94 ...

    La raison, histoire de raconter ma vie, est que je fais fabriquer un fichier php dans lequel je fais écrire automatiquement une valeur de VALUE
    comme mon programme (python) n'est pas encore tout à fait au point, je dois intervenir à la main, je corrige, je relance, je recorrige et je rerelance etc et à chaque fois
    il y a quelque ligne de VALUE qui passe mais ui répètent la même chose du coup j'ai une foultitude de ligne identiques que je détruit à la fin sauf que le compteur
    garde la dernière valeur en mémoire.

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 504
    Par défaut
    Bonjour,
    Hypothèse:
    Le "compteur" est à 0.
    1. L'utilisateur A débute une transaction, et insère une ligne dans la table
    2. L'utilisateur B débute une transaction, et insère une ligne dans la table.
    3. L'utilisateur B valide sa transaction
    4. L'utilisateur A annule sa transaction

    Quel est l'identifiant de la ligne insérée par l'utilisateur B ? 2. Le 1 avait été "réservé" par l'utilisateur A.
    Si tu veux numéroter les lignes "par ordre d'insertion", une solution serait de les horodater avec un timestamp, dont la valeur est current_timestamp().
    Reste à voir si la valeur est "calculée" à l'insertion de la ligne, ou à la validation de la transaction (à mon avis c'est à l'insertion).

    Tu peux aussi utiliser un RANK() pour numéroter les lignes à la génération du fichier. Mais la rang calculé risque fort de changer d'un export à l'autre, suivant la colonne utilisée pour le "calcul" du rang (l'horodatage indiqué précédemment).

    Mais un Id reste un Id, sans aucune signification.

    Tatayo.

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2024
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Janvier 2024
    Messages : 166
    Par défaut
    Evidemment tout ceci est vrai mais je suis le seul et unique utilisateur de la BDD: fabriquant, intervenant, utilisateur, etc
    il n'y a que moi qui insère ou détruit.

    C'est sans grande importance

    J'aurais bien aimé si cela avait été possible pour un unique "propriétaire" d'une table.

    Merci

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 720
    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 720
    Billets dans le blog
    10
    Par défaut
    Même en étant le seul utilisateur, il peut y avoir plusieurs threads.

    Quoi qu'il en soit, un identifiant attribué par le SGBD (identity, counter, serial, auto_increment... selon le sgbd) ne doit jamais être utilisé pour un besoin fonctionnel.

  9. #9
    Membre éprouvé Avatar de kick54
    Homme Profil pro
    Admin systèmes (Windows, Linux) et réseaux - Dev DB &Java IHM calcul scientifique
    Inscrit en
    Mai 2016
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Admin systèmes (Windows, Linux) et réseaux - Dev DB &Java IHM calcul scientifique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 116
    Par défaut
    Citation Envoyé par noradan Voir le message
    Evidemment tout ceci est vrai mais je suis le seul et unique utilisateur de la BDD: fabriquant, intervenant, utilisateur, etc
    il n'y a que moi qui insère ou détruit.

    C'est sans grande importance

    J'aurais bien aimé si cela avait été possible pour un unique "propriétaire" d'une table.

    Merci
    Bonjour,

    ... Avec tous inconvénients, aléas et précautions déjà énoncées, si ton SGBD dispose des Triggers, tu te passes de l'auto-incrément sur id (que tu déclares entier) et tu utilises un Trigger dans une pré-condition sur INSERT dans laquelle tu calcule la nouvelle valeur de id.
    Le code sera du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEFORE INSERT ... SELECT Max(id) + 1 FROM table
    Tu peux aussi le faire dans le code qui produit l'insertion d'un nouvel enregistrement.

    C'est un poil lourd, mais à vue de nez ça doit passer ;-)


    Cdlt

  10. #10
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 999
    Par défaut
    Citation Envoyé par noradan Voir le message
    Oh je me doute bien que ça ne pose aucun problème puisqu'en théorie on se fiche pas mal de la valeur de l'id. C'est un peu esthétique pour moi !
    Oh, l'esthétique...
    l'esthétique d'une liste... d'informations stockées dans une base...
    Est-ce bien LA problématique ?

    Citation Envoyé par noradan Voir le message
    Ma table a 32 lignes et le compteur est à 157 ça fait un peu bizarre !
    32 lignes.
    Pourquoi avoir choisi un compteur ?
    Pas moyen de numéroter "à la main" ?

    Citation Envoyé par noradan Voir le message
    LAST_INSERT_ID ne répond pas à ma question si j'ai bien lu.
    Je ne veux pas récupérer la valeur, je l'ai sous les yeux... je voudrais qu'après avoir supprimer 120 lignes le compteur passe à 33 et pas 158!
    Mais si j'en crois ton blog "escartefigue" il n'y a pas moyen... Méééheu !
    Alors, oui, il y a un moyen : https://learn.microsoft.com/fr-fr/sq...l-server-ver17
    mais attention, ça ne touche que la génération de valeurs ; rien ne dit que la valeur à venir contredise ou pas l'unicité imposée de la PK
    Note : l'instruction TRUNCATE purge les lignes et remet le compteur à zéro.

    Citation Envoyé par noradan Voir le message
    C'est comme dans une liste numérotée (et pas "ordonnée" comme on dit en html, une liste étant TOUJOURS ordonnée par définition d'une liste !)
    En théorie on pourrait numéroter n'importe comment (du moment que ça reste croissant...) mais ça ferai un peu étrange d'avoir une liste 1, 7, 12, 94 ...
    Il y a une GRANDE différence entre une clé, ce qui fait office de pointeur, et une projection, le résultat d'une interrogation.
    Si vous voulez voir une liste ordonnée et dense, il faut utiliser dans la projection une fonction de fenêtrage.
    Dans votre cas, je choisirais ROW_NUMBER : https://learn.microsoft.com/fr-fr/sq...l-server-ver17

    ce qui donnerait, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT row_number () over (order by id asc) as numero, t.colonne
    FROM matable t
    Le savoir est une nourriture qui exige des efforts.

Discussions similaires

  1. [2008R2] Modifier le compteur de la clé primaire d'une table
    Par Feliperennes dans le forum Développement
    Réponses: 7
    Dernier message: 15/12/2021, 14h22
  2. Modifier un compteur de couleur en VBA
    Par EAU24 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/06/2019, 19h06
  3. [AC-2003] Modifier le nom d'une variable (objet) avec un compteur.
    Par Treguerio dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/05/2011, 16h23
  4. Modifier un compteur de visites
    Par mouffon dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 14/10/2007, 23h33
  5. Modifier le compteur "equation"
    Par timesmoney dans le forum Mathématiques - Sciences
    Réponses: 5
    Dernier message: 21/08/2007, 13h37

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