2012-06-08 9 views
23

Kann jemand die OID einer Tabelle in Postgres 9.1 finden? Ich schreibe ein Update-Skript, das auf das Vorhandensein einer Spalte in einer Tabelle testen muss, bevor es versucht, die Spalte zu erstellen. Dadurch wird verhindert, dass das Skript nach dem ersten Fehler ausgeführt wird.Ermitteln der OID einer Tabelle in Postgres 9.1?

Antwort

18

Die Postgres-Katalogtabelle pg_class ist, was Sie betrachten sollten. Es sollte eine Zeile pro Tabelle mit dem Tabellennamen in der Spalte relname und der OID in der ausgeblendeten Spalte oid geben.

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 interessiert sein an der pg_attribute Katalogtabelle, die eine Zeile pro Tabelle Spalte enthält.

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

+1

Ich hatte die Dokumentation auf der 'pg_class' und' pg_attribute' Tabellen gesehen, aber ich wusste nicht, dass es eine versteckte Spalte war namens 'oid' im' pg_class' Tabelle. Ich konnte nicht herausfinden, wo der Oid von den Docs war. Vielen Dank! –

+6

Das ist nicht ganz genau. Jede Datenbank hat ein Schema mit dem Namen 'pg_catalog', das für die Datenbank spezifische Katalogtabellen enthält. –

+0

Ich zweite @ TonyVitabile. Es war die versteckte Spalte "oid", die ich suchte. –

31

Es gibt eine einfache Möglichkeit, eine Tabelle OID zu erhalten. Gieße den object-identifier classregclass (während die mit den jeweiligen DB):

SELECT 'mytbl'::regclass::oid; 

Voreingestellt ist das erste Schema im search_path oder wirft eine Ausnahme, wenn nicht gefunden.
Oder Schema qualifizieren explizit:

SELECT TRUE AS col_exists 
FROM pg_attribute 
WHERE attrelid = '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) 

In Postgres 9.4 oder später können Sie auch to_regclass('mytbl'):

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

Dann nur Sie Katalogtabelle pg_attribute für die Existenz der Säule inspizieren müssen , die keine Ausnahme auslöst, wenn die Tabelle nicht gefunden wird:

0
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r'; 
+1

Erklärung wäre nett ... – eirikir

Verwandte Themen