¿PostgreSQL admite columnas generadas ? También se conoce como columnas virtuales . Estoy no hablando de IDENTITY
columnas .
No puedo encontrar ninguna información sobre esta característica notable, pero sé que está disponible en SQL Server y en las últimas versiones de MariaDB y MySQL.
La característica se menciona en el estándar SQL: 2003 , y hubo una discusión en los foros de PostgreSQL alrededor de 2006, pero no puedo encontrar nada sustancial al respecto.
Existe cierta discusión sobre SO, pero ahora es bastante antiguo, por lo que puede estar desactualizado.
postgresql
computed-column
Manngo
fuente
fuente
Respuestas:
No estoy seguro de si esto es lo que desea, pero la notación de atributos
row.full_name
y la notación de funcionesfull_name(row)
son equivalentes en postgresql.Eso significa que tomas una mesa
y una función:
y llámalo así:
Es eso lo que necesita?
Para acelerar las cosas, puede crear un índice de expresión:
O almacene todo en una vista materializada.
Ejemplo tomado de aquí: http://bernardoamc.github.io/sql/2015/05/11/postgres-virtual-columns/
fuente
select people.full_name from people
oselect full_name(people) from people
?No, esto actualmente (a partir de Postgres 9.6) no es compatible.
La única solución es usar un disparador o una vista si es un cálculo simple que no necesita indexar.
fuente
Si:
GENERATED ALWAYS AS … STORED
Postgres 12 agrega la funcionalidad para columnas generadas, como se menciona en el estándar SQL: 2003 .
El valor se genera en el momento de un
INSERT
oUPDATE
, luego se almacena con la fila como cualquier otro valor.Un generado debe basarse en una columna base de la misma tabla, o en una función inmutable .
La sintaxis es simple, una cláusula sobre
CREATE TABLE
:Ejemplo:
caracteristicas:
Advertencias:
Ver:
fuente
Dependiendo de su caso de uso, puede lograr este tipo de comportamiento declarando una nueva columna y rellenándola con un activador en la inserción / actualización.
Si fuera posible, usaría las respuestas anteriores para evitar la duplicación de datos que podrían derivarse de lo que ya tiene, pero hace el truco y podría ser útil para los campos derivados computacionalmente intensivos que desea calcular una vez y guardar.
Consideré este enfoque para tratar un problema en el que a veces solo tenía 15 dígitos de una clave de 18 dígitos (los últimos 3 dígitos son solo una suma de verificación) pero quería poder hacer cumplir una relación de clave externa.
Documentos de PG sobre desencadenantes: https://www.postgresql.org/docs/9.6/sql-createtrigger.html
Ejemplo de W3: https://www.w3resource.com/PostgreSQL/postgresql-triggers.php
fuente