plusieurs INSERT voire meme des milliers

plusieurs INSERT voire meme des milliers - SQL/NoSQL - Programmation

Marsh Posté le 11-04-2008 à 18:30:32    

Bonjour tout le monde,
 
Je suis entrain de faire un outil de mailing et je bloque sur un ptit truc que j'arrive pas a surmonter...!!! votre conseil est vrmt le bienvenu :)
 
avt d'envoyer un mail, je fais une recherche pour selectionner les destinataires, et c'est la ou le probleme ce pose, ces destinataire je les stock ds une table qui contient 2 champs (id_mailing, id_destinataire) :
 
$sel = mysql_query("SELECT id FROM annuaire WHERE ma_condition" );
while($res = mysql_fetch_array($sel))
{
   $ins = mysql_query("INSERT INTO ma_table (id_mailing, id_destinataire) VALUES ('$id_mailing', '$res[id]')" );
}
 
lorsque j'ai une 20en ou 50ene de destinataires ca va, mais dès lors que ca depasse 100, ca commence a mettre du temps et ca bloque carrement au dessus de 900 ou 1000 destinataires :(
 
devrais je stocker les destinataires ds un champ separes par un separateur???
 
que me conseillez vous faire?
 
j'ai egelement teste $ins = mysql_query("INSERT INTO ma_table (champ1, champ2) VALUES ('val1', 'val2'), ('val1', 'val2'), ('val1', 'val2')" );
 
mais ca bloque quand j'ai beaucoup de destinataires... :(

Reply

Marsh Posté le 11-04-2008 à 18:30:32   

Reply

Marsh Posté le 11-04-2008 à 21:07:52    

Code :
  1. mysql_query("insert into ma_table(id_mailing, id_destinataire) values select $id_mailing, id from annuaire where ma_condition" );


 
une requête. rapide.
 
:spamafote:


Message édité par MagicBuzz le 11-04-2008 à 21:08:20
Reply

Marsh Posté le 14-04-2008 à 12:29:16    

Ah c genial, merci bp MagicBuzz,
c'est vrai c'est trop rapide :)
juste une petite correction, ca pourrait t'etre utile, la syntaxe est :

Code :
  1. insert into ma_table(id_mailing, id_destinataire) select id_mailing, id from annuaire where ma_condition


 
sans 'values' :)
 
@+


Message édité par redah75 le 14-04-2008 à 12:30:06
Reply

Marsh Posté le 14-04-2008 à 12:44:55    

Ayeye, une toute petite subtilite :(
dans mon exemple id_mailing est une valeur fixe, comment pourrais je executer cette requete?
 
une derniere question, est il possible d'inserer un enregistrement dans 2 tables en une seule requete ???
 
Merci infiniment

Reply

Marsh Posté le 14-04-2008 à 23:17:38    

ben avec la syntaxe que j'ai utilisé mais sans la value effectivement. $id_mailing pour que php mette en dur ta valeur lors de l'exécution de la requête. t'as tout à fait le droit de sélectionner des constantes en SQL.

Reply

Marsh Posté le 15-04-2008 à 10:56:31    

ah oauisssss, c'est parfait, je pensais que le '$' etait une erreur de ta part comme pour 'value' :)
 
et a ton avis c'est possible de fait un INSERT dans 2 tables en une seukle requete????
 
merci mille fois, tu me sauves :)

Reply

Marsh Posté le 16-04-2008 à 18:47:39    

non, c'est impossible.
 
enfin... dans une certaine mesure...
 
si tes deux tables sont par exemple liées par une FK, tu peux par exemple écrire une vue qui ramène les lignes des deux tables selon la FK.
 
selon ton SGBD, tu pourras directement modifier les données dans la vue, et ajouter un trigger sur la vue afin de gérer l'insertion : t'insère dans la vue, et le trigger s'occupe d'inserrer dans chacune des deux tables.
 
exemple ici sous SQL Server 2005 :
http://forum.hardware.fr/hfr/Progr [...] m#t1447148

Reply

Marsh Posté le 17-04-2008 à 11:15:55    

OK, bonne documentation :)
 
Merci bp pour tou :)
@+

Reply

Marsh Posté le 13-05-2008 à 18:03:57    

Bonjour, me revoila encore pour une autre petite question :)
 
j'explique mon probleme :
je viens de finir l'ppli mailing que j'ai developpe, et il me reste juste a afficher une page qui affiche les message envoyes (elements envoyes sur outlook).
lorsqu'un mail est envoyer, je stoque l'identifiant des destinataires dans un champs TEXT separe par ~ : 100102~100135~101785.... je fait cela pour ne pas charger la base au bout de qlq temps.
 
1ere question, es tu favorable pour cette solution??
 
ma 2eme question:
afin d'afficher les elements envoye, je dois selectionner les destinataires et les inserer ds une autre table.
 
y a t il une requete simple pour faire ceci, une requete du genre INSERT SELECT ... mais le SELECT ici dois me separer les identifiants :(
 
merci bien

Reply

Marsh Posté le 14-05-2008 à 19:21:35    

1/ Je n'aime pas ce genre de solution, car c'est de la dénormalisation, donc à éviter. Ensuite, pour des raisons de performances, et éventuellement parceque ça ne sert jamais, il peut être préférable de dénormaliser cependant.
 
2/ Crée une fonction "split" qui retournera une "table" à partir de ton champ text. Tu trouveras sur google, mais aussi sur ce forum, des exemple d'une telle fonction. Je me demande si sous MySQL elle n'existe pas d'ailleurs nativement...

Reply

Marsh Posté le 14-05-2008 à 19:21:35   

Reply

Marsh Posté le 15-05-2008 à 10:37:58    

Bonjour MagicBuzz et merci pour ta reponse!
 
j'ai finalement opter pour la solution normalisé, je mettrai ulterierement une possibilite d'archivage...
 
il parait qu'une table mysql peut supporter qlq millions d'enregistrement, est ce correcte? et quelles sont les consequences si une table sature? ca influence toute la base???

Reply

Marsh Posté le 15-05-2008 à 20:57:14    

oui, mysql supporte sans problème des millions de lignes dans une table
 
pour saturer une table mysql, il faut en vouloir (à quelques milliards tu commences juste à te dire que ton PC à la maison est un peu juste)
 
ensuite, t'as des tas de façon de pallier à des problèmes de saturation : partion des tables par exemple

Reply

Marsh Posté le 16-05-2008 à 10:41:37    

OK, ca me laisse alors le temps de bien respirer... :)
 
Merci pour tout MagicBuzz
@+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed