postgresql postgresql-9.1

postgresql - ¿Determinar el OID de una tabla en Postgres 9.1?



postgresql-9.1 (4)

¿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 que la ejecución de la secuencia de comandos después de la primera error.


Para obtener un OID de tabla, regclass tipo de identificador de objeto regclass (mientras regclass conectado a la misma base de datos):

SELECT ''mytbl''::regclass::oid;

Esto encuentra la primera tabla (o vista, etc.) con el nombre dado a lo largo de search_path o genera una excepción si no se encuentra.

El esquema califica el nombre de la tabla para eliminar la dependencia en la ruta de búsqueda:

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

En Postgres 9.4 o posterior también puede usar to_regclass(''myschema.mytbl'') , que no to_regclass(''myschema.mytbl'') una excepción si no se encuentra la tabla:

Entonces solo necesita consultar la tabla de catálogo pg_attribute para la existencia de la columna:

SELECT TRUE AS col_exists FROM pg_attribute WHERE attrelid = ''myschema.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)


Solo para completar las posibilidades, me gustaría agregar que existe una sintaxis para eliminar columnas para que no haya errores:

ALTERAR MESA mytbl DROP COLUMNA SI EXISTE mycol

Consulte http://www.postgresql.org/docs/9.0/static/sql-altertable.html

A continuación, puede agregar con seguridad su columna.


La tabla de catálogo de postgres pg_class es lo que debe mirar. 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 del catálogo están en la postgres datos de postgres , así que asegúrese de conectarse a eso, en lugar de a la base de datos de su aplicación.

También puede interesarle la tabla de catálogo pg_attribute , que incluye una fila por columna de tabla.

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


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