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

SQL Procédural MySQL Discussion :

Que se passe-t-il en cas de dépassement d' un champs auto-incrémentés?


Sujet :

SQL Procédural MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Que se passe-t-il en cas de dépassement d' un champs auto-incrémentés?
    Dans le "FAQ":

    Si la colonne est déclarée avec un index unique
    (UNIQUE INDEX ou PRIMARY KEY), une erreur va se produire et vous ne pourrez plus entrer de données dans cette table.
    Si l'index n'est pas de type unique, la valeur maximum de la colonne sera réutilisée pour toutes les nouvelles insertions.


    exemple:
    CREATE TABLE(
    id tynint(4) unsigned ZEROFILL NOT NULL auto_increment
    PRIMARY KEY (id))

    Ce qui donne la possibilité au champs id un nombre maximum de 9999.
    Et c'est tout?
    -N'ya t ' il pas um moyen d'augmenter automatiquement le type de table(ici: tynint(5))

    -Et optimiser la table en enlevant les "trous":
    (quand on "DELETE" un "row" , son id reste "virtuellement" dans le syteme
    et le prochain INSERT sera le nombre + 1 du "row" éffacé)

    J'espère m'être fait comprendre.
    Je vous remercie par avance de vos réponses.
    cordialement,
    sportBlond

  2. #2
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par sportBlond
    -N'ya t ' il pas um moyen d'augmenter automatiquement le type de table(ici: tynint(5))
    Automatiquement non, il faut utiliser un ALTER TABLE pour modifier le type de la colonne.

    Citation Envoyé par sportBlond
    -Et optimiser la table en enlevant les "trous":
    (quand on "DELETE" un "row" , son id reste "virtuellement" dans le syteme
    et le prochain INSERT sera le nombre + 1 du "row" éffacé)
    Les moteurs de stockage InnoDB et MyISAM (les plus utilisés) ne permettent pas de "boucher les trous". Par contre il est théoriquement possible de remettre l'auto-incrément à la valeur la plus haute de la colonne +1, avec un ALTER TABLE latable AUTO_INCREMENT=..., par exemple s'il y a eu un gros DELETE des X dernières lignes insérées.
    Pensez au bouton

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci Maximilian pour ta Réponse.

    1.
    Donc si je comprends bien pour contrecarré le risque de Dépassement il faudrait faire une function qui récupère le dernier id et qui vérifie qu'il ne dépasse pas le seuil maximum ( dans mon cas 9999) et si il le dépasse
    modifier avec un "ALTER" le type de champs.(dans mon cas tynint(5)).


    2.
    A chaque fois que l'on fait un DELTETE d'un "row", il serait bon d'utiliser
    d'utiliser une function comme tu l'as décrite:
    "ALTER TABLE latable AUTO_INCREMENT=..." afin de remettre l'auto-incrément à la valeur la plus haute de la colonne +1.
    (afin de réduire le risque de dépassement en éliminant régulièrement les "trous")

    ai-je tout bien compris?

    Merci encore.
    sportBlond

  4. #4
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par sportBlond
    1.
    Donc si je comprends bien pour contrecarré le risque de Dépassement il faudrait faire une function qui récupère le dernier id et qui vérifie qu'il ne dépasse pas le seuil maximum ( dans mon cas 9999) et si il le dépasse
    modifier avec un "ALTER" le type de champs.(dans mon cas tynint(5)).
    Oui mais en général c'est le genre de truc qu'on voit venir si on est vigilant... Ca n'arrive pas non plus tous les 4 matins.


    Citation Envoyé par sportBlond
    2.
    A chaque fois que l'on fait un DELTETE d'un "row", il serait bon d'utiliser
    d'utiliser une function comme tu l'as décrite:
    "ALTER TABLE latable AUTO_INCREMENT=..." afin de remettre l'auto-incrément à la valeur la plus haute de la colonne +1.
    (afin de réduire le risque de dépassement en éliminant régulièrement les "trous")
    Oui, ou il se peut que MySQL le fasse automatiquement Je sais plus très bien, il faudrait tester...
    Pensez au bouton

  5. #5
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Citation Envoyé par sportBlond
    qui vérifie qu'il ne dépasse pas le seuil maximum ( dans mon cas 9999) et si il le dépasse
    modifier avec un "ALTER" le type de champs.(dans mon cas tynint(5)).
    Dans ton cas, la valeur maximum est 255, comme tout TINYINT UNSIGNED. Le nombre entre parenthèses ne correspond pas aux nombres de chiffres acceptés.

    Donc, pour ton ALTER, il faut passer au type supérieur : SMALLINT.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    je vais tester.
    mais bon une petite function qui vérifie que le id ne vas déborder
    c'est pas mal (je ne vais pas Vérifier manuellemenet que le id à encore
    de la place)
    est-ce la bonne méthode?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    capitain poisson pané a dit:
    "Dans ton cas, la valeur maximum est 255, comme tout TINYINT UNSIGNED. Le nombre entre parenthèses ne correspond pas aux nombres de chiffres acceptés."

    dans tynind(5), le 5 correspond à quoi?J'ai ,en pleine ignorance, toujours pensé que c'était le nombre de chiffre maximum acceptés.http://www.developpez.net/forums/images/smilies/fou.gif


    Merci pour ta pertinence, capitain BIGLO

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/10/2006, 09h44
  2. Que se passe t il lors de la pose d'un composant?
    Par korntex5 dans le forum Composants VCL
    Réponses: 8
    Dernier message: 06/10/2005, 13h30
  3. que se passe t il quand ...
    Par -<R1>- dans le forum Débuter
    Réponses: 2
    Dernier message: 28/06/2004, 14h00
  4. Que se passe-t-il en interne si un ROLLBACK plante ?
    Par jack554 dans le forum Administration
    Réponses: 4
    Dernier message: 07/04/2004, 12h55
  5. [VB6] [Install] Que se passe-t-il lors du setup?
    Par petit scarabée dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 28/10/2002, 08h26

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