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:
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?
Postgres 10 eingeführt IDENTITY
Spalten konform mit dem SQL Standard (mit kleinen Erweiterungen). Die ID-Spalte Ihrer Tabelle würde etwa so aussehen:
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 vonINCLUDING 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.
Verwandte:
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:
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.
Tags und Links sql postgresql temp-tables