comment avoir juste le bon coté du auto_increment de mysql?

comment avoir juste le bon coté du auto_increment de mysql? - SQL/NoSQL - Programmation

Marsh Posté le 14-03-2003 à 16:05:38    

Bonjour, je vous explique,  
auto_increment permet de générer un nombre unique
mais le problème
c'est qu'une fois 20 enregistrements sauvegardés puis qu'on supprime tout ou une partie,  
lorsqu'on en rentre 1 nouveau, auto_increment génére "21"
alors que un nombre inférieur aurait pu aller...
 
comment fait on pour avoir par exemple, le premier nombre libre à partir de 1?

Reply

Marsh Posté le 14-03-2003 à 16:05:38   

Reply

Marsh Posté le 14-03-2003 à 16:10:55    

fbthereturn a écrit :

Bonjour, je vous explique,  
auto_increment permet de générer un nombre unique
mais le problème
c'est qu'une fois 20 enregistrements sauvegardés puis qu'on supprime tout ou une partie,  
lorsqu'on en rentre 1 nouveau, auto_increment génére "21"
alors que un nombre inférieur aurait pu aller...
 
comment fait on pour avoir par exemple, le premier nombre libre à partir de 1?


 
t'as vraiment envie d'exploser ta complexité ?

Reply

Marsh Posté le 14-03-2003 à 16:55:50    

il n'y a pas un truc simple pour résoudre cela?

Reply

Marsh Posté le 14-03-2003 à 18:53:23    

fbthereturn a écrit :

il n'y a pas un truc simple pour résoudre cela?


 
Y'a vraiment un intérèt à le faire ?

Reply

Marsh Posté le 14-03-2003 à 19:19:56    

fbthereturn a écrit :

Bonjour, je vous explique,  
auto_increment permet de générer un nombre unique
mais le problème
c'est qu'une fois 20 enregistrements sauvegardés puis qu'on supprime tout ou une partie,  
lorsqu'on en rentre 1 nouveau, auto_increment génére "21"
alors que un nombre inférieur aurait pu aller...
 
comment fait on pour avoir par exemple, le premier nombre libre à partir de 1?


 
Pas possible/inutile.
 
Pour ce que tu veux faire, il faut incrémenter et décrémenter à la main et faire une batterie de tests/modifications pour faire un décalage. Tu inventes un champ "ordre". Et tu réalises une boucle en faisant descendre de 1 tous les valeurs du champ "ordre" supérieur à ton champ qui vient de disparaitre.
 
Mais, c'est très rare d'avoir besoin de faire ça. ça peut servir lorsqu'on propose dans un site dynamique permettant de creer ses propres catégories d'ordonner ces mêmes catégories.

Reply

Marsh Posté le 14-03-2003 à 19:33:59    

fbthereturn a écrit :

Bonjour, je vous explique,  
auto_increment permet de générer un nombre unique
mais le problème
c'est qu'une fois 20 enregistrements sauvegardés puis qu'on supprime tout ou une partie,  
lorsqu'on en rentre 1 nouveau, auto_increment génére "21"
alors que un nombre inférieur aurait pu aller...


 
Pour bien faire la primary key d'un record est identifiant de ce record à jamais meme si il a été effacé. Imagine que pour une raison lambda tu gardes la référence vers le record Id 18 dans un client quelconque. Qqun d'autre vire le record 18 puis tu récrée un autre,complètement différent et mySQL lui file l'id 18. Avoue que c'est un peu foireux non ;)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 14-03-2003 à 19:53:02    

oui, et en plus c vraiment faire compliqué...
pourquoi s'embeter avec ça...  :??:

Reply

Marsh Posté le 14-03-2003 à 20:59:26    

Je crois qu'il y a une commande pour "réinitialiser" le compteur. Mais laquelle ... :??:

Reply

Marsh Posté le 14-03-2003 à 21:15:08    

il n'y en a qu'une à ma connaissance: en recréant la table.  Même en Access, sauf que ça s'appelle compactage, mais en réalité, il recrée l'entièreté du fichier MDB pour éliminer les zones inutilisées.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 15-03-2003 à 10:56:24    

DarkLord a écrit :


 
Pour bien faire la primary key d'un record est identifiant de ce record à jamais meme si il a été effacé. Imagine que pour une raison lambda tu gardes la référence vers le record Id 18 dans un client quelconque. Qqun d'autre vire le record 18 puis tu récrée un autre,complètement différent et mySQL lui file l'id 18. Avoue que c'est un peu foireux non ;)


 
ok pour ça .. c à moi de vérifier
 
sinon, oui

Code :
  1. ça peut servir lorsqu'on propose dans un site dynamique permettant de creer ses propres catégories d'ordonner ces mêmes catégories.


 
c un peu ça que je veux faire
 
et quand la primary key arrive au bout de la valeur admissible?
qu'est ce qu'il se passe?
genre 255 pour un tinyint.. ça fait quoi aprés?

Reply

Marsh Posté le 15-03-2003 à 10:56:24   

Reply

Marsh Posté le 15-03-2003 à 14:44:22    

fbthereturn a écrit :


 
ok pour ça .. c à moi de vérifier
 
sinon, oui

Code :
  1. ça peut servir lorsqu'on propose dans un site dynamique permettant de creer ses propres catégories d'ordonner ces mêmes catégories.


 
