mehrere abfragen in einer query?
mehrere abfragen in einer query?
Hi leute!
ich stehe mal wieder vor einem problem und suche hilfe:
ich habe mehere sql-befehle.
z.b.
du hast 3 SQL befehle
UPDATE xxx SET a = b;
UPDATE yyy SET c = d;
INSERT INTO zzz(id, name, nochwas) VALUES (10, "blabla", "blablabla");
jetzt ergibt allerdings der 3te keinen sinn in meiner datenbank ohne den ersten. sprich die befehle sind voneinander abhängig.
wenn jetzt sql befehl 1 und 2 geht - der 3te aber gott-weiß-warum einen fehler hat - bricht das script ab (or die(mysql_error())). die ersten beiden befehle müssten rückgängig gemacht werden aber geht ja nicht mehr weil das script abbricht.
wie kann ich das problem lösen ohne allzu komplizierte if schleifen machen zu müssen?
ich dachte an mehere sql-befehle in einem query, welches ich einfach abbrechen kann. ist sowas möglich? oder andere ideen?
danke schonmal - grüße
ich stehe mal wieder vor einem problem und suche hilfe:
ich habe mehere sql-befehle.
z.b.
du hast 3 SQL befehle
UPDATE xxx SET a = b;
UPDATE yyy SET c = d;
INSERT INTO zzz(id, name, nochwas) VALUES (10, "blabla", "blablabla");
jetzt ergibt allerdings der 3te keinen sinn in meiner datenbank ohne den ersten. sprich die befehle sind voneinander abhängig.
wenn jetzt sql befehl 1 und 2 geht - der 3te aber gott-weiß-warum einen fehler hat - bricht das script ab (or die(mysql_error())). die ersten beiden befehle müssten rückgängig gemacht werden aber geht ja nicht mehr weil das script abbricht.
wie kann ich das problem lösen ohne allzu komplizierte if schleifen machen zu müssen?
ich dachte an mehere sql-befehle in einem query, welches ich einfach abbrechen kann. ist sowas möglich? oder andere ideen?
danke schonmal - grüße
-
- Posts: 5923
- Joined: 2004-05-23 12:53
Re: mehrere abfragen in einer query?
Du willst Transaktionen benutzen.d3nation wrote:wie kann ich das problem lösen ohne allzu komplizierte if schleifen machen zu müssen?
Re: mehrere abfragen in einer query?
yeah nice.
vielen dank!
vielen dank!
-
- Posts: 774
- Joined: 2004-04-26 15:57
Re: mehrere abfragen in einer query?
Ok, den Thread muss ich nochmal aufmachen. Ich hab aktuell ein verständnissproblem, und zwar soll ich für ein Freund ein Script bauen das eine Textdatei parsed und dann in die jeweiligen Tabellen einfügt. Soweit, so gut, funktioniert eigentlich alles. Allerdings wollte ich den insert Befehl etwas eleganter machen, bzw. aus 3 Befehlen ein einzigen erstellen. Laut meinem Buch und einigen Ressourcen im Netz dürfte folgender Befehl doch richtig sein:
Der Befehl wird aber nicht angenommen. Wenn ich jetzt via
das ganze abschicke funktioniert es. Gibt es nicht die möglichkeit ohne transaction das ganze zu erledigen und einfach nur die Tabellen zu locken. Wenn ich jetzt einzeln die Inserts mit den jeweiligen lock tables absetze, funktioniert es ebenfalls. Also irgendwas passt an meinem Insert Befehl nicht und ich steh auf der Leitung. Vielleicht kann mir ja jemand ein Denkanstoß geben.
MFG
Lord Pinhead
Code: Select all
LOCK TABLES goh_products WRITE, goh_products_description WRITE, goh_products_to_categories WRITE;
INSERT INTO `goh_products`(`products_model`,`products_price`,`products_date_added`,`products_tax_class_id`)
VALUES('557','29.224137931034',NOW(),'1')
INTO `goh_products_description`(`products_id`,`products_name`,`products_description`) VALUES ('557','test','BOXCD')
INTO `goh_products_to_categories`(`products_id`,`categories_id`) VALUES ('557','4');
UNLOCK TABLES;
Code: Select all
START TRANSACTION;
insert ...
insert ..
insert. ..
COMMIT;
MFG
Lord Pinhead
-
- Posts: 5923
- Joined: 2004-05-23 12:53
Re: mehrere abfragen in einer query?
Das INSERT-Statement kann sich nur auf eine Tabelle beziehen, nicht auf mehrere.
-
- Posts: 774
- Joined: 2004-04-26 15:57
Re: mehrere abfragen in einer query?
Bleibt also wirklich nichts anderes übrig als mit transaction zu arbeiten und mehrere Einträge zugleich abzuschicken bei jedem Insert. Sind ja nur 12 000 Einträge, also 36 000 Insertanweisungen. Find das nur nicht wirklich elegant, und mit einer Temorären Tabelle wollte ich auch nicht wirklich arbeiten.
-
- Posts: 5923
- Joined: 2004-05-23 12:53
Re: mehrere abfragen in einer query?
Wenn du drauf stehst, kannst du auch mehrere Tupel in die gleiche Tabelle einfügen. Wären dann noch 3 INSERT-Statements. Außerdem glaube ich, dass du den Sinn der Transaktion noch nicht so ganz durchblickt hast. ;)
-
- Posts: 774
- Joined: 2004-04-26 15:57
Re: mehrere abfragen in einer query?
Eine Transaction ist dazu da, das eine Gruppe von Statements entweder komplett ausgeführt werden, oder bei einem Fehler komplett nicht ausgeführt werden. Was ist daran schwer zu verstehen ;) Und ja, ich werd mehrere Tupel zugleich einfügen, aber wenn eine Eintrag ein Fehler hat, werden gar keine Einträge gemacht. Also entweder viele Abfragen, oder die Gefahr das einzelne Einträge von Hand einfügen muss.
Re: mehrere abfragen in einer query?
Das ist nicht der Sinn einer Transaktion. Eine Transaktion soll Statements logisch gruppieren - alle Statements einer Transaktion werden entweder zusammen ausgeführt oder eben nicht. Das ist in Deinem Beispiel nicht so wirklich der Fall (die logische Gruppierung).Roger Wilco wrote:Wenn du drauf stehst, kannst du auch mehrere Tupel in die gleiche Tabelle einfügen. Wären dann noch 3 INSERT-Statements.
Transaktionen mit wenigen Statements.sind nicht effizient, da hast Du Recht - ein COMMIT kommt erst zurück, wenn die Daten auf der Platte geschrieben worden sind. Die Sequenz insert, commit, insert, commit, ... ist also relativ langsam. Daher faßt man manchmal mehrere Statements zu einer Transaktion zusammen auch wenn sie nicht wirklich logisch eine Transaktion sind, sondern mehrere. Bis zu 100 Insert-Statements/Transaktion wird das sehr schnell schneller. Bis etwa 1000 Inserts/Transaktion wird das noch schneller.
Danach wird das Risiko aber sehr groß, weil das Undo-Log der Datenbank sehr groß wird. Crashed die Servermaschine oder der Serverprozeß genau zu diesem Zeitpunkt, muß nicht nur die Redo-Phase der Recovery ausgeführt werden (ca. 1GB/h Recovery), sondern auch die Undo-Phase. Diese ist jedoch sehr viel langsamer als die Redo-Phase.
Es ist daher wünschenswert, Transaktionen nicht zu groß werden zu lassen.
-
- Posts: 5923
- Joined: 2004-05-23 12:53
Re: mehrere abfragen in einer query?
Das war auch nur ein kleiner Seitenhieb auf Lord_Pinheads Aussage, er wolle keine 36K INSERT-Statements ausführen.isotopp wrote:Das ist nicht der Sinn einer Transaktion. Eine Transaktion soll Statements logisch gruppieren - alle Statements einer Transaktion werden entweder zusammen ausgeführt oder eben nicht. Das ist in Deinem Beispiel nicht so wirklich der Fall (die logische Gruppierung).
Aber danke für die ausführliche Erklärung.
-
- Posts: 774
- Joined: 2004-04-26 15:57
Re: mehrere abfragen in einer query?
Also nachdem ich ein bischen rumgespielt habe, werd ich das ganze nicht mit Transactionen machen, sondern einfach mehrere Einträge zugleich machen. Es bringt auf der einen Seite nichts wenn ich nur ein paar Inserts abschicke (30) und die Gefahr das dann Einträge fehlen ist mir doch zu groß. Bleib ich lieber beim Tabellen locken und 5 Einträge pro Insert abschicken, das läuft wenigstens.
Ps.: Ich weiß selbst das transaction nicht gerade zu geeignet ist masseninserts zu machen, es sollte eigentlich dazu dienen das Konsistente Daten vorhanden sind wenn man z.b. Kontoverschiebungen hat.
Ps.: Ich weiß selbst das transaction nicht gerade zu geeignet ist masseninserts zu machen, es sollte eigentlich dazu dienen das Konsistente Daten vorhanden sind wenn man z.b. Kontoverschiebungen hat.