2012-06-08 15 views
23

Czy ktoś wie, jak znaleźć OID tabeli w PostgreSQL 9.1? Piszę skrypt aktualizacji, który musi przetestować istnienie kolumny w tabeli, zanim spróbuje utworzyć kolumnę. Ma to zapobiec uruchomieniu skryptu po pierwszym z błędów.Określanie OID tabeli w PostgreSQL 9.1?

Odpowiedz

18

Należy przejrzeć tabelę katalogów postgresowych pg_class. Powinien być jeden wiersz na tabelę, z nazwą tabeli w kolumnie relname, a identyfikator w ukrytej kolumnie oid.

Tabele katalogu znajdują się w bazie danych postgres, więc należy się łączyć z tym, a nie z bazą danych aplikacji.

Możesz również być zainteresowany tabelą katalogów pg_attribute, która zawiera jeden wiersz na kolumnę tabeli.

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

+1

Widziałem docs na '' pg_class' i stoły pg_attribute', ale nie wiedziałem, że istnieje ukryta kolumna o nazwie 'oid' w' pg_class' tabeli. Nie mogłem dowiedzieć się, gdzie oid był od doktorów. Dzięki! –

+6

To nie jest całkiem dokładne. Każda baza danych ma schemat o nazwie 'pg_catalog', który zawiera tabele katalogu specyficzne dla bazy danych. –

+0

I sekunda @TonyVitabile. To była ukryta kolumna 'oid', której szukałem. –

31

Istnieje prosty sposób, aby dostać stolik OID. Oddanych do object-identifier classregclass (gdy połączone z odpowiednimi DB)

SELECT 'mytbl'::regclass::oid; 

wartością domyślną pierwszego schematu w search_path lub zgłasza wyjątek, jeżeli nie została znaleziona.
Albo schematu zakwalifikować jawnie:

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

Potem trzeba tylko sprawdzić tabeli katalogu pg_attribute istnienia kolumny:

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) 

W PostgreSQL 9,4 lub później można również użyć to_regclass('mytbl') , która nie zgłasza wyjątku, jeśli tabela nie zostanie znaleziona:

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

Wyjaśnienie byłoby miłe ... – eirikir

Powiązane problemy