Wie erstelle ich eine Tabelle? Wie ohne die NICHT NULL-Einschränkungen?

9

Ich versuche, die Struktur einer Tabelle innerhalb einer Funktion mithilfe von dynamischem SQL neu zu erstellen.

EXECUTE 'CREATE TABLE ' || my_table_name || '_bk' ||
    ' (like ' || _my_table_name || ')';

Das wird ähnlich sein wie:

CREATE TABLE my_table_bk
(like my_table);

Aber ich muss alle Einschränkungen verwerfen. Bei Verwendung EXCLUDING CONSTRAINTSder Like-Optionen werden weiterhin die NOT NULL-Einschränkungen kopiert (Dokumentation bestätigt dieses Verhalten):

CREATE TABLE my_table_bk
(like my_table EXCLUDING CONSTRAINTS);

Die Frage ist, wie ich die Tabellenstruktur ohne die NOT NULL-Einschränkungen neu erstellen oder alternativ alle NOT NULL-Einschränkungen in einer Tabelle entfernen kann.

Alexandre Neto
quelle

Antworten:

6

Dies wurde beim Stapelüberlauf unter So löschen Sie alle NOT NULL-Einschränkungen aus einer PostgreSQL-Tabelle auf einmal abgefragt . Es scheint eine gute Auswahl an Lösungen zu geben.

Die akzeptierte Antwort von Denis de Bernardy lautet:

Sie können sie alle in derselben alter-Anweisung gruppieren:

   alter table tbl alter col1 drop not null,
                   alter col2 drop not null,
                   

Sie können auch die Liste der relevanten Spalten aus dem Katalog abrufen, wenn Sie einen do-Block schreiben möchten , um die erforderliche SQL zu generieren. Zum Beispiel so etwas wie:

select a.attname
  from pg_catalog.pg_attribute a
 where attrelid = 'tbl'::regclass
   and a.attnum > 0
   and not a.attisdropped
   and a.attnotnull;

(Beachten Sie, dass dies auch die primärschlüsselbezogenen Felder enthält, daher sollten Sie diese herausfiltern.)

Wenn Sie dies tun, vergessen Sie nicht, es für quote_ident()den Fall zu verwenden, dass Sie jemals mit möglicherweise seltsamen Zeichen in Spaltennamen umgehen müssen.

Vérace
quelle
13

Versuche dies:

CREATE TABLE my_table_bk
AS
  SELECT *
  FROM my_table
  WHERE false;

Oder Sie können LIMIT 0anstelle der WHEREKlausel anhängen .

Dadurch wird eine Tabelle my_table_bkmit derselben Struktur wie my_tableohne Einschränkungen und ohne Daten erstellt.

user53736
quelle
0

Update: Diese Methode ist besser, wenn Sie die Tabellenstruktur ohne Einschränkungen duplizieren möchten

Ich denke, der einfachste Weg, eine Tabelle wie ohne NOT NULLEinschränkungen zu erstellen , ist die Verwendung einer einfachen pg_dumpundsed

pg_dump -Ox --schema-only -t myTable myDatabase |
  sed -ne'/^CREATE TABLE/,/);/p' -e's/^NOT NULL//';

Sie können diese Methode leicht erweitern, um den Rest der Einschränkungen zu beseitigen. Dieser Begriff ist ziemlich weit gefasst, daher bin ich mir nicht sicher, welche Einschränkungen Sie nicht wollen.

Evan Carroll
quelle