Obtenir les valeurs par défaut des colonnes de la table dans Postgres?
Je suis à la recherche d'un moyen pour exécuter une requête pour trouver les valeurs par défaut des colonnes d'un tableau dans Postgresql. Par exemple, si j'ai fait un tableau avec la requête suivante:
**note de l'Éditeur: j'ai corrigé la définition de la table comme il n'a pas d'impact sur la question.
CREATE TABLE mytable (
integer int DEFAULT 2,
text varchar(64) DEFAULT 'I am default',
moretext varchar(64) DEFAULT 'I am also default',
unimportant int
);
J'ai besoin d'une requête qui me le dire, dans un format quelconque, que la valeur par défaut pour integer
est de 2, text
est "je suis défaut", et moretext
est "je suis aussi par défaut". Le résultat de la requête peuvent comprendre toute la valeur d'une autre colonne qui n'est pas un défaut, c'est à dire, unimportant
est sans importance pour mes besoins, et n'a pas d'importance du tout.
OriginalL'auteur sjchen | 2011-11-16
Vous devez vous connecter pour publier un commentaire.
Utiliser les informations de schéma:
Jusqu'à le schéma de nommage, ce qui devrait travailler dans n'importe quel système de base de données SQL.
Cela fonctionne, mais il convient de noter que si la performance est un sujet de préoccupation, cette requête sera probablement effectuer le pire pour vous que la réponse fournie par Erwin.
OriginalL'auteur Peter Eisentraut
@Zohaib de la requête est presque mais pas tout à fait droit. Il ya un couple de questions.
J'ai copié ma réponse pour référence future. De ne pas utiliser ce:
Il a copié à partir de certains blog. Qu'il mentionne, il est bon. Mais dans ce cas, la source doit être ajouté. Les gens qui lisent ce blog besoin d'être averti.
Faute de frappe dans
pg_atttribute
- fixe facilement.N'a pas renvoyé de lignes, si il n'y a pas de valeur par défaut spécifiée pour la colonne demandée. Mieux faire qu'un
LEFT JOIN pg_attrdef ON ..
, de sorte que vous toujours obtenir un résultat de ligne si la colonne n'existe. Il sera NULLE, si il n'y a pas de valeur par défaut, qui est en fait le résultat correct parce queNULL
est la valeur par défaut ensuite.Si vous supprimez
attname
de la clause where, vous obtenez seulement les valeurs pour les colonnes qui ont réellement une valeur par défaut. Pas pour les autres. Et vous avez besoin d'ajouterattname
à la liste de sélection ou vous ne savez pas pour quelle colonne.La requête serait renvoie également la valeur par défaut d'une colonne qui est déjà tombé, qui est mal. Lisez à propos de la les détails dans le manuel.
Mais le plus important: la requête peut donner complètement faux résultats, car il ne prend pas le nom de schéma en compte. Il peut être n'importe quel nombre de
table1.col1
dans une base de données postgres: dans les différents schémas. Si plus d'un ont un défaut, vous obtenez plusieurs valeurs. Si la colonne que vous avez en tête n'est pas un défaut, mais un autre dans un autre schéma, vous allez être dupe et ne jamais le savoir.Pour résumer:
Copier /coller à partir de certains blog sans intuition est allé dangereusement faux!
Essayez plutôt ceci:
La
LEFT JOIN
vous permet d'obtenir un résultat aussi longtemps que la colonne existe. Si vous souhaitez exclure ces, en faire unJOIN
à la place. Mais être prêt à obtenir des lignes de temps en temps.Être conscient que la distribution spéciale
::regclass
prend le paramètre actuel poursearch_path
en compte, de sorte que même si vous n'incluez pas le schéma dans le nom (ce qui devrait, pour être sûr!), les chances sont que vous obtenez le résultat attendu.Lire plus à ce sujet dans le manuel.
Y compris
pg_class
est redondante, une fois que nous avons l'OID de la table. Sauter et accélérer les requêtes.WHERE NOT a.attisdropped
- vous toujours d'avoir des colonnes nommées"........pg.dropped.30........"
etc.J'aimerais conclure cette requête dans une fonction, mais ce type de données la fonction doit retourner, puisque la valeur retournée dépend du type de la colonne demandée?
OriginalL'auteur Erwin Brandstetter
J'ai aimé Erwin Réponse mais a quelques difficultés:
NOT a.attisdropped
de qualification. Il n'était pas conforme, je me suis retrouvé à devoir faire une boucle par les résultats et de vérifier les noms de colonne.'I am default'::character varying
qui n'a pas de travail quand ils sont en peluche en forme de web les valeurs d'entrée. Je ne pouvais pas penser à une bonne façon de retirer le plâtre suffixe sans faire quelque chose comme.replace(/::.*/, '')
qui n'est pas assez robuste. Je parie Erwin pouvez trouver certains de façon magique pourEVAL()
la valeur renvoyée et utiliser lea.atttypid
colonne pour obtenir le bon type de données.Je suis donc retourné à ce que je faisais avant:
Une chose à noter ici est que toute
SERIAL
colonnes sera incrémentée. Il ne devrait pas d'importance tant qu'il est unique si elle est juste un index de la table. Sinon, c'est un briseur d'affaire.L'autre chose à regarder dehors pour est tout
TRIGGER AFTER/BEFORE INSERT
qui permettra de feu, même si laINSERT
obtient annulée (je pense que toutes les modifications que la fonction de déclenchement rend obtiendrez annulée.)OriginalL'auteur user9645
J'ai trouvé cette query for postgresql sur l'un des blogs. vous pouvez essayer ce pour voir si ça marche. Pour obtenir des valeurs de tous les coumns, vous pouvez essayer de retirer
AND pat.attname='your_column_name'
de clause where.d'accord...
OriginalL'auteur Zohaib
table, comme la valeur par défaut d'une colonne.
--create table
--afficher les informations de la table de
\d afficher les valeurs par défaut d'une colonne . Je poste cette réponse juste parce que c'est plus facile que de requête pg_catalog des tables ou des vues.
Les utilisateurs ne seront pas toujours avoir accès à la psql-interface (web client de l'hôtel, par exemple). \d est donc pas toujours disponible, pg_catalog.
OriginalL'auteur francs