Determinar el OID de una tabla en Postgres 9.1?


¿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 intentar crear la columna. Esto es para evitar que se ejecute el script después del primero.

Author: Tony Vitabile, 2012-06-08

4 answers

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 base de datos postgres, así que asegúrese de conectarse a ella, en lugar de a la base de datos de la aplicación.

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

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

 21
Author: jmelesky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-08 18:18:50

Para obtener un OID de tabla, utilice el tipo de identificador de objeto regclass (mientras está conectado al mismo DB):

SELECT 'mytbl'::regclass::oid;

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

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 más tarde, usted también puede usar to_regclass('myschema.mytbl'), que no levanta una excepción si la tabla no está encontrado:

Entonces solo necesita consultar la tabla de catálogopg_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)
 33
Author: Erwin Brandstetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-25 23:12:57

Solo para completar las posibilidades me gustaría añadir que existe una sintaxis para soltar columnas con el fin de no error:

ALTER TABLE mytbl DROP COLUMN IF EXISTS mycol

Véase http://www.postgresql.org/docs/9.0/static/sql-altertable.html

Entonces puede agregar su columna de forma segura.

 2
Author: Stefan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-09 22:50:01
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
 1
Author: user3132194,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-07 07:00:35