it-swarm.com.de

Bestimmung der OID einer Tabelle in Postgres 9.1?

Weiß jemand, wie man die OID einer Tabelle in Postgres 9.1 findet? Ich schreibe ein Aktualisierungsskript, das die Existenz einer Spalte in einer Tabelle testen muss, bevor versucht wird, die Spalte zu erstellen. Dies soll verhindern, dass die Ausführung des Skripts nach dem ersten Fehler auftritt.

28
Tony Vitabile

Die Postgres-Katalogtabelle pg_class ist das, worauf Sie achten sollten. Pro Tabelle sollte eine Zeile mit dem Tabellennamen in der Spalte relname und der oid in der verborgenen Spalte oid vorhanden sein.

Die Katalogtabellen befinden sich in der Datenbank postgres. Stellen Sie also sicher, dass Sie eine Verbindung zu dieser Datenbank und nicht zu Ihrer Anwendungsdatenbank herstellen.

Sie könnten auch an der pg_attribute-Katalogtabelle interessiert sein, die eine Zeile pro Tabellenspalte enthält.

Siehe: http://www.postgresql.org/docs/current/static/catalog-pg-class.html und http://www.postgresql.org/docs/current/static/catalog- pg-attribute.html

23
jmelesky

Um eine Tabellen-OID zu erhalten, konvertieren Sie den Objektbezeichner-Typregclass (während er mit demselben DB verbunden ist):

SELECT 'mytbl'::regclass::oid;

Dadurch wird die erste Tabelle (oder Ansicht usw.) mit dem angegebenen Namen entlang des search_path gefunden oder eine Ausnahme ausgelöst, wenn sie nicht gefunden wird.

Schätzen Sie den Tabellennamen nach Schema, um die Abhängigkeit vom Suchpfad zu entfernen:

SELECT 'myschema.mytbl'::regclass::oid;

In Postgres 9.4 oder höher können Sie auch to_regclass('myschema.mytbl') verwenden, wodurch keine Ausnahme ausgelöst wird, wenn die Tabelle nicht gefunden wird:

Dann müssen Sie nur die Katalogtabelle pg_attribute nach dem Vorhandensein der Spalte abfragen:

SELECT TRUE AS col_exists
FROM   pg_attribute 
WHERE  attrelid = 'myschema.mytbl'::regclass
AND    attname  = 'mycol'
AND    NOT attisdropped  -- no dropped (dead) columns
-- AND attnum > 0        -- no system columns (you may or may not want this)
36

Um die Möglichkeiten zu vervollständigen, möchte ich hinzufügen, dass es eine Syntax für das Ablegen von Spalten gibt, um einen Fehler zu vermeiden:

ALTER TABLE mytbl DROP SPALTE, WENN EXCELS mycol

Siehe http://www.postgresql.org/docs/9.0/static/sql-altertable.html

Dann können Sie Ihre Spalte sicher hinzufügen.

2
Stefan
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
1
user3132194