Wie kopiere ich Daten in postgres mit dem Befehl copy von einer Tabelle in eine andere?

75

Wir verwenden den Befehl copy, um Daten einer Tabelle in eine Datei außerhalb der Datenbank zu kopieren.

Ist es möglich, Daten einer Tabelle mit einem Befehl in eine andere Tabelle zu kopieren?

Wenn ja, kann jemand bitte die Anfrage teilen.

Oder gibt es einen besseren Ansatz, wie wir pg_dump oder ähnliches verwenden können?

Mohitd23
quelle
4
Kein insert into other (col1, col2) select col1, col2 from one
Kopierbefehl erforderlich
3
Die Zeit für die Verwendung von Copy / Dump ist, wenn Daten zwischen nicht verbundenen Datenbanken verschoben werden (wobei Dateien als Zwischenzeit verwendet werden). Wenn sich die Tabellen in derselben Datenbank befinden, ist dies nicht erforderlich.
user2864740
Vielen Dank für Ihre Antwort, aber ich bin nur gespannt, ob es möglich ist, Daten mit dem Befehl copy von einer Tabelle in eine andere zu kopieren. Wenn ja das wie?
Mohitd23

Antworten:

167

Das ist nicht einfach, aber es ist auch nicht nötig.

CREATE TABLE mycopy AS
SELECT * FROM mytable;

oder

CREATE TABLE mycopy (LIKE mytable INCLUDING ALL);

INSERT INTO mycopy
SELECT * FROM mytable;

Wenn Sie nur einige Spalten auswählen oder neu anordnen müssen, können Sie dies tun:

INSERT INTO mycopy(colA, colB)
SELECT col1, col2 FROM mytable;

Sie können auch einen selektiven pg_dump durchführen und nur die Zieltabelle wiederherstellen.

Craig Ringer
quelle
2
Ich habe gerade doppelte Tabellen für eine App in einem anderen Schema erstellt, aber wenn ich den INSERT INTO mycopy SELECT * FROM mytableAnsatz versuche, den ich erhalte ERROR: column "order" is of type integer but expression is of type text LINE 2: SELECT * FROM django_apps.about_post Um klar zu sein, orderist eine Ganzzahl in beiden Tabellen.
RyanM
@ RyanM Neue Frage bitte und zeigen Sie die \dAusgabe von psqlin beiden Tabellen
Craig Ringer
2
@ RyanM Gleiche. Sie können dies vermeiden, indem Sie die Spaltennamen wie verwenden INSERT INTO mycopy (a, b) SELECT * FROM mytable, aber ich bin hierher gekommen, um zu versuchen, eine Alternative dazu zu finden. Meine Tabellen haben alle die gleichen Spalten, nur in einer anderen Reihenfolge. Es stellt sich heraus, dass es nicht möglich ist. stackoverflow.com/questions/1267427/…
Noumenon
Die zweite Option (EINSCHLIESSLICH ALLES) war perfekt für mich mit Postgres 11.2 und Alpine Linux 3.9
Mrroot5
5
Beachten Sie jedoch, dass die mit (INCLUDING ALL) erstellte Tabelle die Sequenzen mit der anderen Tabelle teilt
Victor Ivanov
4

Wenn die Spalten in beiden Tabellen identisch sind (Namen und Datentypen), können Sie Folgendes verwenden

INSERT INTO receivingtable (SELECT * FROM sourcetable WHERE column1='parameter' AND column2='anotherparameter');
Steve Irwin
quelle
3

Angenommen, es gibt bereits eine Tabelle, und Sie möchten alle Datensätze aus dieser Tabelle in eine andere Tabelle kopieren, die derzeit nicht in der Datenbank vorhanden ist. Die folgende Abfrage erledigt diese Aufgabe für Sie:

SELECT * into public."NewTable" FROM public."ExistingTable";
Manish Jain
quelle
1
Beachten Sie, dass die select ... intoSyntax zugunsten der Standardkonformität veraltet istcreate table ... as select ...
a_horse_with_no_name