bd Mysql

Eléphant du PHP | 440 Messages

13 janv. 2007, 16:13

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.
Débutant complet en php/mysql. Merci pour votre aide.

Mammouth du PHP | 19672 Messages

13 janv. 2007, 18:16

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 :

Code : Tout sélectionner

SELECT MAX(id) FROM table WHERE champ <> '';
En clair, tu demandes le dernier identifiant dans la table où la valeur du champ est différente de "vide".
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 2144 Messages

13 janv. 2007, 18:47

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.

Eléphant du PHP | 440 Messages

13 janv. 2007, 20:10

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 :

Code : Tout sélectionner

SELECT MAX(id) FROM table WHERE champ <> '';
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.
Débutant complet en php/mysql. Merci pour votre aide.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 janv. 2007, 22:48

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.... :roll:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 2144 Messages

13 janv. 2007, 23:04

et ça t'en as rien à faire.... :roll:
?? :roll:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 janv. 2007, 01:10

Arf... oubli d'un "?"... c'était une question bien évidemment :wink:

Il n'avait pas l'air très intéressé par tes remarques.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 2144 Messages

14 janv. 2007, 01:18

Il n'avait pas l'air très intéressé par tes remarques.
Pas grave, je m'en remettrais :lol: :lol:

ViPHP
ViPHP | 1961 Messages

14 janv. 2007, 03:04

Bonsoir,

Une façon de faire sans prendre de risques c'est :
1 - Supprimer les rangs que l'on ne désire plus

Code : Tout sélectionner

DELETE FROM t1 WHERE condition;
2 - Supprimer la colonne "auto_incrémentée"

Code : Tout sélectionner

ALTER TABLE t1 DROP nom_colonne;
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)
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Petit nouveau ! | 5 Messages

28 janv. 2007, 14:27

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

ViPHP
ViPHP | 1961 Messages

28 janv. 2007, 15:16

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)

Code : Tout sélectionner

SHOW TABLE STATUS LIKE 'nom_table';
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';
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Petit nouveau ! | 5 Messages

28 janv. 2007, 17:28

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?

ViPHP
ViPHP | 1961 Messages

28 janv. 2007, 17:44

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é ?
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Petit nouveau ! | 5 Messages

28 janv. 2007, 18:33

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?

ViPHP
ViPHP | 1961 Messages

28 janv. 2007, 19:15

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"
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein