¿Alguien sabe cómo encontrar el OID de una tabla en Postgres 9.1? Estoy escribiendo un script de actualización que necesita para la prueba de la existencia de una columna en una tabla antes de que se intenta crear la columna. Esto es para evitar la ejecución de la secuencia de comandos después de la primera de erroring fuera.

4 Comentarios

  1. 24

    El postgres tabla del catálogo pg_class es lo que usted debe mirar. Debe haber una fila de cada tabla, con el nombre de la tabla en la columna relname, y el oid en la columna oculta oid.

    El catálogo de las mesas se encuentran en el postgres de la base de datos, así que asegúrese de conectar a la que, en lugar de la aplicación de la base de datos.

    Usted también podría estar interesado en el pg_attribute tabla del catálogo, que incluye una fila por cada columna de la 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

    • Yo había visto los documentos en el pg_class y pg_attribute tablas, pero yo no sabía que había una columna oculta nombre oid en el pg_class tabla. Yo no podía entender por donde el oid era de la documentación. Gracias!
    • Esto no es del todo exacta. Cada base de datos tiene un esquema denominado pg_catalog, que contiene las tablas del catálogo específico para la base de datos.
    • En la segunda @TonyVitabile. Era la columna oculta oid que yo estaba buscando.
  2. 39

    Para obtener una tabla de OID, convertir a la identificador de objeto de tipo regclass (mientras está conectado a la misma DB):

    SELECT 'mytbl'::regclass::oid;

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

    Esquema de calificar el nombre de la tabla para eliminar la dependencia de la ruta de búsqueda:

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

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

    A continuación, usted sólo necesita consultar la tabla del 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)
  3. 1
    SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
    • Explicación sería agradable…
    • Postgres almacena información sobre cada tabla creada por el usuario, así como acerca de las tablas del sistema en el catálogo del sistema (en realidad de la tabla) pg_class, así que usted puede conseguir oid con esta consulta. Es gracioso, pero la información acerca de pg_class también se almacena en pg_class: postgres=# SELECT oid, relname DE pg_class DONDE relname = ‘pg_class’; oid | relname ——+———- 1259 | pg_class (1 fila)
    • No, yo creo que el comentario de eirikir no fue una solicitud de más información, pero una de las críticas que el autor de esta Respuesta. Los creadores de Desbordamiento de Pila destinados a este sitio para que sea más que un fragmento de código de la biblioteca. Así, las Respuestas que se espera tener alguna explicación, junto con algún código de ejemplo.

Dejar respuesta

Please enter your comment!
Please enter your name here