Unterstützt PostgreSQL generierte Spalten ? Auch als virtuelle Spalten bekannt . Ich spreche nicht über IDENTITY
Spalten .
Ich kann keine Informationen zu dieser bemerkenswerten Funktion finden, aber ich weiß, dass sie auf SQL Server und in den neuesten Versionen von MariaDB & MySQL verfügbar ist.
Die Funktion ist im SQL: 2003- Standard erwähnt, und es gab einige Diskussionen in den PostgreSQL-Foren um 2006, aber ich kann in dieser Angelegenheit nichts Wesentliches finden.
Es gibt einige Diskussionen über SO, aber es ist schon ziemlich alt, so dass es möglicherweise nicht mehr aktuell ist.
postgresql
computed-column
Manngo
quelle
quelle
Antworten:
Sie sind sich nicht sicher, ob Sie dies möchten, aber Attribut-
row.full_name
und Funktionsnotationfull_name(row)
sind in postgresql gleichwertig.Das heißt, Sie nehmen einen Tisch
und eine Funktion:
und nenne es so:
Brauchen Sie das?
Um die Dinge zu beschleunigen, können Sie einen Ausdrucksindex erstellen:
Oder speichern Sie alles in einer materialisierten Ansicht.
Beispiel hier entnommen: http://bernardoamc.github.io/sql/2015/05/11/postgres-virtual-columns/
quelle
select people.full_name from people
oder seinselect full_name(people) from people
?Nein, dies wird derzeit (ab Postgres 9.6) nicht unterstützt.
Die einzige Problemumgehung besteht darin, einen Trigger oder eine Ansicht zu verwenden, wenn es sich um eine einfache Berechnung handelt, die Sie nicht indizieren müssen.
quelle
Ja:
GENERATED ALWAYS AS … STORED
Postgres 12 fügt die Funktionalität für generierte Spalten hinzu, wie im SQL: 2003- Standard erwähnt.
Der Wert wird zum Zeitpunkt eines
INSERT
oder generiertUPDATE
und dann wie jeder andere Wert in der Zeile gespeichert.Ein generiertes muss auf einer Basisspalte derselben Tabelle oder auf einer unveränderlichen Funktion basieren .
Die Syntax ist einfach, eine Klausel über
CREATE TABLE
:Beispiel:
Eigenschaften:
Vorsichtsmaßnahmen:
Sehen:
quelle
Abhängig von Ihrem Anwendungsfall können Sie ein solches Verhalten erzielen, indem Sie eine neue Spalte deklarieren und beim Einfügen / Aktualisieren einen Auslöser hinzufügen.
Ich würde die obigen Antworten nach Möglichkeit verwenden, um zu vermeiden, dass Daten dupliziert werden, die aus Ihren bereits vorhandenen Daten abgeleitet werden könnten, aber dies reicht aus und könnte für rechenintensive abgeleitete Felder nützlich sein, die Sie einmal berechnen und speichern möchten.
Ich habe diesen Ansatz in Betracht gezogen, um ein Problem zu lösen, bei dem ich manchmal nur 15 Ziffern eines 18-stelligen Schlüssels hatte (die letzten 3 Ziffern sind nur eine Prüfsumme), aber in der Lage sein wollte, eine Fremdschlüsselbeziehung durchzusetzen.
PG-Dokumente zu Triggern: https://www.postgresql.org/docs/9.6/sql-createtrigger.html
W3-Beispiel: https://www.w3resource.com/PostgreSQL/postgresql-triggers.php
quelle