le 13/11/2008 à 00:21
LA GLOBULE
Si, il y a plein de techniques.
Dans tous les cas, tu vas devoir gicler l'auto_increment et calculer ton id avant de faire ton INSERT.
Technique 1 : générer une clé unique
Pour cette solution, tu vas utiliser une clé primaire que tu vas générer au préalable.
Il te suffit en fait de générer une clé "unique". PHP fait la même pour générer des identifiants de session PHP.
Pour cela, tu peux par exemple utiliser la fonction uniqid. Voir te créer une fonction génératrice d'identifiant unique.
Tu obtiens alors ton identifiant à utiliser pour ton INSERT.
Technique 2 : utiliser une table SQL contenant le dernier id utilisé
Tu vas, par exemple, te créer une table 'generation_id' ou tu auras juste une seule ligne d'une seule colonne. Appelons ce champs de type numérique 'id'.
Le but du jeu, c'est de sélectionner la valeur de ce chiffre pour connaitre le dernier 'id' utilisé, l'augmenter de 1 et mettre à jour ce chiffre pour les utilisations futures.
Pour éviter le problème de concurrence d'accès à cet 'id', il faut faire un SELECT FOR UPDATE (je te conseille de lire la documentation MySQL à ce sujet).
Exemple de marche à suivre :
Tu vas lancer une première requete qui va vérouiller ton champs 'id' (aucune autre requete ne pourra accéder à ce champ tant que tu ne l'auras pas modifié) :
Tu récupères la valeur dans une variable PHP genre $id, ensuite, dans ton PHP tu l'incrémentes, et enfin tu mets à jour le compteur :
Tu as alors dans $id l'identifiant unique que tu souhaitais obtenir. Il te suffit de l'utiliser pour ton INSERT.
Pour info, la technique 1 n'est pas sure à 100% (toutefois, je l'ai déjà employé, je n'ai jamais eu de problème de génération de deux id identiques, la base était les données d'un webmail de 4 000 000 de comptes mails, la base pesant plus de 1To et se prenant plus de 1000 req/seconde), la technique 2 est sure, mais tu fais plus de requêtes SQL, et tu peux "locker" ton id si ton script plante. A toi de choisir.
Dans tous les cas, tu vas devoir gicler l'auto_increment et calculer ton id avant de faire ton INSERT.
Technique 1 : générer une clé unique
Pour cette solution, tu vas utiliser une clé primaire que tu vas générer au préalable.
Il te suffit en fait de générer une clé "unique". PHP fait la même pour générer des identifiants de session PHP.
Pour cela, tu peux par exemple utiliser la fonction uniqid. Voir te créer une fonction génératrice d'identifiant unique.
Tu obtiens alors ton identifiant à utiliser pour ton INSERT.
Technique 2 : utiliser une table SQL contenant le dernier id utilisé
Tu vas, par exemple, te créer une table 'generation_id' ou tu auras juste une seule ligne d'une seule colonne. Appelons ce champs de type numérique 'id'.
Le but du jeu, c'est de sélectionner la valeur de ce chiffre pour connaitre le dernier 'id' utilisé, l'augmenter de 1 et mettre à jour ce chiffre pour les utilisations futures.
Pour éviter le problème de concurrence d'accès à cet 'id', il faut faire un SELECT FOR UPDATE (je te conseille de lire la documentation MySQL à ce sujet).
Exemple de marche à suivre :
Tu vas lancer une première requete qui va vérouiller ton champs 'id' (aucune autre requete ne pourra accéder à ce champ tant que tu ne l'auras pas modifié) :
<?php
$sql = 'SELECT id FROM generation_id FOR UPDATE';
?>
Tu récupères la valeur dans une variable PHP genre $id, ensuite, dans ton PHP tu l'incrémentes, et enfin tu mets à jour le compteur :
<?php
$sql = 'UPDATE generation_id SET id = '".intval($id)."'';
?>
Tu as alors dans $id l'identifiant unique que tu souhaitais obtenir. Il te suffit de l'utiliser pour ton INSERT.
Pour info, la technique 1 n'est pas sure à 100% (toutefois, je l'ai déjà employé, je n'ai jamais eu de problème de génération de deux id identiques, la base était les données d'un webmail de 4 000 000 de comptes mails, la base pesant plus de 1To et se prenant plus de 1000 req/seconde), la technique 2 est sure, mais tu fais plus de requêtes SQL, et tu peux "locker" ton id si ton script plante. A toi de choisir.