AW: [pgsql-de-allgemein] AW: [pgsql-de-allgemein] Mehrere Einträge anhand Primary-Key-Liste löschen

From: "Andreas Kretschmer - internet24 GmbH" <kretschmer(at)internet24(dot)de>
To: "'Mag(dot) Dr(dot) Stefan Krejci'" <office(at)skrejci(dot)com>, <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: AW: [pgsql-de-allgemein] AW: [pgsql-de-allgemein] Mehrere Einträge anhand Primary-Key-Liste löschen
Date: 2012-07-21 16:15:35
Message-ID: 004a01cd675c$0f5f2c00$2e1d8400$@internet24.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

> Aber zwei oder mehrere Tabellen lässt PostgreSQL beim DELETE-Befehl
> nicht zu. Und wenn ich die Leser-Tabelle weg mache (weil ja aus der
> LxAbo rausgelöscht werden soll), frisst mir der Parser die WHERE-Clause
> nicht mehr. Susanne, wie müsste der Befehl denn lauten? Bitte-danke!
>
>
>
> Danke, Andreas, übrigens für die vereinfachte Alters-Bestimmung ;-) CTEs
> weiß ich, was sind wCTE? Bei mir läuft aktuell Version 9.0.4 – das
> Update auf die aktuelle Version möchte ich bald machen, und wäre
> vermutlich ein weiteres Thema hier, wie ich das korrekt angehe…

Doch doch ... man kann in mehr als einer Tabelle gleichzeitig löschen:

test=*# create table foo1 (i int);
CREATE TABLE
test=*# create table foo2 (i int);
CREATE TABLE
test=*# create table foo3 (i int);
CREATE TABLE
test=*# insert into foo1 select * from generate_series(1,10);
INSERT 0 10
test=*# insert into foo2 select * from generate_series(1,10);
INSERT 0 10
test=*# insert into foo3 select * from generate_series(1,10);
INSERT 0 10
test=*# with x1 as (delete from foo1 where i < 5 returning i), x2 as (delete from foo2 where i > 5 returning i), x3 as (delete from foo3 where i = 5 returning i) select * from x1 union all select * from x2 union all select * from x3;
i
----
1
2
3
4
6
7
8
9
10
5
(10 rows)

So, was vermutest Du nun in den einzelnen Tabellen?

test=*# select * from foo1;
i
----
5
6
7
8
9
10
(6 rows)

test=*# select * from foo2;
i
---
1
2
3
4
5
(5 rows)

test=*# select * from foo3;
i
----
1
2
3
4
6
7
8
9
10
(9 rows)

Das writeableCTE bedeutet (ab 9.1), daß Du mit den Returning-Werten weiter arbeiten kannst, neues Beispiel:

test=*# create table foo1 (i int);
CREATE TABLE
test=*# create table foo2 (i int);
CREATE TABLE
test=*# insert into foo1 select * from generate_series(1,10);
INSERT 0 10
test=*# with x1 as (delete from foo1 where i < 5 returning i), x2 as (delete from foo1 where i > 7 returning i) insert into foo2 select * from x1;
INSERT 0 4
test=*# select * from foo2;
i
---
1
2
3
4
(4 rows)

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Susanne Ebrecht 2012-07-21 16:28:49 Re: [pgsql-de-allgemein] AW: [pgsql-de-allgemein] Mehrere Einträge anhand Primary-Key-Liste löschen
Previous Message Mag. Dr. Stefan Krejci 2012-07-21 15:31:47 AW: [pgsql-de-allgemein] Mehrere Einträge anhand Primary-Key-Liste löschen