Czy PostgreSQL obsługuje generowane kolumny ? Znane również jako wirtualne kolumny . Ja nie mówić o IDENTITY
kolumnach .
Nie mogę znaleźć żadnych informacji na temat tej niezwykłej funkcji, ale wiem, że jest ona dostępna na SQL Server oraz w najnowszych wersjach MariaDB i MySQL.
Ta funkcja jest wspomniana w standardzie SQL: 2003 , a na forach PostgreSQL była dyskusja około 2006 roku, ale nie mogę znaleźć nic istotnego w tej sprawie.
Trwa dyskusja na temat SO, ale jest już dość stara, więc może być nieaktualna.
postgresql
computed-column
Manngo
źródło
źródło
Odpowiedzi:
Nie jestem pewien, czy tego właśnie chcesz, ale notacja atrybutu
row.full_name
i notacja funkcjifull_name(row)
są równoważne w postgresql.Oznacza to, że weźmiesz stolik
i funkcja:
i nazwij to tak:
Czy tego potrzebujesz?
Aby przyspieszyć, możesz utworzyć indeks wyrażeń:
Lub przechowuj wszystko w zmaterializowanym widoku.
Przykład wzięty stąd: http://bernardoamc.github.io/sql/2015/05/11/postgres-virtual-columns/
źródło
select people.full_name from people
lubselect full_name(people) from people
?Nie, obecnie nie jest to obsługiwane (od Postgres 9.6).
Jedynym obejściem jest użycie wyzwalacza lub widoku, jeśli jest to proste obliczenie, którego nie trzeba indeksować.
źródło
Tak:
GENERATED ALWAYS AS … STORED
Postgres 12 dodaje funkcjonalność dla generowanych kolumn, jak wspomniano w standardzie SQL: 2003 .
Wartość jest generowana w momencie
INSERT
lubUPDATE
, a następnie przechowywana w wierszu, jak każda inna wartość.Wygenerowany musi być oparty na kolumnie podstawowej tej samej tabeli lub na niezmiennej funkcji .
Składnia jest prosta, klauzula dotycząca
CREATE TABLE
:Przykład:
Cechy:
Ostrzeżenia:
Widzieć:
źródło
W zależności od przypadku użycia można osiągnąć takie zachowanie, deklarując nową kolumnę i wypełniając ją wyzwalaczem podczas wstawiania / aktualizacji.
Użyłbym powyższych odpowiedzi, jeśli to możliwe, aby uniknąć powielania danych, które można uzyskać z tego, co już masz, ale robi to sztuczkę i może być użyteczny w intensywnych obliczeniowo polach pochodnych, które chcesz obliczyć raz i zapisać.
Rozważyłem to podejście do rozwiązania problemu, w którym czasami miałem tylko 15 cyfr 18-cyfrowego klucza (ostatnie 3 cyfry to tylko suma kontrolna), ale chciałem móc wymusić relację klucza obcego.
Dokumenty PG dotyczące wyzwalaczy: https://www.postgresql.org/docs/9.6/sql-createtrigger.html
Przykład W3: https://www.w3resource.com/PostgreSQL/postgresql-triggers.php
źródło