web-dev-qa-db-fra.com

Déterminer le OID d'une table dans Postgres 9.1?

Est-ce que quelqu'un sait comment trouver le OID d'une table dans Postgres 9.1? J'écris un script de mise à jour qui doit vérifier l'existence d'une colonne dans une table avant d'essayer de créer la colonne. Cela empêche l'exécution du script après la première erreur.

28
Tony Vitabile

La table de catalogue postgres pg_class est ce que vous devriez regarder. Il devrait y avoir une ligne par table, avec le nom de la table dans la colonne relname et l'oid dans la colonne masquée oid.

Les tables du catalogue se trouvent dans la base de données postgres. Veillez donc à vous connecter à cette base plutôt qu'à votre base de données d'application.

Vous pouvez également être intéressé par la table de catalogue pg_attribute, qui comprend une ligne par colonne de table.

Voir: http://www.postgresql.org/docs/current/static/catalog-pg-class.html et http://www.postgresql.org/docs/current/static/catalog- pg-attribut.html

23
jmelesky

Pour obtenir un OID de table, convertissez le type d'identificateur d'objet regclass (lorsque vous êtes connecté au même DB):

SELECT 'mytbl'::regclass::oid;

Ceci trouve la première table (ou vue, etc.) avec le nom donné le long du search_path ou déclenche une exception si elle n'est pas trouvée.

Schéma-qualifiez le nom de la table pour supprimer la dépendance sur le chemin de recherche:

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

Dans Postgres 9.4 ou version ultérieure, vous pouvez également utiliser to_regclass('myschema.mytbl'), qui ne déclenche pas d'exception si la table n'est pas trouvée:

Ensuite, vous devez uniquement interroger la table du catalogue pg_attribute pour connaître l'existence de la colonne:

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)
36

Pour compléter les possibilités, j'aimerais ajouter qu'il existe une syntaxe pour supprimer des colonnes afin de ne pas avoir d'erreur:

ALTER TABLE mytbl DROP COLUMN SI EXISTS mycol

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

Ensuite, vous pouvez ajouter votre colonne en toute sécurité.

2
Stefan
SELECT oid FROM pg_class WHERE relname = 'tbl_name' AND relkind = 'r';
1
user3132194