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
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
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:
Giusto per completare le possibilità mi piacerebbe aggiungere che esiste una sintassi per l'eliminazione di colonne in modo da nessun errore out:
ALTER TABLE MyTbl GOCCIA colonna se ESISTE mycol
Vedi http://www.postgresql.org/docs/9.0/static/sql-altertable.html
Quindi è possibile aggiungere la colonna in modo sicuro.
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
La spiegazione sarebbe carina ... – eirikir
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! –
Questo non è abbastanza preciso. Ogni database ha uno schema chiamato 'pg_catalog', che contiene tabelle di catalogo specifiche per il database. –
I second @TonyVitabile. Era la colonna nascosta 'oid' che stavo cercando. –