Kopieren Sie die Tabellenstruktur in eine neue Tabelle

87

Gibt es eine Möglichkeit, die Struktur einer Tabelle ohne Daten, einschließlich aller Schlüssel und Einschränkungen, in eine neue Tabelle zu kopieren?

Alex S.
quelle

Antworten:

101

Verwenden Sie für eine einfache Schemakopie die like-Klausel.

CREATE TABLE new_table_name ( like old_table_name including all)
coderhs
quelle
12
Es ist erwähnenswert, dass Sie auch neue Spalten hinzufügen können, wenn Sie die gleiche Syntax verwenden:CREATE TABLE new (like old, extra_column text);
Brad Koch
@BradKoch Ist es möglich, dieser Anweisung zusätzliche Einschränkungen hinzuzufügen? Oder sollte es ein separater sein?
Andrey Deineko
@AndreyDeineko Es hängt davon ab, ob Sie die Dokumente zum Erstellen von Tabellen auf vollständige Details überprüfen . Sie können mit dieser Syntax wie bei jeder anderen create-Anweisung problemlos Prüf- und Fremdschlüsseleinschränkungen hinzufügen, aber ich bin nicht sicher, ob Einschränkungen auf Spaltenebene wie nicht null ohne eine nachfolgende Änderung angewendet werden können.
Brad Koch
2
Versuchte es gerade. Fremdschlüsseleinschränkungen und -auslöser wurden nicht kopiert (PostgreSQL 9.2).
Jānis Elmeris
73

Nun, das Beste, was Sie mit SQL erreichen können, ist:

create table new (
    like old
    including defaults
    including constraints
    including indexes
);

Aber es wird nicht alles kopiert. Die wichtigsten Dinge, die fehlen, sind AUSLÄNDISCHE SCHLÜSSEL. Auch - Trigger werden ebenfalls nicht kopiert. Ich bin mir bei anderen Dingen nicht sicher.

Eine andere Möglichkeit besteht darin, die Tabellenstruktur zu sichern, ihren Namen in dump zu ändern und sie erneut zu laden:

pg_dump -s -t old databases | sed 's/old/new/g' | psql

Beachten Sie jedoch, dass eine solche vereinfachte Bereinigung auch an anderen Stellen von alt zu neu geändert wird (wenn Sie beispielsweise in Ihrer Tabellenspalte den Namen "is_scolded" haben, wird sie zu "is_scnewed").

Die Frage ist wirklich eher: Warum brauchst du sie - weil ich für verschiedene Zwecke verschiedene Techniken verwenden würde.


quelle
Hinweis: including constraintsfunktioniert nicht unter PostgreSQL 8.3
Ragnar123
1
Arbeitete wie ein Zauber in Postgres 9.3 :)
Ganapathy
14
Beste Antwort. Beachten Sie jedoch, dass bei einem "seriellen" Wert oder einer anderen Spalte, die standardmäßig eine Sequenz enthält, dieselbe Sequenz wie in der alten Tabelle verwendet wird! Wenn Sie also Inhalte in eine der beiden Tabellen einfügen, wird diese für beide erhöht.
Sudo
18

Um eine Tabelle vollständig zu kopieren, kann auch die Kurzform mit dem Befehl TABLE verwendet werden:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;

Weitere Details hier

Dimo Boyadzhiev
quelle
Leider kopiert dies auch die Daten - soweit ich weiß, geht es bei der Frage darum, nur das Schema zu kopieren
Jasmine
🙁 IDs sind in der neuen Tabelle NULL und kopieren keine Standardwerte.
Ilhan
10

Schauen Sie sich pgAdmin an - bei weitem der einfachste Weg, das zu tun, was Sie wollen.
Klicken Sie mit der rechten Maustaste auf Tabelle, Skripte - Erstellen.

ChssPly76
quelle
Ich habe nur Zugriff auf phpPgAdmin; Ich besitze den Server nicht.
Alex S
Meinetwegen. In phpPgAdmin: Navigieren Sie zur Tabelle, klicken Sie auf Exportieren, wählen Sie "Nur Struktur" und Sie haben Ihr Skript
ChssPly76
Ich bin mir ziemlich sicher, dass dies ein Fehler in dieser Installation sein muss - es zeigt nur eine leere Seite im rechten Rahmen, wenn ich das mache: /
Alex S
1
Haben Sie beide Optionen "Anzeigen" oder "Herunterladen" ausprobiert? Wenn beide nicht funktionieren, ist dies möglicherweise ein Fehler. Wenn ja, müssen Sie dies über SQL tun. Schauen Sie sich den Link in Davs Antwort an.
ChssPly76
Download gibt mir nur eine leere Datei.
Alex S
6

Wie wäre es mit

CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)

postgresql.org Antwort

picmate 涅
quelle
3
Leider bleiben dabei keine Schlüssel, Einschränkungen oder Standardeinstellungen erhalten.
Sudo
1
Ein besserer Weg, um 'WHERE 1 = 2' auszudrücken, wäre 'WHERE false' oder gar keine WHERE-Klausel, sondern 'LIMIT 0'.
Kenyakorn Ketsombut