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
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
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:
Wystarczy wypełnić możliwości Chciałbym dodać, że istnieje składni upuszczanie kolumn, aby bez błędu out:
ALTER TABLE DROP COLUMN mytbl IF EXISTS Mycol
Zobacz http://www.postgresql.org/docs/9.0/static/sql-altertable.html
Następnie możesz bezpiecznie dodać swoją kolumnę.
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
Wyjaśnienie byłoby miłe ... – eirikir
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! –
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. –
I sekunda @TonyVitabile. To była ukryta kolumna 'oid', której szukałem. –