Effectuer un INSERT associé à SELECT et UPDATE + auto_increm
Posté : 24 déc. 2006, 02:59
Bonjour,
Me revoilou...
Je vous explique le contexte :
- J'ai une table Mysql que je vais appeler SAUV_COMMANDE et une autre SAUV_LIGNE. Les numéros de commande sont numérotés de 1à n.
- J'ai 2 autres tables de la même structure que les précédentes que je vais appeler COMMANDE et LIGNE. Les numéros de commande sont numérotés de 1 à p.
- Sur mes tables (2 à 2) j'ai un DELETE ON CASCADE et UPDATE ON CASCADE...
ah oui, mes compétences SQL sont basiques ;o)
Je propose dans mon application une option "sauvegarder les commandes" avec le choix des commandes à sauvegarder.
Pour cela, j'ai un formulaire qui affiche tous les enregistrements de ma table COMMANDE (dans un tableau suite à une requete SELECT * FROM commande) et pour chaque enregistrement, j'ajoute une case à cocher qui récupére le num_commade, c'est-à-dire l'identifiant de la commande.
Jusque là, pas de pb...
L'utilisateur checke les commandes qu'il souhaite sauvegarder et demande la sauvegarde des commandes sélectionnées. En terme de traitement, voila ce que je fais :
- 1ere étape :
je récupère le dernier num_commande de la table SAUV_COMMANDE (je simplifie les controles afin de ne garder que l'essentiel).
$result = mysqli_query($_POST['link'], "SELECT MAX(num_commande) AS max_commande FROM sauv_commande"))
while ($row = mysqli_fetch_assoc($result))
{
return $row['no_commande'] ;
}
Une 1ere question => je n'ai pas trouvé 1 autre moyen que la boucle while pour lire le résultat alors qu'il n'y a qu'une ligne... avez-vous une autre solution plus optimale (même si celle-ci fonctionne bien) ?
- 2eme étape :
Je construits un tableau dynamique avec la liste des num_commande qui ont été sélectionnés et la nouvelle valeur = (max_commande + 1) en indice (ça, ça fonctionne aussi). Je récupère par la même occasion le nombre de commandes à traiter...
Je construits aussi (boucle for) une chaine $check avec la liste des num_commande à traiter pour les requetes SQL sous la forme : num_commande = $tab[0] OR num_commande = $tab[1] OR etc.
et une chaine $check2 dans le même esprit mais avec les nouvelles valeurs : max_commande + n.
- 3eme étape :
C'est là que je commence à bidouiller ;-(
L'idée est d'inserer dans SAUV_COMMANDE, les enregistrements chéckés de COMMANDE en leur affectant un num_commande qui va bien, c'est à dire pas celui qu'ils ont dans COMMANDE mais à la suite de celui récupéré à l'étape 1 (max de sauv_commande) pour une incrémentation suivie.
Voila la bidouille (même si ça fonctionne) que j'ai trouvé (ne criez pas ;o) :
$sql1 = "UPDATE commande SET num_commande = 1 + ".$max_commande." WHERE".$check;
$sql2 = "INSERT INTO sauv_commande SELECT * FROM commande WHERE".$check2;
$sql3 = "INSERT INTO sauv_ligne SELECT * FROM ligne WHERE".$check2;
puis enfin :
$sql4 = "DELETE FROM commande WHERE".$check2;
Algorithmiquement parlant ça fonctionne et mon traitement au final est OK, mais j'y vois plusieurs pb :
1. L'instruction UPDATE...
Idéalement, je devrais pouvoir faire un INSERT INTO sauv_commande avec directement le bon num_commande sans avoir à modifier la clé de ma table commande (on n'aime pas avoir à modifier les clés !).
Là je ne sais pas faire pour un INSERT associé à un UPDATE pour faire plusieurs insertions en 1 seule opération avec un SELECT => quelqu'un aurait-il une suggestion ?
Par ailleurs, j'ai bien pensé à faire un champ AUTO_INCREMENT pour mes tables commande et sauv_commande afin de ne pas avoir à gérer l'incrementation du num_commande et éviter le UPDATE. Mais ça génère une autre question : dans le INSERT, la valeur de num_commande devrait être à NULL non ? mais là aussi, dans le cas d'un INSERT multiple (associé à un SELECT), je ne sais pas comment ecrire cette instruction...
Pour résumer :
- Est-il possible de remplacer $sql1 et $sql2 (et après $sql3) en 1 unique requete qui ferait un INSERT INTO sauv_commande AVEC les enregistrements chéckés dans commande avec num_commande = max_commande + n ?
ou autre solution :
- Utiliser des champs AUTO_INCREMENT pour les num_commande et là comment écrire les requêtes $sql1 et $sql2 (et après $sql3) avec une valeur NULL pour la clé ?
Dernière question => laquelle de ces 2 solutions vous parait-elle la plus optimales, si non avez-vous une solution encore plus optimisée ?
Ouf c'est fini !!! En comtre partie, j'espère avoir été assez claire ;o))
Merci à tous ne serait-ce que pour avoir supporté ma prose jusqu'au bout ;o))
J'accepte bien évidemment toute critique sur ma methodo ;o))
@ bientôt[/php]
Me revoilou...
Je vous explique le contexte :
- J'ai une table Mysql que je vais appeler SAUV_COMMANDE et une autre SAUV_LIGNE. Les numéros de commande sont numérotés de 1à n.
- J'ai 2 autres tables de la même structure que les précédentes que je vais appeler COMMANDE et LIGNE. Les numéros de commande sont numérotés de 1 à p.
- Sur mes tables (2 à 2) j'ai un DELETE ON CASCADE et UPDATE ON CASCADE...
ah oui, mes compétences SQL sont basiques ;o)
Je propose dans mon application une option "sauvegarder les commandes" avec le choix des commandes à sauvegarder.
Pour cela, j'ai un formulaire qui affiche tous les enregistrements de ma table COMMANDE (dans un tableau suite à une requete SELECT * FROM commande) et pour chaque enregistrement, j'ajoute une case à cocher qui récupére le num_commade, c'est-à-dire l'identifiant de la commande.
Jusque là, pas de pb...
L'utilisateur checke les commandes qu'il souhaite sauvegarder et demande la sauvegarde des commandes sélectionnées. En terme de traitement, voila ce que je fais :
- 1ere étape :
je récupère le dernier num_commande de la table SAUV_COMMANDE (je simplifie les controles afin de ne garder que l'essentiel).
$result = mysqli_query($_POST['link'], "SELECT MAX(num_commande) AS max_commande FROM sauv_commande"))
while ($row = mysqli_fetch_assoc($result))
{
return $row['no_commande'] ;
}
Une 1ere question => je n'ai pas trouvé 1 autre moyen que la boucle while pour lire le résultat alors qu'il n'y a qu'une ligne... avez-vous une autre solution plus optimale (même si celle-ci fonctionne bien) ?
- 2eme étape :
Je construits un tableau dynamique avec la liste des num_commande qui ont été sélectionnés et la nouvelle valeur = (max_commande + 1) en indice (ça, ça fonctionne aussi). Je récupère par la même occasion le nombre de commandes à traiter...
Je construits aussi (boucle for) une chaine $check avec la liste des num_commande à traiter pour les requetes SQL sous la forme : num_commande = $tab[0] OR num_commande = $tab[1] OR etc.
et une chaine $check2 dans le même esprit mais avec les nouvelles valeurs : max_commande + n.
- 3eme étape :
C'est là que je commence à bidouiller ;-(
L'idée est d'inserer dans SAUV_COMMANDE, les enregistrements chéckés de COMMANDE en leur affectant un num_commande qui va bien, c'est à dire pas celui qu'ils ont dans COMMANDE mais à la suite de celui récupéré à l'étape 1 (max de sauv_commande) pour une incrémentation suivie.
Voila la bidouille (même si ça fonctionne) que j'ai trouvé (ne criez pas ;o) :
$sql1 = "UPDATE commande SET num_commande = 1 + ".$max_commande." WHERE".$check;
$sql2 = "INSERT INTO sauv_commande SELECT * FROM commande WHERE".$check2;
$sql3 = "INSERT INTO sauv_ligne SELECT * FROM ligne WHERE".$check2;
puis enfin :
$sql4 = "DELETE FROM commande WHERE".$check2;
Algorithmiquement parlant ça fonctionne et mon traitement au final est OK, mais j'y vois plusieurs pb :
1. L'instruction UPDATE...
Idéalement, je devrais pouvoir faire un INSERT INTO sauv_commande avec directement le bon num_commande sans avoir à modifier la clé de ma table commande (on n'aime pas avoir à modifier les clés !).
Là je ne sais pas faire pour un INSERT associé à un UPDATE pour faire plusieurs insertions en 1 seule opération avec un SELECT => quelqu'un aurait-il une suggestion ?
Par ailleurs, j'ai bien pensé à faire un champ AUTO_INCREMENT pour mes tables commande et sauv_commande afin de ne pas avoir à gérer l'incrementation du num_commande et éviter le UPDATE. Mais ça génère une autre question : dans le INSERT, la valeur de num_commande devrait être à NULL non ? mais là aussi, dans le cas d'un INSERT multiple (associé à un SELECT), je ne sais pas comment ecrire cette instruction...
Pour résumer :
- Est-il possible de remplacer $sql1 et $sql2 (et après $sql3) en 1 unique requete qui ferait un INSERT INTO sauv_commande AVEC les enregistrements chéckés dans commande avec num_commande = max_commande + n ?
ou autre solution :
- Utiliser des champs AUTO_INCREMENT pour les num_commande et là comment écrire les requêtes $sql1 et $sql2 (et après $sql3) avec une valeur NULL pour la clé ?
Dernière question => laquelle de ces 2 solutions vous parait-elle la plus optimales, si non avez-vous une solution encore plus optimisée ?
Ouf c'est fini !!! En comtre partie, j'espère avoir été assez claire ;o))
Merci à tous ne serait-ce que pour avoir supporté ma prose jusqu'au bout ;o))
J'accepte bien évidemment toute critique sur ma methodo ;o))
@ bientôt[/php]