PostgreSQL prend-il en charge les colonnes générées ? Aussi connu sous le nom de colonnes virtuelles . Je ne parle pas de IDENTITY
colonnes .
Je ne trouve aucune information sur cette fonctionnalité remarquable mais je sais qu'elle est disponible sur SQL Server et dans les dernières versions de MariaDB & MySQL.
Cette fonctionnalité est mentionnée dans la norme SQL: 2003 , et il y a eu des discussions sur les forums PostgreSQL vers 2006, mais je ne trouve rien de substantiel à ce sujet.
Il y a une discussion sur SO, mais elle est assez ancienne maintenant, donc elle pourrait bien être obsolète.
postgresql
computed-column
Manngo
la source
la source
Réponses:
Je ne sais pas si c'est ce que vous voulez, mais la notation d'attribut
row.full_name
et la notation de fonctionfull_name(row)
sont équivalentes dans postgresql.Cela signifie que vous prenez une table
et une fonction:
et appelez-le comme ceci:
Est-ce ce dont vous avez besoin?
Pour accélérer les choses, vous pouvez créer un index d'expression:
Ou tout stocker dans une vue matérialisée.
Exemple tiré d'ici: http://bernardoamc.github.io/sql/2015/05/11/postgres-virtual-columns/
la source
select people.full_name from people
ouselect full_name(people) from people
?Non, ceci n'est actuellement pas pris en charge (à partir de Postgres 9.6).
La seule solution consiste à utiliser un déclencheur ou une vue s'il s'agit d'un simple calcul que vous n'avez pas besoin d'indexer.
la source
Oui:
GENERATED ALWAYS AS … STORED
Postgres 12 ajoute la fonctionnalité pour les colonnes générées, comme mentionné dans la norme SQL: 2003 .
La valeur est générée au moment d'un
INSERT
ouUPDATE
, puis stockée avec la ligne comme toute autre valeur.Un élément généré doit être basé sur une colonne de base de la même table ou sur une fonction immuable .
La syntaxe est simple, une clause sur
CREATE TABLE
:Exemple:
Fonctionnalités:
Mises en garde:
Voir:
la source
Selon votre cas d'utilisation, vous pouvez obtenir ce type de comportement en déclarant une nouvelle colonne et en la remplissant avec un déclencheur lors de l'insertion / mise à jour.
J'utiliserais les réponses ci-dessus si possible pour éviter de dupliquer les données qui pourraient être dérivées de ce que vous avez déjà, mais cela fait l'affaire et pourrait être utile pour les champs dérivés à forte intensité de calcul que vous souhaitez calculer une fois et enregistrer.
J'ai considéré cette approche pour résoudre un problème où je n'avais parfois que 15 chiffres d'une clé à 18 chiffres (les 3 derniers chiffres ne sont qu'une somme de contrôle), mais je voulais pouvoir imposer une relation de clé étrangère.
Documents PG sur les déclencheurs: https://www.postgresql.org/docs/9.6/sql-createtrigger.html
Exemple W3: https://www.w3resource.com/PostgreSQL/postgresql-triggers.php
la source