2012-06-08 16 views
23

Qualcuno sa come trovare l'OID di una tabella in Postgres 9.1? Sto scrivendo uno script di aggiornamento che deve verificare l'esistenza di una colonna in una tabella prima di provare a creare la colonna. Questo serve a prevenire l'esecuzione dello script dopo il primo dall'errore.Determinare l'OID di una tabella in Postgres 9.1?

risposta

18

La tabella di catalogo postgres pg_class è ciò che si dovrebbe guardare. Dovrebbe esserci una riga per tabella, con il nome della tabella nella colonna relname e l'oid nella colonna nascosta oid.

Le tabelle di catalogo si trovano nel database postgres, quindi assicuratevi di collegarvi a questo, piuttosto che al database dell'applicazione.

Potrebbe interessarti anche la tabella di catalogo pg_attribute, che include una riga per colonna di tabella.

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

+1

avevo visto la documentazione sulla '' pg_class' e tavoli pg_attribute', ma non sapevo che ci fosse una colonna nascosta denominata 'oid' nella tabella' pg_class'. Non riuscivo a capire da dove provenisse l'oid dei documenti. Grazie! –

+6

Questo non è abbastanza preciso. Ogni database ha uno schema chiamato 'pg_catalog', che contiene tabelle di catalogo specifiche per il database. –

+0

I second @TonyVitabile. Era la colonna nascosta 'oid' che stavo cercando. –

31

C'è un modo semplice per ottenere un tavolo OID. Precipitava sulla object-identifier classregclass (mentre è collegato al rispettivo DB):

SELECT 'mytbl'::regclass::oid; 

Il valore predefinito per il primo schema nel search_path o solleva un'eccezione se non trovato.
o schema-qualificare esplicitamente:

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

allora dovete solo di ispezionare tabella di catalogo pg_attribute per l'esistenza della colonna:

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 o poi si può anche utilizzare to_regclass('mytbl') , che non genera un'eccezione se la tabella non viene trovata:

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

La spiegazione sarebbe carina ... – eirikir

Problemi correlati