Tabelle kopieren

Fragen und Probleme rund um die Abfragespache SQL.

Tabelle kopieren

Beitragvon MrQ » Fr 6. Jul 2012, 16:38

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:
Code: Alles auswählen
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
MrQ
Neuer Benutzer
 
Beiträge: 2
Registriert: Fr 6. Jul 2012, 16:24

Beitragvon akretschmer » Fr 6. Jul 2012, 16:46

MrQ hat geschrieben: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.


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


Code: Alles auswählen
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
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5938
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon akretschmer » Fr 6. Jul 2012, 17:03

MrQ hat geschrieben:Die Tabellen haben folgende Struktur:


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
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5938
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon ads » So 8. Jul 2012, 11:50

Da hat akretschmer Recht. Fass das alles in eine Spalte zusammen und füge einen passenden Schlüssel hinzu.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD

Beitragvon MrQ » Mo 9. Jul 2012, 10:36

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
MrQ
Neuer Benutzer
 
Beiträge: 2
Registriert: Fr 6. Jul 2012, 16:24

Beitragvon ads » Mo 9. Jul 2012, 10:41

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.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD


Zurück zu SQL

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste