Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Installation
Installation Forum d'entraide sur les problèmes liés à l'installation de 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 16/08/2006, 07h00   #1
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
Par défaut Trouver un ID libre rapidement

bonjour à tous

je viens vous voir en espérant pouvoir trouver la meilleure solution à ce que je souhaiterai réaliser

(pour info, j'utilise du php pour faire des requetes sur une bdd mysql)

j'ai une base de donnée d'utilisateurs où un champ "ID" est différent pour chaque utilisateur. quand un utilisateur se désabonne alors sa ligne correspondant à son "ID" est supprimée dans la base. quand un utilisateur s'abonne, une fonction php recherche le premier ID de libre pour lui affecter celui ci..

pour cela j'ai trouvé deux solutions :

1/ faire une boucle et une requete SELECT pour chaque id jusqu'a temps de trouver un "trou" libre
2/ ou je rappatrie tous les "ID" de ma table et fais une boucle pour tester dans mon resultat là où il y a un trou (éventuel).

mes questions sont donc les suivantes :

existe-t-il une requete dans mysql qui fait direct pile-poil ce que je demande?
ou alors, laquelle de mes deux solutions est la moins gourmande en ressources pour une très très grande base de données?
ou bien, existe-t-il une meilleure solutions que celles que je propose?

je vous remercie par avance du temps que vous pourrez m'accorder
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 09h02   #2
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
j'ai trouvé une solution qui pourrait ptetre le faire..

créer une base de données qui stockera les "ID" que je supprimerai comme ca j'ai qu'une requete a faire pour savoir quel "ID" est libre dans ma table!!

l'opération serait la suivante :

faire une premiere requete COUNT qui me donnera le nombre de lignes de ma base d'utilisateurs.
faire une deuxieme requete qui me dit si la ligne avec le numéro "ID" égal au nombre de lignes existe dans cette meme base.
si elle existe c'est qu'il n'y a pas de trou donc je choisis l'ID du COUNT+1, sinon je vais chercher dans ma table secondaire un ID que j'aurai effacé, je l'utilise, et je l'efface de ma table secondaire vu qu'il est réutilisé

un peu compliké mais un gain de ressources je pense

qu'est ce que vous en pensez??
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 19h44   #3
Membre éprouvé
 
Avatar de Christophe Charron
 
Homme Christophe Charron
Développeur informatique
Inscription : juillet 2005
Messages : 768
Détails du profil
Informations personnelles :
Nom : Homme Christophe Charron
Âge : 51
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2005
Messages : 768
Points : 492
Points : 492
Bonsoir,
quelque chose comme
Code :
SELECT _table.cleunik+1 FROM _table WHERE (_table.cleunik+1) NOT IN (SELECT _table.cleunik FROM _table) LIMIT 1
devrait faire l'affaire non ?
__________________
Cordialement,
Christophe Charron
Pour consulter mon site professionnel, vous pouvez cliquer sur le bouton prévu à cet effet, juste sous la signature .
Christophe Charron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 20h47   #4
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
salut

nan ca marche pas
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 20h51   #5
Membre éprouvé
 
Avatar de Christophe Charron
 
Homme Christophe Charron
Développeur informatique
Inscription : juillet 2005
Messages : 768
Détails du profil
Informations personnelles :
Nom : Homme Christophe Charron
Âge : 51
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2005
Messages : 768
Points : 492
Points : 492
si, mais il faut rajouter un order by
__________________
Cordialement,
Christophe Charron
Pour consulter mon site professionnel, vous pouvez cliquer sur le bouton prévu à cet effet, juste sous la signature .
Christophe Charron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 20h56   #6
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
bah ca me fait une erreur comme quoi la syntaxe est mauvaise..

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Erreur
 
requête SQL :  
 
SELECT musiciens.ID
FROM musiciens
WHERE (
 
musiciens.ID + 1
) NOT 
IN (
 
SELECT musiciens.ID
FROM musiciens
)
LIMIT 0 , 30 
 
MySQL a répondu:
 
 
#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT musiciens.ID
FROM musiciens ) LIMIT 0, 30' at line 5
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h02   #7
Membre éprouvé
 
Avatar de Christophe Charron
 
Homme Christophe Charron
Développeur informatique
Inscription : juillet 2005
Messages : 768
Détails du profil
Informations personnelles :
Nom : Homme Christophe Charron
Âge : 51
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2005
Messages : 768
Points : 492
Points : 492
Citation:
Envoyé par RiPSO
bah ca me fait une erreur comme quoi la syntaxe est mauvaise..

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Erreur
 
requête SQL :  
 
SELECT musiciens.ID
FROM musiciens
WHERE (
 
musiciens.ID + 1
) NOT 
IN (
 
SELECT musiciens.ID
FROM musiciens
)
LIMIT 0 , 30 
 
MySQL a répondu:
 
 
#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT musiciens.ID
FROM musiciens ) LIMIT 0, 30' at line 5
Il y en manque un bout ...
Code :
SELECT musiciens.ID+1 FROM musiciens WHERE (musiciens.ID + 1) NOT IN (SELECT musiciens.ID FROM musiciens) ORDER BY ID LIMIT 1
Il faut faire attention aux caractères invisibles style "tab" lors des copier-coller et question très triviale "musiciens.ID est bien numérique ?
__________________
Cordialement,
Christophe Charron
Pour consulter mon site professionnel, vous pouvez cliquer sur le bouton prévu à cet effet, juste sous la signature .
Christophe Charron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h10   #8
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
oui il manquait le premier "+1" mais je l'avais retiré car ca ne devait pas poser de probleme : après je peux rajouter le +1 dans mon code php.
sinon il n'y a pas de probleme de tab, et j'ai testé le code dans une requete php, et aussi directement sous phpmyadmin et ca ne marche pas, j'ai toujours la meme erreur.. snif
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h11   #9
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
et oui ID est un int unsigned

