2012-06-08 47 views
23

¿Alguien sabe cómo encontrar el OID de una tabla en Postgres 9.1? Estoy escribiendo un script de actualización que necesita probar la existencia de una columna en una tabla antes de que intente crear la columna. Esto es para evitar la ejecución de la secuencia de comandos después de la primera desde el error de salida.¿Cómo determinar el OID de una tabla en Postgres 9.1?

Respuesta

18

La tabla de catálogo de postgres pg_class es lo que debe tener en cuenta. Debe haber una fila por tabla, con el nombre de la tabla en la columna relname, y el oid en la columna oculta oid.

Las tablas de catálogo están en la base de datos postgres, así que asegúrese de conectarse a esa, en lugar de a la base de datos de su aplicación.

Puede que también le interese la tabla de catálogo pg_attribute, que incluye una fila por columna de tabla.

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

+1

había visto a los documentos en la '' pg_class' y mesas pg_attribute', pero yo no sabía que había una columna oculta llamada 'oid' en la tabla' pg_class'. No pude entender dónde estaba el oid de los documentos. ¡Gracias! –

+6

Esto no es del todo exacto. Cada base de datos tiene un esquema llamado 'pg_catalog', que contiene tablas de catálogo específicas para la base de datos. –

+0

I segundo @TonyVitabile. Era la columna oculta 'oid' que estaba buscando. –

31

Hay una manera simple de conseguir una mesa OID. Fundido a los object-identifier classregclass (mientras está conectado a la respectiva DB):

SELECT 'mytbl'::regclass::oid; 

es por omisión el primer esquema de la search_path o lanza una excepción si no lo encuentra.
o esquema a calificar explícitamente:

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

Entonces sólo hay que fijarse en tabla de catálogo pg_attribute para la existencia de la columna:

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) 

En Postgres 9.4 o temprano también puede utilizar to_regclass('mytbl') , que no genera una excepción si no se encuentra la tabla:

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

La explicación sería agradable ... – eirikir

Cuestiones relacionadas