Wie kopiert man Struktur und Inhalt der PostgreSQL-Tabelle, aber doppelte Sequenzen?

7

Ich versuche, temporäre Tabellen für Komponententests einzurichten. Bisher habe ich eine temporäre Tabelle erstellt, die die Struktur einer bestehenden Tabelle kopiert:

%Vor%

Aber es fehlen die Daten aus der ursprünglichen Tabelle. Ich kann die Daten in die temporäre Tabelle kopieren, indem ich stattdessen eine CREATE TABLE AS -Anweisung verwende:

%Vor%

Aber dann wird die Struktur von t_mytable nicht identisch sein, z.B. Spaltengrößen und Standardwerte sind unterschiedlich. Gibt es eine einzige Aussage, die alles kopiert?

Ein weiteres Problem, das ich bei der ersten Abfrage mit LIKE habe, ist, dass das Schlüsselfeld die ID-Sequenz der Originaltabelle referenziert und diese somit beim Einfügen inkrementiert. Gibt es eine einfache Möglichkeit, die Sequenzen für die Unit-Testing-Tabelle zu duplizieren, oder muss ich neue Sequenzen manuell einrichten?

    
Stefan Majewsky 04.09.2012, 13:38
quelle

2 Antworten

7

Postgres 10 oder später

Postgres 10 eingeführt IDENTITY Spalten konform mit dem SQL Standard (mit kleinen Erweiterungen). Die ID-Spalte Ihrer Tabelle würde etwa so aussehen:

%Vor%

Syntax im Handbuch.
Mit dieser statt eines traditionellen serial Säule vermeidet Ihr Problem mit Sequenzen. IDENTITY -Spalten verwenden automatisch exklusive dedizierte Sequenzen, selbst wenn die Spezifikation mit LIKE kopiert wird. Das Handbuch:

  

Alle Identitätsspezifikationen der kopierten Spaltendefinitionen werden nur sein   kopiert, wenn INCLUDING IDENTITY angegeben ist. Eine neue Sequenz wird erstellt   für jede Identitätsspalte der neuen Tabelle getrennt von den Folgen   mit der alten Tabelle verbunden.

Und:

  

INCLUDING ALL ist eine abgekürzte Form von INCLUDING DEFAULTS INCLUDING IDENTITY INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS .

Die Lösung ist jetzt einfacher:

%Vor%

Wie bereits beschrieben, können Sie setval() weiterhin verwenden, um die Sequenzen aktuell zu setzen Wert. Ein einzelner SELECT macht den Trick. Verwenden Sie pg_get_serial_sequence() den Namen des bekommen Sequenz.

hier

Verwandte:

Ursprüngliche (alte) Antwort

Sie können das create-Skript von einem Datenbank-Dump oder einer GUI wie pgAdmin nehmen (die Datenbank-Objekt-Erstellungsskripte zurückentwickelt), Erstellen Sie eine identische Kopie (mit separater Sequenz für die Spalte serial ), und führen Sie dann:

%Vor%

Die Kopie kann nicht zu 100% identisch sein, wenn beide Tabellen im selben Schema liegen. Offensichtlich muss der Tabellenname unterschiedlich sein. Indexnamen würden ebenfalls in Konflikt geraten. Das Abrufen von Seriennummern aus derselben Sequenz wäre wahrscheinlich auch nicht in Ihrem Interesse. Also müssen Sie (mindestens) die Namen anpassen.

Durch das Platzieren der Kopie in einem anderen Schema werden alle diese Konflikte vermieden. Während Sie eine temporäre Tabelle aus einer regulären -Tabelle erstellen, wie Sie es demonstriert haben, ist dies automatisch der Fall, da temporäre Tabellen in einem eigenen temporären Schema gespeichert sind.

Oder schauen Sie sich Francisco Antwort für DDL-Code direkt an.

    
Erwin Brandstetter 04.09.2012, 14:07
quelle
24

Ich verwende den folgenden Code, um es zu tun:

%Vor%     
Francisco Puga 04.09.2013 17:51
quelle

Tags und Links