Tabelle kopieren

Hallo zusammen,
ich bin neu in Postgres und habe folgendes Problem.
Ich möchte Daten aus einer Tabelle in eine andere kopieren. Ist die Zeile schon vorhanden, soll ein Update gemacht werden, um evtl. noch nicht vorhandene Werte einzutragen. Wenn nicht, soll ein Insert gemacht werden.
In MySQL war das sehr einfach:

INSERT INTO logdata_aktuell_backup_3 (kanaldaten_kid,zeit,S05,S10,S15,S20,S25,S30,S35,S40,S45,S50,S55,S00) SELECT kanaldaten_kid,zeit,S05,S10,S15,S20,S25,S30,S35,S40,S45,S50,S55,S00 FROM logdata_aktuell_backup_2 ON DUPLICATE KEY UPDATE kanaldaten_kid = VALUES(kanaldaten_kid), zeit = VALUES(zeit), S05 = VALUES(S05), S10 = VALUES(S10), S15 = VALUES(S15), S20 = VALUES(S20), S25 = VALUES(S25), S30 = VALUES(S30), S35 = VALUES(S35), S40 = VALUES(S40), S45 = VALUES(S45), S50 = VALUES(S50), S55 = VALUES(S55), S00 = VALUES(S00)

Postgres bietet diese schöne Möglichkeit ja nicht. Ich habe jetzt schon diverse Upsertversuche hinter mir. Leide ohne Erfolg.

Die Tabellen haben folgende Struktur:

[TABLE=“width: 500”]
[TR]
[TD]id[/TD]
[TD]kanaldaten_kid[/TD]
[TD]zeit[/TD]
[TD]S00[/TD]
[TD]s05[/TD]
[TD]s10[/TD]
[TD]s15[/TD]
[TD]s20[/TD]
[TD]s25[/TD]
[TD]s30[/TD]
[TD]s35[/TD]
[TD]s40[/TD]
[TD]s45[/TD]
[TD]s50[/TD]
[TD]s55[/TD]
[/TR]
[TR]
[TD]124[/TD]
[TD]42[/TD]
[TD]2012-07-06 06:00:00[/TD]
[TD]22.25[/TD]
[TD]22.72[/TD]
[TD]16.3[/TD]
[TD]27.80[/TD]
[TD]30.52[/TD]
[TD]36.87[/TD]
[TD]41.86[/TD]
[TD]50.17[/TD]
[TD]55.20[/TD]
[TD]59.28[/TD]
[TD]66.94[/TD]
[TD]22.25[/TD]
[/TR]
[TR]
[TD]148[/TD]
[TD]42[/TD]
[TD]2012-07-06 07:00:00[/TD]
[TD]20.42[/TD]
[TD]16.38[/TD]
[TD]11.17[/TD]
[TD]12.82[/TD]
[TD]17.12[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[/TABLE]

Hat jemand eine Idee, wie ich das lösen kann?
Ich möchte möglichst nicht jede Zeile einzeln selektieren und dann ein eine Update/Insert probieren.

Gruß
Jens



test=# select * from t1;
 id |  value
----+---------
  1 | das
  2 | geht
  3 | einfach
(3 rows)

test=*# select * from t2;
 id |    value
----+--------------
  3 | ganz einfach
  4 | in
  5 | 2
  6 | schritten
(4 rows)

test=*# update t1 set value = t2.value from t2 where t1.id=t2.id;
UPDATE 1
test=*# insert into t1 select id, value from t2 where id not in (select id from t1);
INSERT 0 3
test=*# select * from t1;
 id |    value
----+--------------
  1 | das
  2 | geht
  3 | ganz einfach
  4 | in
  5 | 2
  6 | schritten
(6 rows)

Andreas

Btw.: Du hast offenbar ein etwas unglückliches DB-Design. Offenbar in einer Zeile die volle Stunde und dann in einzelnen Spalten aller 5 Minuten eine extra Spalte?

Damit machst Du Dir z.B. eine Auswertung nach Durchschnitt oder andere Dinge unsinnig schwer.


Andreas

Da hat akretschmer Recht. Fass das alles in eine Spalte zusammen und füge einen passenden Schlüssel hinzu.

Hallo,

wir hatten vorher alles in einer Spalte. Allerdings ist dann der Index riesig groß (bis jetzt 420 Millionen Datensätze allein in diesem Jahr), da für jeden Floatwert Datum und und ID gespeichert wird, welche dann schon mehr Platz wegnehmen, als der Wert an sich.
Mit den zwölf Spalten konnten wir das ganze wieder handhabbar machen.
Gruß Jens

Dafür sind jetzt eure Anfragen nicht mehr handhabbar. Schlechter Ausweg.
Habt ihr mal über Partitionierung nachgedacht? Das wäre gleichzeitig ein Weg, eure Anfragen zu beschleunigen.