Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/08/2006, 10h47   #1
Invité de passage
 
Inscription : août 2006
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 11
Points : 4
Points : 4
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
sportBlond est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h03   #2
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
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
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h21   #3
Invité de passage
 
Inscription : août 2006
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 11
Points : 4
Points : 4
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
sportBlond est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h30   #4
Provisoirement toléré
 
Avatar de Maximilian
 
Inscription : juin 2003
Messages : 2 622
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 2 622
Points : 2 505
Points : 2 505
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
Maximilian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h31   #5
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h38   #6
Invité de passage
 
Inscription : août 2006
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 11
Points : 4
Points : 4
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?
sportBlond est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h54   #7
Invité de passage
 
Inscription : août 2006
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 11
Points : 4
Points : 4
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
sportBlond est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h17.


 
 
 
 
Partenaires

Hébergement Web