insert multiple rows
Ik kan het momenteel niet testen en ik heb al op internet gezocht naar een antwoord, maar ik kan het niet direct vinden. Wellicht weet iemand dit.
In PDO heb je een functie rowCount() waarmee je het aantal rijen kunt opvragen dat je ge-insert hebt. Nu vraag ik me het volgende af. Ik zou denken dat je per keer maar 1 rij kunt inserten en dat die rowCount dus altijd 1 teruggeeft. Is het ook mogelijk om meerdere rijen in 1x keer te inserten waardoor rowCount een hoger aantal teruggeeft? Zoals ik al zei kan ik het momenteel niet testen, maar wellicht weet iemand dit?
Maar nu vraag ik me dan toch af... wanneer en vooral waarom zou je op deze manier meerdere rijen invoegen? Misschien een vreemde vraag... maar in PDO kun je dus ook dit doen:
Code (php)
Dit lijkt mij (zo op het eerste gezicht) handiger. Dus ik ben heel benieuwd in welke situatie(s) en waarom je in de praktijk deze manier zou toepassen:
INSERT INTO tabel (c1, c2, c3)
VALUES (v1,v2,v3), (v4,v5,v6), (v7,v8,v9)
Reacties zijn welkom!
Gewijzigd op 27/03/2012 09:32:12 door Ozzie PHP
Ozzie, ik heb een script draaien dat van een aantal websites rss feeds ophaalt voor op mijn eigen site, deze haalt meestal wel 150-300 feeds binnen, deze zet ik dus om naar zo'n query: INSERT INTO tabel (c1, c2, c3) VALUES (v1,v2,v3), (v4,v5,v6), (v7,v8,v9), anders moet ik voor elke INSERT een aparte query doen.
Bij PDO kun je een query "preparen" waardoor je deze als het ware in het geheugen zet. De query kun je dan vervolgens "executen" met andere waardes. Dit LIJKT mij gemakkelijker... want in jouw voorbeeld, als je 150 tot 130 feeds moet inladen, dan neem ik aan dat je die in een array zet of iets dergelijks.... en dat je die array dan geautomatiseerd ombouwt naar een hele lange query?
INSERT INTO tabel (c1, c2, c3) VALUES (v1,v2,v3), (v4,v5,v6), (v7,v8,v9) ... (v125,v126,v127) , (v128,v129,v130)
Of begrijp ik het verkeerd?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?
/**
* @param req. array $feeds - array met feeds
* @param req. int $id - id van de bijbehorende website
*/
function insertFeed($feeds, $id){
$count = count($feeds) - 1;
$i = 0;
if(!empty($feeds)){
$query_feed = "INSERT INTO
feeds(
feed_name,
feed_url,
feed_description,
feed_publishdate,
feed_date,
website_id
)
VALUES
";
foreach ($feeds as $feed){
$query_feed .= "(
'".mysql_real_escape_string($feed['name'])."',
'".mysql_real_escape_string($feed['url'])."',
'".mysql_real_escape_string($feed['description'])."',
'".mysql_real_escape_string($feed['pubdate'])."',
now(),
'". $id ."'
)";
if($i < $count){
$i++;
$query_feed .= ', ';
}
}
mysql_query($query_feed);
}
}
?>
/**
* @param req. array $feeds - array met feeds
* @param req. int $id - id van de bijbehorende website
*/
function insertFeed($feeds, $id){
$count = count($feeds) - 1;
$i = 0;
if(!empty($feeds)){
$query_feed = "INSERT INTO
feeds(
feed_name,
feed_url,
feed_description,
feed_publishdate,
feed_date,
website_id
)
VALUES
";
foreach ($feeds as $feed){
$query_feed .= "(
'".mysql_real_escape_string($feed['name'])."',
'".mysql_real_escape_string($feed['url'])."',
'".mysql_real_escape_string($feed['description'])."',
'".mysql_real_escape_string($feed['pubdate'])."',
now(),
'". $id ."'
)";
if($i < $count){
$i++;
$query_feed .= ', ';
}
}
mysql_query($query_feed);
}
}
?>
Gewijzigd op 27/03/2012 09:58:11 door gerhard l
Want ook al prepare je de client-server roundups blijven bestaan.
Dus eigenlijk wordt de waarde van prepared statement door velen ruim overschat als je over performance spreekt.
...maar als het zoveel scheelt in tijd dan is het natuurlijk wel de moeite waard!
Ik heb het nu zelf even getest met 100.000 inserts. Daar doet ie 9.1834588050842 seconde over (teminste ik denk dat het 9 sec. is. Ik heb gebruik gemaakt van microtime(true) voor en na het uitvoeren van de query en daar kwam dit getal uit.)
Supersnel is het inderdaad niet... maar is het reëel dat je onder normale omstandigheden 100.000 queries insert? Dat lijkt me eigenlijk niet...
Gewijzigd op 27/03/2012 10:32:11 door Ozzie PHP
Dit gebeurt meestal in een soort van TEMP database die even de gegevens goed erin zetten via LOAD DATA INTO (http://dev.mysql.com/doc/refman/5.1/en/load-data.html)
en dan doe je gewoon
INSERT INTO products (waarde, waarde) VALUES (SELECT waarde, waarde FROM temp)
(even uit mijn hoofd) dan doe je het sneller... maar ik snap niet anders waarom je 100.000 rows in een soort van array wil afvuren..
Ik hou het voorlopig maar bij m'n prepared statements. Ze zijn er uiteindelijk toch voor gemaakt zou je zeggen.
Blijft de vraag wat je nu hebt aan een prepare (buiten security om) als je 1 query uitvoert.
Nou... de security dus... dat is volgens mij voldoende reden?
Wat ik mij afvraag is het volgende:
Ik kan met mysqlconnector.net parameters aan een sql command kopplen zonder een prepare te doen, is dit ook mogelijk met PDO en/of mysqli?
Dat is juist hoe PDO werkt en wat een van de speerpunten is, dus dat wiel ga je dan niet opnieuw uitvinden. Bovendien kun je een query "hergebruiken". De 1e keer wordt de query in het geheugen gezet, daarna kun je deze meerdere keren gebruiken met andere waarden:
$query = 'SELECT waarde FROM mijntabel WHERE id = :id';
$db->prepare($query);
$waarde1 = $db->execute(array('id' => 10));
$waarde2 = $db->execute(array('id' => 12));
$waarde3 = $db->execute(array('id' => 15));
enz.
In PDO heb je ook bindParam maar dat gebruik ik zelf niet.