¿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
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
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:
Sólo para completar las posibilidades que me gustaría añadir que existe una sintaxis para quitar columnas con el fin de ningún error a cabo:
ALTER TABLE DROP MyTbl columna si EXISTE mycol
Ver http://www.postgresql.org/docs/9.0/static/sql-altertable.html
A continuación, puede agregar su columna de forma segura.
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
La explicación sería agradable ... – eirikir
- 1. Postgres 9.1 GRANT no funciona
- 2. Consultar concesiones para una tabla en postgres
- 3. Cómo puede una función almacenada de Postgres devolver una tabla
- 4. ¿Cómo determinar qué tipo de índice usar en Postgres?
- 5. Orden de unión de tabla en postgres
- 6. SQL, OID de Postgres, ¿qué son y por qué son útiles?
- 7. postgres "devuelve la tabla" devuelve una cadena
- 8. Obtener último registro de una tabla en Postgres
- 9. ¿Cómo crear una copia de seguridad de una sola tabla en una base de datos postgres?
- 10. Cómo buscar documentos por OID en mongoengine
- 11. SNMP: Crear OID personalizado
- 12. ¿Cómo crear múltiples columnas en una tabla en una sola instrucción de consulta en postgres?
- 13. cómo usar geometry datatype to postgres table?
- 14. Copie una tabla (incluidos los índices) en postgres
- 15. Seleccione el recuento de filas en otra tabla en una instrucción SELECT de Postgres
- 16. PostgreSQL 9.1: Cómo concatenar filas en la matriz sin duplicados, UNIRSE a otra tabla
- 17. ¿Cómo agregar una nueva columna en una tabla después de la 2ª o 3ª columna en la tabla usando postgres?
- 18. limitación de array_agg en Postgresql 9.1
- 19. ¿Cómo obtener OID desde un archivo MIB?
- 20. Cómo usar pgFouine con PostgreSQL 9.1?
- 21. ¿Cuántas particiones de tabla hay demasiadas en Postgres?
- 22. no se puede encontrar adminpack.sql en postgresql 9.1
- 23. ¿Cómo instalo pgcrypto en postgresql 9.1 en Windows?
- 24. Determinar si una celda de vista de tabla está visible
- 25. Cómo "nombre" una consulta en postgres
- 26. expresión matemática Postgres calculcated para cada fila en la tabla
- 27. Inserciones manuales en una tabla de postgres con una secuencia de clave primaria
- 28. Postgres missing pgcrypt ability?
- 29. Unión de toda la geometría en una tabla de SQL Server como GeomUnion en Postgres
- 30. ¿Cómo importo módulos o instalo extensiones en PostgreSQL 9.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! –
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. –
I segundo @TonyVitabile. Era la columna oculta 'oid' que estaba buscando. –