Signaler

For dans SQL

Posez votre question pazdu63 7Messages postés jeudi 15 juin 2017Date d'inscription 22 juin 2017 Dernière intervention - Dernière réponse le 23 juin 2017 à 20:41 par yg_be
Bonjour à tous et à toutes,

Je voudrais savoir si c'est possible de faire une boucle for dans une requête SQL exemple: je veux créer 10 commandes dans ma table commandes en utilisant une boucle for pour pas perdre de temps en faisans ligne par ligne avec un insert into quelqu'un serait-il comment faire svp?

merci de vos réponse :)
Utile
+0
plus moins
Bonjour,

Pour 10 lignes de SQL, il vaut mieux ne pas s'embêter et boucler sur la requête pour faire 10 INSERT INTO grâce à un foreach.
Mais pour 5000 lignes par exemple, le fait de faire un seul INSERT INTO avec 5000 VALUES au lieu de 5000 INSERT INTO, est un vrai gain de performance.

Le principe va être d'écrire la requête en PHP, en concaténant les valeurs de la requête SQL.

// On "déclare" le Insert Into sans préciser ses VALUES
$sql_insert = "INSERT INTO `matable` (`id_table`,`col1`, `col2`) VALUES ";
// Pour vérifier si on est sur le dernier élément du tableau
$lastKey = array_pop(array_keys($a_elements)); 	

// On boucle sur le tableau PHP qui renvoit les valeurs
foreach($a_elements as $key=>$elements)
{
	$sql_insert.="("; // Ajout de la parenthèse de debut
	foreach($elements as $key2=>$line)
	{
		if($key2===0){
			$sql_insert.="NULL"; // ID en auto-increment déclaré à NULL pour prendre une valeur automatique
		}
		$sql_insert.=",'".$line."'"; // on remplit toutes les valeurs
	}

	$sql_insert.=")"; // Ajout de la parenthèse de fin
     // On ajoute une virgule si ce n'est pas le dernier element
	if ($key !== $lastKey) {
	    $sql_insert.=",";
	}
}


Et ainsi on obtient un
$sql_insert = "INSERT INTO `matable` (`id_table`,`col1`, `col2`) VALUES ('0','ligne1_col1','ligne1_col2'),
('1','ligne2_col1','ligne2_col2')";


Voici ma méthode, mais je ne suis pas contre un peu de simplification si quelqu'un à une idée :).
Donnez votre avis
Utile
+0
plus moins
Merci de m'avoir répondu :)

Enfaite je travail sur MySQL et j'ai essayé des commandes et cela me dit toujours la même erreur "Syntax error" je n'arrive pas à comprendre pourquoi
jordane45 18393Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 10 octobre 2017 Dernière intervention - 19 juin 2017 à 12:39
Bonjour,

Tu as testé quoi exactement ?
Quel est le message d'erreur exact et complet ?
Dans quel environnement travailles tu ? Via du code PHP comme le propose Yuh ... ou -
bien directement via l'interface de phpmyadmin ??


Et sinon.. pour répondre à ta question.... connais tu les procédure stockées ?
Car dans une simple requête NON tu ne peux pas faire de boucle... mais via une procédure stockée.. là oui tu peux.
Répondre
Donnez votre avis
Utile
+0
plus moins
J'ai tester ca :
For llx_societe in llx_commande DO
Insert into llx_commande_fournisseur(ref) Values(1)

message d'erreur :
Erreur dans la requête (1064): Syntax error near 'For llx_societe in llx_commande DO Insert into llx_commande_fournisseur(ref) Va' at line 1

Je travaille sur MySQL donc directement via l'interface de phpmyadmin

et non je ne connais pas trop cela je suis un peu débutant sur mySQL
Donnez votre avis
Utile
+0
plus moins
C'est bon j'ai réussi à faire une boucle mais cela me met une autre erreur que je ne comprends pas voici mon code :
DROP PROCEDURE IF EXISTS jeSuisTest;
DELIMITER |
create procedure jeSuisTest()
BEGIN
DECLARE i INT DEFAULT 0;
je_Suis_Test:loop
INSERT INTO llx_commande_fournisseur(ref) VALUES (10);
SET i := i + 1;
if i=10 then
LEAVE je_Suis_Test;
end if;
end loop je_Suis_Test;
end|

call jeSuisTest()

et voici mon erreur :
Erreur dans la requête (1452): Cannot add or update a child row: a foreign key constraint fails (`mdl_doli`.`llx_commande_fournisseur`, CONSTRAINT `fk_commande_fournisseur_fk_soc` FOREIGN KEY (`fk_soc`) REFERENCES `llx_societe` (`rowid`))

quelqu'un peut m'aider svp?
Donnez votre avis
Utile
+0
plus moins
j'ai pu encore avancer et voici mon code : DROP PROCEDURE IF EXISTS jeSuisTest;
DELIMITER |
create procedure jeSuisTest()
BEGIN
DECLARE i INT DEFAULT 0;
je_Suis_Test:loop
INSERT INTO llx_commandedet(fk_commande,fk_product,qty,subprice,total_ht,multicurrency_total_ht) VALUES (1114,9940,1,2,(subprice*qty),(Select llx_commande.total_ht from llx_commande,llx_commandedet where llx_commandedet.fk_commande=llx_commande.rowid and llx_commande.rowid=1110 and llx_commande.total_ht=(subprice*qty))) ;
SET i := i + 1;
INSERT INTO llx_commandedet(fk_commande,fk_product,qty,subprice,total_ht) VALUES (1115,9941,2,2,(subprice*qty));
INSERT INTO llx_commandedet(fk_commande,fk_product,qty,subprice,total_ht) VALUES (1116,9942,3,2,(subprice*qty));
INSERT INTO llx_commandedet(fk_commande,fk_product,qty,subprice,total_ht) VALUES (1117,9943,4,2,(subprice*qty));
if i=1 then
LEAVE je_Suis_Test;
end if;
end loop je_Suis_Test;
end|

call jeSuisTest();

et j'ai encore une autre erreur que voici : Erreur dans la requête (1093): Table 'llx_commandedet' is specified twice, both as a target for 'INSERT' and as a separate source for data

quelqu'un pourrai-t-il m'aider s'il vous plait? :)
Donnez votre avis
Utile
+0
plus moins
l'erreur est dans la requete ci-dessous:
INSERT INTO llx_commandedet (fk_commande,fk_product,qty,subprice,total_ht,multicurrency_total_ht) VALUES (1114,9940,1,2,(subprice*qty),
(
Select llx_commande.total_ht from llx_commande,llx_commandedet where llx_commandedet.fk_commande=llx_commande.rowid and llx_commande.rowid=1110 and llx_commande.total_ht=(subprice*qty)
)
) ; 

comme tu peux le voir, tu insères dans la table llx_commandedet, et tu utilises cette même table dans le select, comme source de données. et le message t'informe que ce n'est pas autorisé.
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !