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'';