Page 1 sur 2
bd Mysql
Posté : 13 janv. 2007, 16:13
par cmoi
Bonjour,
en faisant des tests j'ai créé un tas de lignes vides. Il est possible de les supprimer bien sûr. Mais comment faire pour revenir au numéro (auto incrémenté) de mon choix ?
Merci pour votre aide.
Posté : 13 janv. 2007, 18:16
par Cyrano
SI tu sais que ce sont des lignes vides et que tu veux le dernier identifiant de la ligne où il y a des valeurs, ça peut se faire avec une requête du genre :
En clair, tu demandes le dernier identifiant dans la table où la valeur du champ est différente de "vide".
Posté : 13 janv. 2007, 18:47
par iclo
Par définition un auto incrément est une valeur attribuée par le serveur de base de donnée pour indentifier un enregistrement sans équivoque.
Cela ne pose donc pas de problème, si il y a des "trous" dans la suite de valeurs, tant qu'une valeur n'est pas utilisée plus d'une fois.
Il est donc fortement déconseillé de "revenir" en arrière dans les affectation d'un auto-incrément.
Posté : 13 janv. 2007, 20:10
par cmoi
SI tu sais que ce sont des lignes vides et que tu veux le dernier identifiant de la ligne où il y a des valeurs, ça peut se faire avec une requête du genre :
En clair, tu demandes le dernier identifiant dans la table où la valeur du champ est différente de "vide".
Ca résoud mon problème. Merci.
Posté : 13 janv. 2007, 22:48
par Truc
Par définition un auto incrément est une valeur attribuée par le serveur de base de donnée pour indentifier un enregistrement sans équivoque.
Cela ne pose donc pas de problème, si il y a des "trous" dans la suite de valeurs, tant qu'une valeur n'est pas utilisée plus d'une fois.
Il est donc fortement déconseillé de "revenir" en arrière dans les affectation d'un auto-incrément.
et ça t'en as rien à faire....

Posté : 13 janv. 2007, 23:04
par iclo
et ça t'en as rien à faire....

??

Posté : 14 janv. 2007, 01:10
par Truc
Arf... oubli d'un "
?"... c'était une question bien évidemment
Il n'avait pas l'air très intéressé par tes remarques.
Posté : 14 janv. 2007, 01:18
par iclo
Il n'avait pas l'air très intéressé par tes remarques.
Pas grave, je m'en remettrais

Posté : 14 janv. 2007, 03:04
par Ajoloca
Bonsoir,
Une façon de faire sans prendre de risques c'est :
1 - Supprimer les rangs que l'on ne désire plus
2 - Supprimer la colonne "auto_incrémentée"
3 - Recréer la colonne par un
Code : Tout sélectionner
ALTER TABLE t1 ADD nom_colonne INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (nom_colonne);
Comme expliqué dans
la doc, en bas de page (la version anglaise est plus claire)
Posté : 28 janv. 2007, 14:27
par glattering
Bonjour,
Ajoloca, quel est le degré de "c'est propre", "c'est peu coûteux" et finalement "c'est la bonne manière de faire" de la solution que tu proposes?
Si j'ai bien compris, ce que tu proposes résoud le cas:
On ajoute des entrées dans une table qui comporte une colonne auto increment, on supprime des entrées, et on veut qu'au prochain ajout les id aient été re numérotés de manière à ce qu'on ajoute la nouvelle entrée avec max(id)+1, c'est bien ça? (je demande confirmation car je débute!)
C'est plus du bidouillage ou bien si on souhaite faire ce que cherche à faire cmoi c'est LA bonne solution?
Merci!
/glattering
Posté : 28 janv. 2007, 15:16
par Ajoloca
Bonjour,
Jouer sur une colonne auto_incémentée n'a pas de bonne méthode.
Disons que celle que je propose est la moins pire.
Une autre chose que je déconseille c'est d'utiliser max(id) + 1.
On ne sais pas (surtout si on travaille avec des transactions) le nombre d'instructions "INSERT" en attente.
Il-y-a des solutions plus fiables pour obtenir cette valeur.
Si on utilise une version de MySQL ne disposant pas du schéma (base) "INFORMATION_SCHEMA" (< à la 5)
et de récupérer la valeur du champ " Auto_increment" qui correspondrait au max(id) + 1
Mais si MySQL >= 5 la meilleure solution c'est de passer par une requête sur le schema "INFORMATION_SCHEMA" comme ceci
Code : Tout sélectionner
SELECT auto_increment FROM information_schema.tables
WHERE table_schema = 'nom_base' AND table_name = 'nom_table';
Posté : 28 janv. 2007, 17:28
par glattering
Merci pour ta réponse Ajoloca. Pour le coup du max+1 c'était pour être clair dans mon explication, pas pour décrire la manière de procéder

mais merci pour les précisions quand même!
Sinon, dans un autre forum, j'ai lu qu'un bon moyen de remplir les "trous" d'une table était de disposer d'une table annexe contenant les indices des trous et d'y faire appel pour les nouvelles insertions. Qu'en penses tu?
Posté : 28 janv. 2007, 17:44
par Ajoloca
Re,
Le problème c'est que quelle que soit la méthode on détourne l'auto_increment de sa fonction initiale (identifier un élément de manière unique).
Si tu l'attribues à un enregistrement, il ne devrait (conceptuellementt parlant) pouvoir identifier un autre, même si le premier n'existe plus.
Penses-tu que la Sécurité Sociale réutilise un numéro même si la personne est décédée ???
Penses-tu que la Préfecture te redonnera un numéro d'immatriculation pour une nouvelle voiture même si l'ancienne est à la casse ???
Et des exemples comme ceux-ci, il-y-on a des milliers.
D'un autre coté je ne comprends pas le besoin de (ne pas avoir de trous) pour ce type de données.
En règle générale, si ce numéro te sert à autre chose qu'à identifier (trier, ordre d'enregistrement, ...), c'est qu'il-y-a un PB de conception en amont.
Peu-tu m'expliquer la raison du pourquoi tu voudrais cette continuité ?
Posté : 28 janv. 2007, 18:33
par glattering
Excuse moi, en fait j'ai été un peu flou, dans le cas d'une table annexe, il n'y aurait pas d'auto increment, mais une gestion personnelle des id.
Je comprends bien le problème de l'identification et de la renumérotation. Je m'en suis rendu compte très vite, rien que par le fait que l'id puisse être utilisé dans d'autres tables!
Pour répondre à ta question, ce numéro ne me servirait qu'à l'identification. Le souci de combler les "trous" dans la liste vient que pour moi si les id ne cessent d'augmenter le système n'est pas "stable" en quelque sorte. Si j'ajoute et que je supprime un élément, je dois me retrouver dans le même état qu'avant.
Je suis d'accord qu'avec suffisamment de place, ce n'est pas un souci, mais disons que ça titille ma sensibilité de... système stable.
/glattering, suis je normal?
Posté : 28 janv. 2007, 19:15
par Ajoloca
Re,
Le système ne sera que plus stable si tu laisses à MySQL faire le travail pour lequel il est prévu.
Ne penses pas que les données sont organisées (écrites sur disque) comme toi tu les visualises.
Concernant l'espace, c'est encore le travail de MySQL, lui seul sait où il doit écrire en fonction de ses propres critères (qui eux sont fonction de ta structure).
C'est pas parce que tu réutilises un id que tu récupères l'espace ou parce que tu en ajoutes un que le perds.
Suis toujours cette régle : "Un identifiant est unique et doit le rester en toute circonstances"