ca ne pourrait pas venir d'un probleme de version de mysql?? par exemple une version qui n'accepterai pas les requetes imbriquées l'une dans l'autre..

j'ai MySQL 4.0.15-max-debug
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h20   #10
Membre éprouvé
 
Avatar de Christophe Charron
 
Homme Christophe Charron
Développeur informatique
Inscription : juillet 2005
Messages : 768
Détails du profil
Informations personnelles :
Nom : Homme Christophe Charron
Âge : 51
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2005
Messages : 768
Points : 492
Points : 492
Citation:
Envoyé par RiPSO
et oui ID est un int unsigned

ca ne pourrait pas venir d'un probleme de version de mysql?? par exemple une version qui n'accepterai pas les requetes imbriquées l'une dans l'autre..

j'ai MySQL 4.0.15-max-debug
Je viens de faire l'essai suivant, sur une de mes vraies bases online
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT _documents.doc_cleunik +1
FROM _documents
WHERE (
_documents.doc_cleunik +1
) NOT
IN (
 
SELECT _documents.doc_cleunik
FROM _documents
)
ORDER BY _documents.doc_cleunik
LIMIT 1
pas d'erreur et il me retourne bien un premier trou !!
Test fait sur phpMyAdmin 2.7.0-pl1, MySQL 4.1.15 sur un linux fedora a priori, la table est en INNODB. Ma "doc_cleunik" est un bigint(20)
Je pourrai faire des essais demain, sur d'autres bases, sur windows et avec d'autres requêteurs ...
__________________
Cordialement,
Christophe Charron
Pour consulter mon site professionnel, vous pouvez cliquer sur le bouton prévu à cet effet, juste sous la signature .
Christophe Charron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h22   #11
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 RiPSO
ca ne pourrait pas venir d'un probleme de version de mysql?? par exemple une version qui n'accepterai pas les requetes imbriquées l'une dans l'autre..

j'ai MySQL 4.0.15-max-debug
Bingo, pas de sous-requêtes avant la 4.1

Voir pour réécrire avec une jointure externe gauche http://mysql.developpez.com/faq/?pag..._sous_requetes
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h29   #12
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
argghhh

c'est pas juste!!!

le probleme alors c'est que je ne sais pas quelle version de mysql sera utilisée chez mon futur hebergeur.. (amen ou ovh surement.. il faut que je me renseigne sur les pour ou contres..)

que me conseillez vous dans ce cas?? la solution de créer une table qui contiendra tous les ID effacés n'est peut etre pas trop mauvaise nan?
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h30   #13
Membre éprouvé
 
Avatar de Christophe Charron
 
Homme Christophe Charron
Développeur informatique
Inscription : juillet 2005
Messages : 768
Détails du profil
Informations personnelles :
Nom : Homme Christophe Charron
Âge : 51
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2005
Messages : 768
Points : 492
Points : 492
Citation:
Envoyé par Biglo
Bingo, pas de sous-requêtes avant la 4.1

Voir pour réécrire avec une jointure externe gauche http://mysql.developpez.com/faq/?pag..._sous_requetes
oups, j'ai pas le réflexe !! D'autant qu'elle commence à dater cette version : septembre 2003, c'est antediluvien ça ...
__________________
Cordialement,
Christophe Charron
Pour consulter mon site professionnel, vous pouvez cliquer sur le bouton prévu à cet effet, juste sous la signature .
Christophe Charron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h39   #14
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
maieuuu

qu'est ce que je fais alors?

sur ovh ils disent : Une fois livré, le serveur est opérationnel pour l'hébergement (Apache 1, mail, admin, PHP 4, MySQL 3 et OVHm)
..

j'imagine que chez tous les hebergeurs c la meme, je vais installer une version + neuve je crois et lacher ma vieille version qui m'a tant aidé durant ces années.. snif
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h41   #15
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
merci à tout les 2 je vais m'upgrader en fait..

alors merci a biglo pour la précision et puis Christophe Charron pour ce style de requete que je ne connaissais pas!!
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h43   #16
Membre éprouvé
 
Avatar de Christophe Charron
 
Homme Christophe Charron
Développeur informatique
Inscription : juillet 2005
Messages : 768
Détails du profil
Informations personnelles :
Nom : Homme Christophe Charron
Âge : 51
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2005
Messages : 768
Points : 492
Points : 492
Citation:
Envoyé par RiPSO
maieuuu

qu'est ce que je fais alors?

sur ovh ils disent : Une fois livré, le serveur est opérationnel pour l'hébergement (Apache 1, mail, admin, PHP 4, MySQL 3 et OVHm)
..

j'imagine que chez tous les hebergeurs c la meme, je vais installer une version + neuve je crois et lacher ma vieille version qui m'a tant aidé durant ces années.. snif
Heu MYSQL 3 ça me laisse un peu dubitatif !!! Je doute qu'ils aient beaucoup de nouveaux clients avec une aussi vieillle version. (N'oublie pas le "résolu")
__________________
Cordialement,
Christophe Charron
Pour consulter mon site professionnel, vous pouvez cliquer sur le bouton prévu à cet effet, juste sous la signature .
Christophe Charron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2006, 21h47   #17
Invité de passage
 
Inscription : avril 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 17
Points : 2
Points : 2
a bah vi j'en suis a la 4.. bon.. jvais faire une pause avant de me relancer dans l'aventure
c'est bizarre ils disent la version 3 pour php4 et mysql5 pour php5..
mouais, bref merci pour tout
RiPSO est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h23.


 
 
 
 
Partenaires

Hébergement Web