c un peu ça que je veux faire


 
bin dans ce cas tu as ton id autoicrémenté et une colonne supplémentaire avec l'id de la catégorie si tu veux pouvoir la réallouer etc ... mais agir sur une vraie primary key c'est une erreur de design


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-03-2003 à 14:44:55    

fbthereturn a écrit :


et quand la primary key arrive au bout de la valeur admissible?
qu'est ce qu'il se passe?
genre 255 pour un tinyint.. ça fait quoi aprés?


 
unsigned -> ca se crashe je pense
signed -> -255


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 15-03-2003 à 16:36:36    

DarkLord a écrit :


 
bin dans ce cas tu as ton id autoicrémenté et une colonne supplémentaire avec l'id de la catégorie si tu veux pouvoir la réallouer etc ... mais agir sur une vraie primary key c'est une erreur de design


 
Exact !  :jap:  C'est exactement ce que j'ai fait dans mon dernier site pour une cliente. ;)

Reply

Marsh Posté le 16-03-2003 à 11:08:29    

Hermes le Messager a écrit :


 
Exact !  :jap:  C'est exactement ce que j'ai fait dans mon dernier site pour une cliente. ;)
 


 
[:rougit]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 03-04-2003 à 14:22:32    

quelqu'un peut confirmer cela???  
 

Code :
  1. et quand la primary key arrive au bout de la valeur admissible?
  2. qu'est ce qu'il se passe?
  3. genre 255 pour un tinyint.. ça fait quoi aprés?
  4. unsigned -> ca se crashe je pense
  5. signed -> -255

Reply

Marsh Posté le 03-04-2003 à 18:26:43    

Bon je résume la situation.
Dans une relation de clients, on en insert 20
Donc client 1,2,3 ... 20
On vire le 20ième puis on insert un nouveau client, ce nouveau client aura un id 21, ce qui laisse un trou entre 19 et 21, y'a pas un ordre SQL qui donne à l'attribut d'auto increment la bonne valeur après des suppressions ???
 
++

Reply

Marsh Posté le 04-04-2003 à 17:26:47    

Sans inserer un nouvel enregistrement,
est il possible de savoir  
quel valeur id(autoincrement) va avoir?


Message édité par fbthereturn le 04-04-2003 à 17:27:21
Reply

Marsh Posté le 04-04-2003 à 20:20:37    

Je comprends pas pkoi utiliser l'autoincrementation ds ce cas ... l'A.I. sert justement à pas se faire chier avec des ID unique a rentrer a chaque fois. Si c pour tout reorganiser a chaque fois, l'AI ne sert à plus rien ... dans ce cas autant tout rentrer manuellement. Meme si, comme ds ton exemple, ca devai sauter de 19 à 21 ... ca pose pas de pb il me semble, si ?
 
Edit, de toute façon, dans ce cas la, si c pour que tes chiffres aillent de 1 à 48 si tu as 48 enregistrement, puis de 1 à 38 si tu en vires 10 ... autant ne rien mettre et utiliser la fonction COUNT pour savoir combien il y a de données ds la BDD...


Message édité par Dj YeLL le 04-04-2003 à 20:21:56

---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 06-04-2003 à 23:35:13    

Je conserve les avantages de l'auto increment mais j'aimerais juste que la liste soit sans trou si on en vire qq uns et qu'on en rajoute après ... :whistle:

Reply

Marsh Posté le 06-04-2003 à 23:42:12    

Tu peux passer un script de temps en temps qui va modifier les numéros. Mais attention si ces numéros sont utilisés à un autre endroit :/  
 
Ou alors tu crées une liste des numéros non attribués. A l'insertion, tu prends un numéro dans cette liste et tu l'utilises. S'il n'y en a pas dans la liste, tu fais l'insertion sans préciser de numéro pour utiliser l'auto-incrémentation :)  
 
Autre possibilité : tu ne supprimes pas les enregistrements de ta table, mais tu les marque comme étant réutilisables. Au moment d'insérer, tu regardes si des numéros sont disponibles et, si oui, tu en utilise un (tu fais un UPDATE au lieu d'un INSERT) :)

Reply

Marsh Posté le 10-04-2003 à 19:32:50    

Pas con, la dernière technique avec l'update :hello:

Reply

Marsh Posté le 30-04-2003 à 09:49:26    

Sans inserer un nouvel enregistrement,
est il possible de savoir  
quel valeur id(autoincrement) va avoir?

Reply

Marsh Posté le 30-04-2003 à 09:54:30    

DarkLord a écrit :


 
unsigned -> ca se crashe je pense
signed -> -255


 
si c'est signé, ca ne va pas jusqu'à 255, mais de -128 à 127

Reply

Marsh Posté le 30-04-2003 à 10:20:47    

fbthereturn a écrit :

Sans inserer un nouvel enregistrement,
est il possible de savoir  
quel valeur id(autoincrement) va avoir?
 


 
phpMyAdmin donne le numéro suivant, il doit donc y avaoir une fonction mysql qui te donne cette valeur. cf doc.

Reply

Marsh Posté le 30-04-2003 à 12:02:20    

et quand on insère un enregistrement, ça pourrait nous retourner l'id de l'enregistrement?

Reply

Marsh Posté le 30-04-2003 à 12:58:40    

fbthereturn a écrit :

et quand on insère un enregistrement, ça pourrait nous retourner l'id de l'enregistrement?


 
à avoir pê du côté de LAST_INSERT_ID()

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed