Mittwoch, August 28, 2013

Postgres: Löschungen in CTEs

Bei der Lektüre der postgres-Dokumentation sind mir eine ganze Reihe interessanter Optionen begegnet, aber besonder gut gefällt mir Folgendes: die Möglichkeit, ein DELETE in einer CTE zu definieren und die Löschungen in der Hauptquery weiter zu verarbeiten:

postgres=# create table t1 as select * from generate_series(1, 10) id;
SELECT 10

postgres=# select * from t1;
 id
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 Zeilen)

postgres=# create table t2 as select * from t1 where 1 = 0;
SELECT 0

postgres=# select * from t2;
 id
----
(0 Zeilen)

postgres=# with moved_rows as (delete from t1 where id <= 5 returning *)
postgres-# insert into t2 select * from moved_rows;
INSERT 0 5

postgres=# select * from t1;
 id
----
  6
  7
  8
  9
 10
(5 Zeilen)

postgres=# select * from t2;
 id
----
  1
  2
  3
  4
  5
(5 Zeilen)

Damit könnten Archivierungs-Operationen sehr elegant werden.

2 Kommentare:

  1. Hi Thomas,

    nett, dass Du vorbeischaust.

    Mir war zwar schon vorher klar, dass postgres ein grundsolides RDBMS ist, aber den Umfang der Features hatte ich nicht komplett vor Augen: einen extrem umfangreichen SQL-Dialekt, Unmengen von Datentypen, zahlreiche Index-Varianten. Dazu plugins bis zum Abwinken. Und das alles umsonst und kostenlos. Nicht schlecht ...

    AntwortenLöschen