Neues PostgreSQL (seit 8.3 laut Dokumentation) kann "INCLUDING INDEXES" verwenden:
# select version();
version
-------------------------------------------------------------------------------------------------
PostgreSQL 8.3.7 on x86_64-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
(1 row)
Wie Sie sehen, teste ich auf 8.3.
Jetzt erstellen wir eine Tabelle:
# create table x1 (id serial primary key, x text unique);
NOTICE: CREATE TABLE will create implicit sequence "x1_id_seq" for serial column "x1.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "x1_pkey" for table "x1"
NOTICE: CREATE TABLE / UNIQUE will create implicit index "x1_x_key" for table "x1"
CREATE TABLE
Und sehen Sie, wie es aussieht:
# \d x1
Table "public.x1"
Column | Type | Modifiers
--------+---------+-------------------------------------------------
id | integer | not null default nextval('x1_id_seq'::regclass)
x | text |
Indexes:
"x1_pkey" PRIMARY KEY, btree (id)
"x1_x_key" UNIQUE, btree (x)
Jetzt können wir die Struktur kopieren:
# create table x2 ( like x1 INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES );
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "x2_pkey" for table "x2"
NOTICE: CREATE TABLE / UNIQUE will create implicit index "x2_x_key" for table "x2"
CREATE TABLE
Und überprüfen Sie die Struktur:
# \d x2
Table "public.x2"
Column | Type | Modifiers
--------+---------+-------------------------------------------------
id | integer | not null default nextval('x1_id_seq'::regclass)
x | text |
Indexes:
"x2_pkey" PRIMARY KEY, btree (id)
"x2_x_key" UNIQUE, btree (x)
Wenn Sie PostgreSQL vor 8.3 verwenden, können Sie einfach pg_dump mit der Option "-t" verwenden, um 1 Tabelle anzugeben, den Tabellennamen in dump zu ändern und erneut zu laden:
=> pg_dump -t x2 | sed 's/x2/x3/g' | psql
SET
SET
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
Und jetzt ist der Tisch:
# \d x3
Table "public.x3"
Column | Type | Modifiers
--------+---------+-------------------------------------------------
id | integer | not null default nextval('x1_id_seq'::regclass)
x | text |
Indexes:
"x3_pkey" PRIMARY KEY, btree (id)
"x3_x_key" UNIQUE, btree (x)
Hier ist ein Beispiel
Die andere Möglichkeit, eine neue Tabelle aus der ersten zu erstellen, ist die Verwendung
Beachten Sie, dass Postgresql einen Patch zur Behebung von Tabellenbereichsproblemen hat, wenn die zweite Methode verwendet wird
quelle
CREATE TABLE my_table (LIKE...)
statt sein,CREATE TABLE my_table LIKE...
um zu arbeiten. Antwort bearbeitet.Ich nehme an, dass ...
... wird aus irgendeinem Grund nicht funktionieren. (Möchtest du diesen Grund teilen?)
Schauen Sie in pg_dump und pg_restore. Die Verwendung von pg_dump mit einigen cleveren Optionen und möglicherweise das Bearbeiten der Ausgabe vor pg_restoring könnte den Trick tun.
Da Sie die Daten vom Typ "Was wäre wenn" analysieren, frage ich mich, ob Sie möglicherweise besser dran sind, Ansichten zu verwenden.
Sie können für jedes zu testende Szenario eine Ansicht definieren, die auf der Negation dessen basiert, was Sie ausschließen möchten. Definieren Sie eine Ansicht basierend auf dem, was Sie einschließen möchten. Wenn Sie beispielsweise ein "Fenster" für die Daten wünschen, in dem Sie die Zeilen mit X = Y "gelöscht" haben, erstellen Sie eine Ansicht als Zeilen mit (X! = Y).
Ansichten werden in der Datenbank (im Systemkatalog) als definierende Abfrage gespeichert. Jedes Mal, wenn Sie die Ansicht abfragen, sucht der Datenbankserver nach der zugrunde liegenden Abfrage, die sie definiert, und führt diese aus (UND-verknüpft mit allen anderen von Ihnen verwendeten Bedingungen). Dieser Ansatz bietet mehrere Vorteile:
Es gibt natürlich einen Kompromiss. Da eine Ansicht eine virtuelle Tabelle und keine "echte" (Basis-) Tabelle ist, führen Sie bei jedem Zugriff eine (möglicherweise komplexe) Abfrage aus. Dies kann die Dinge etwas verlangsamen. Aber es kann nicht. Dies hängt von vielen Aspekten ab (Größe und Art der Daten, Qualität der Statistiken im Systemkatalog, Geschwindigkeit der Hardware, Nutzungslast und vieles mehr). Sie werden es nicht wissen, bis Sie es versuchen. Wenn Sie (und nur dann) tatsächlich feststellen, dass die Leistung inakzeptabel langsam ist, sollten Sie sich andere Optionen ansehen. (Materialisierte Ansichten, Kopien von Tabellen, ... alles, was Raum gegen Zeit tauscht.)
quelle
Es gibt viele Antworten im Internet, eine davon finden Sie hier .
Am Ende habe ich so etwas gemacht:
Dadurch werden das Schema und die Daten einschließlich Indizes kopiert, jedoch ohne Trigger und Einschränkungen. Beachten Sie, dass Indizes für die ursprüngliche Tabelle freigegeben sind. Wenn Sie also eine neue Zeile zu einer der beiden Tabellen hinzufügen, wird der Zähler erhöht.
quelle
Erstellen Sie eine neue Tabelle mit einer Auswahl, um die gewünschten Daten abzurufen. Tauschen Sie dann den alten Tisch gegen den neuen aus.
quelle
Es gibt viele Antworten im Internet, eine davon finden Sie hier .
Am Ende habe ich so etwas gemacht:
Dadurch werden das Schema und die Daten einschließlich Indizes kopiert, jedoch ohne Trigger und Einschränkungen. Beachten Sie, dass Indizes für die ursprüngliche Tabelle freigegeben sind. Wenn Sie also eine neue Zeile zu einer der beiden Tabellen hinzufügen, wird der Zähler erhöht.
Siehe auch die Antwort hier .
quelle
Ein einfacher Weg ist, alle einzuschließen:
quelle