Mehrere Tabellen zusammenfügen

Hallo,

ich habe hier 3 Datenbanken mit exakt der gleichen Tabellenstruktur. Was muss ich machen, damit ich die Tabellen möglichst einfach und schnell zusammenfügen kann?
Die einzelnen Datensätze unterscheiden sich durch das Datum und die Uhrzeit, sind also auch datenbankübergreifend eindeutig.

Viele Grüße,
Arnold

Hm, in SQL-Dumpen und dann einfach einfügen? Also ohne die Create-Tables sondern nur die INSERTs.

cu tb

btw: Es handelt sich aber nicht um so komische Wetterstationsdaten :wink:

Einfach einfügen hört sich leicht an, ist es aber nicht.
Habe jetz probeweise eine Tabelle der ersten DB ins SQL-Format exportiert, um sie dann in der zweiten einzufügen.
Das funktioniert aber nicht so, wie ich mir das vorgestellt hab.


So schaut dir Grundsyntax aus wenn ich was einfügen möchte:

INSERT INTO inside_temp(
            savetime, weatherdata, newflag)
    VALUES (?, ?, ?);

Was muss ich in das Abfragefenster dann alles eingeben, wenn meine sql-Datei so ausschaut:

--
-- PostgreSQL database dump
--

-- Started on 2007-12-30 14:11:25

SET client_encoding = 'SQL_ASCII';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;

SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- TOC entry 1298 (class 1259 OID 16434)
-- Dependencies: 4
-- Name: inside_temp; Type: TABLE; Schema: public; Owner: postgres; Tablespace: 
--

CREATE TABLE inside_temp (
    savetime timestamp(0) with time zone NOT NULL,
    weatherdata real,
    newflag boolean
);


ALTER TABLE public.inside_temp OWNER TO postgres;

--
-- TOC entry 1651 (class 0 OID 16434)
-- Dependencies: 1298
-- Data for Name: inside_temp; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY inside_temp (savetime, weatherdata, newflag) FROM stdin;
2007-05-05 06:44:00+02    20.799999    t
...
...
...
2006-01-13 03:42:00+01    17.700001    t
\.


--
-- TOC entry 1650 (class 2606 OID 16437)
-- Dependencies: 1298 1298
-- Name: inside_temp_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: 
--

ALTER TABLE ONLY inside_temp
    ADD CONSTRAINT inside_temp_pkey PRIMARY KEY (savetime);


--
-- TOC entry 1648 (class 1259 OID 16438)
-- Dependencies: 1298
-- Name: index_savetime_inside_temp; Type: INDEX; Schema: public; Owner: postgres; Tablespace: 
--

CREATE INDEX index_savetime_inside_temp ON inside_temp USING btree (savetime);


-- Completed on 2007-12-30 14:11:27

--
-- PostgreSQL database dump complete
--

Naja der COPY-Block schaut doch ganz gut aus oder meinst du nicht? Versuch doch einfach mal den ganzen Block zu verwenden ohne das in INSERTs umzuschreiben. :wink:

cu tb

Hab ich zuerst auch gedacht.
Aber da kommt er nur bis zur ersten Jahreszahl:

ERROR: syntax error at or near "2007"
SQL Status:42601
Zeichen:63

Trotzdem dankeschön.

Ist es vielleicht hilfreicher wenn ich die Datei mal online stell?

Hallo Arnold,

typischerweise entstehen 2 Probleme beim Mergen.

  • Es wird aus dem Dump heraus wieder eine eigene Indexdatei angelegt
  • Der Zähler des Indexes wird auf den Letzten Eintrag gesetzt.

Ich mache in solchen Fällen einen reinen Datendump, in dem zwar auch noch die Daten für die Indizes vorhanden sind. Diese lassen sich aber mit einem Editor leicht entfernen.

Mit “pg_dump -DT tabellenname datenbank” bekommst Du nur die Daten im “klassischen” SQL-Stil der angegebenen Tabelle.
In einem Editor Deiner Wahl entfernst Du nun

  • Alle Zeilen, die nicht mit “Insert into” beginnen.
  • Evtl in den Tabellen die Spalte “id”, sowohl im ersten Teil des Insert-Befehls, als auch im “value”-Teil. Dies geht oft mit einem Search/Replace-Befehl.

Jetzt kannst Du die Dateien zusammenfassen oder einzeln in die neue Datenbank einspielen - es muss allerdings eine Datenbank mit einer entsprechenden Tabelle vorliegen.

Gruß
Rolf