hmm: Postgresql: Delete mit parametern aus einem jon

Hi Leute,

ich möchte in meiner Postgres gerne Daten aus mehreren Tabellen löschen. Die Daten die ich löschen möchte bekomme ich per:

select * tab1 where key = key2;
select * tab2 where key = key3;
select * tab3 where key = key4;
select * tab4 where key = key5;
select * tab5 where key = key6;

etc.

key2 bis key6 bekomme ich durch einen join:

select key2, key3, key4, key5, key6 from tabA join tabB on x=y where ...;

Kann ich die Daten mit einem Loop oder etwas ähnlichem Löschen oder muss ich ein Mega delete Statement aufbauen?

  1. Hallo hmm,

    sehe deine Frage gerade wieder.

    Ich bin kein PostGres Experte, aber grundsätzlich ist es so, dass ein DELETE immer nur eine Tabelle bearbeiten kann. Das sollte auch in Postgres so sein.

    Du brauchst also auf jeden Fall 5 DELETE Anweisungen.

    Unter diesem Gesichtspunkt müsstest Du deinen SELECT überprüfen; du brauchst bspw. für den DELETE auf tab1 nur key2 und kannst den SELECT dafür möglicherweise kürzer fassen.

    Ein weiterer Hinweis: Ich kenne dein Datenmodell nicht und weiß nicht, wie deine Pseudo-Tablenamen tab1, tab2, tabA, tabB ... zu verstehen sind. Sind die 1,2,3 Tables und die A,B,C Tables unterschiedlich? Denn: in MySQL ist so, dass man ein Statement wie dieses

    DELETE FROM table1 WHERE id in (SELECT id from table1 where this=that)
    

    nicht ausführen kann - ich kann nicht da löschen, wo ich selektiere. Postgres dürfte das ähnlich halten. Das hier hingegen geht:

    DELETE FROM table1 WHERE id in (SELECT id from tableA where this=that)
    

    Zu deiner LOOP-Frage: Sowas ist möglich, nur nicht in SQL. Loop ist prozedural, SQL ist deklarativ. Aber Postgres hat PL/pgSQL, womit man Stored Procedures schreiben kann (und unterstützt laut Wikipedia noch eine Menge Sprachen mehr dafür). Damit ist es möglich, deine SELECT key2,key3,key4,key5,key6 Query mit einem Cursor zu öffnen, den Cursor abzuarbeiten und pro FETCH fünf DELETEs auf die Tabellen tab1 bis tab5 zu machen. Wie das genau aussieht, kann ich Dir nicht sagen, dazu musst Du das Handbuch und Postgres Beispiele studieren. Ich möchte dich aber bitten, da erstmal die Ergebnismenge zu überprüfen. Joins haben die Eigenschaft, Teilmengen eines kartesischen Produkts zu liefern, d.h. es kann durchaus vorkommen, dass Deine Ergebnismenge so aussieht:

    1,1,1,1,1
    1,1,1,1,2
    1,1,1,1,3
    1,1,1,2,1
    1,1,1,2,3
    1,1,2,1,4

    und so weiter, d.h. der Wert für die Keys wiederholt sich oft. Du würdest also sehr viele DELETEs redundant ausführen. Das macht nichts kaputt, kostet aber Zeit und bei umfangreichen Löschungen, die den Cache überfüllen, rubbelst Du dann unnötig auf der Platte rum. Es ist natürlich denkbar, dass deine Query nicht diese Eigenschaft hat, das kann ich nicht wissen. Ich wollte nur darauf hinweisen, dass diese Eigenschaft möglicherweise besteht.

    Rolf

    --
    sumpsi - posui - clusi