mehrere abfragen in einer query?

MySQL, PostgreSQL, SQLite
d3nation
Posts: 68
Joined: 2004-11-30 14:09

mehrere abfragen in einer query?

Post by d3nation » 2006-03-11 13:01

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

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: mehrere abfragen in einer query?

Post by Roger Wilco » 2006-03-11 13:16

d3nation wrote:wie kann ich das problem lösen ohne allzu komplizierte if schleifen machen zu müssen?
Du willst Transaktionen benutzen.

d3nation
Posts: 68
Joined: 2004-11-30 14:09

Re: mehrere abfragen in einer query?

Post by d3nation » 2006-03-11 13:47

yeah nice.

vielen dank!

lord_pinhead
Posts: 774
Joined: 2004-04-26 15:57

Re: mehrere abfragen in einer query?

Post by lord_pinhead » 2006-10-30 14:24

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:

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;
Der Befehl wird aber nicht angenommen. Wenn ich jetzt via

Code: Select all

START TRANSACTION;
insert ...
insert ..
insert. ..
COMMIT;
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

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: mehrere abfragen in einer query?

Post by Roger Wilco » 2006-10-30 15:15

Das INSERT-Statement kann sich nur auf eine Tabelle beziehen, nicht auf mehrere.

lord_pinhead
Posts: 774
Joined: 2004-04-26 15:57

Re: mehrere abfragen in einer query?

Post by lord_pinhead » 2006-10-30 19:36

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.

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: mehrere abfragen in einer query?

Post by Roger Wilco » 2006-10-30 19:40

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. ;)

lord_pinhead
Posts: 774
Joined: 2004-04-26 15:57

Re: mehrere abfragen in einer query?

Post by lord_pinhead » 2006-10-31 19:31

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.

User avatar
isotopp
Posts: 471
Joined: 2003-08-21 10:21
Location: Berlin

Re: mehrere abfragen in einer query?

Post by isotopp » 2006-11-01 11:40

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.
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).

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.

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: mehrere abfragen in einer query?

Post by Roger Wilco » 2006-11-01 12:43

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).
Das war auch nur ein kleiner Seitenhieb auf Lord_Pinheads Aussage, er wolle keine 36K INSERT-Statements ausführen.

Aber danke für die ausführliche Erklärung.

lord_pinhead
Posts: 774
Joined: 2004-04-26 15:57

Re: mehrere abfragen in einer query?

Post by lord_pinhead » 2006-11-01 14:48

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.