Skip to main content

PostgreSQL 12 Yenilikleri: Generated Columns

Merhaba,

Bu yılın sonuna doğru PostgreSQL 12'nin yayınlanması bekleniyor. Yeni özelliklerin eklenmesi yanı sıra, mevcut özellikler üzerinde değişiklikler de yapıldı. Yeni gelen özelliklerden biri "Generated Columns" yapısı. PostgreSQL 12 ile gelen yeniliklerden bahsettiğim sunumuma buradan ulaşabilirsiniz.

Generated Columns, tabloda yer alan diğer sütunların kullanılmasıyla meydana gelen sütunlardır. Bunun iki çeşidi vardır: Stored ve Virtual. Stored olan sütunun yeni değerini hesaplar ve tabloya yeni veriyi yazar. Virtual is bir view gibi davranır. ilgili sütun her kullanıldığında değeri yeniden hesaplanır. Postgres bunlardan Stored olanını kullanır. 
Dikkat edilmesi gereken bir kaç konu var:
  • INSERT/UPDATE komutları Generated Column için kullanılamaz.
  • Generated Column Partition Key olamaz.
  • Generated Column başka bir Generated Column kullanılarak oluşturulamaz.
Standart SQL ve PostgreSQL'de olduğu gibi sıradan bir tablo oluşturalım. 

test=# CREATE TABLE gc_test (c1 int, c2 int);
CREATE TABLE

test=# INSERT INTO gc_test SELECT GENERATE_SERIES(1,5), GENERATE_SERIES(1,3);
INSERT 0 5

test=# SELECT * FROM gc_test;
 c1 | c2
----+----
  1 |  1
  2 |  2
  3 |  3
  4 | 
  5 | 
(5 rows)

Bu tabloyu Generated Column ile oluşturalım.

test=# DROP TABLE gc_test;
DROP TABLE


test=# CREATE TABLE gc_test (c1 int, c2 int, c3 int GENERATED ALWAYS AS (c1+c2) STORED);
CREATE TABLE


test=# INSERT INTO gc_test SELECT GENERATE_SERIES(1,5), GENERATE_SERIES(1,3);
INSERT 0 5


test=# SELECT * FROM gc_test ;
 c1 | c2 | c3
----+----+----
  1 |  1 |  2
  2 |  2 |  4
  3 |  3 |  6
  4 |    |  
  5 |    |  
(5 rows)

c3 sütunu c1 ve c2 sütunlarının toplamından oluşuyor ve her satır INSERT edildiğinde aynı zamanda veritabanına bu değer yazılıyor.
Bir Generated Column'a sahip bu tablonun yapısına bakalım. Default değeri c1+c2 olarak görünüyor. 
 
test=# \d gc_test
                             Table "public.gc_test"
 Column |  Type   | Collation | Nullable |               Default              
--------+---------+-----------+----------+--------------------------------------
 c1     | integer |           |          |
 c2     | integer |           |          |
 c3     | integer |           |          | generated always as (c1 + c2) stored

Bir Generated Column'un DEFAULT değerini farklı bir DEFAULT değer ile değiştiremezsiniz.

test=# ALTER TABLE gc_test ALTER COLUMN c3 SET DEFAULT 5;
psql: ERROR:  column "c3" of relation "gc_test" is a generated column

Generated Column'un mevcut DEFAULT değeri bulunmakta. Bu özel sütunlar farklı bir değer ile UPDATE edilemez. 

test=# UPDATE gc_test SET c3=1 where c1=1;
psql: ERROR:  column "c3" can only be updated to DEFAULT
DETAIL:  Column "c3" is a generated column.

Generated Column'u kendisine atanmış DEFAULT değeri ile güncelleyebilirsiniz.

test=# UPDATE gc_test SET c3=DEFAULT where c1=1;
UPDATE 1

Bir tabloya Generated Column eklendiğinde o sütunun yeni değerinin hesaplanması için baştan sona güncellenir. Bu aynı zamanda bir tabloya DEFAULT değeri olan bir sütun eklemek ile aynı işlemi yapar. Dikkat etmek gerekir.

test=# ALTER TABLE gc_test ADD COLUMN c4 text GENERATED ALWAYS AS (c1::text || c2::text) STORED;
ALTER TABLE


test=# \d gc_test
                                   Table "public.gc_test"
 Column |  Type   | Collation | Nullable |                      Default                    
--------+---------+-----------+----------+---------------------------------------------------
 c1     | integer |           |          |
 c2     | integer |           |          |
 c3     | integer |           |          | generated always as (c1 + c2) stored
 c4     | text    |           |          | generated always as (c1::text || c2::text) stored

test=# SELECT * FROM gc_test ;
 c1 | c2 | c3 | c4
----+----+----+----
  2 |  2 |  4 | 22
  3 |  3 |  6 | 33
  4 |    |    |
  5 |    |    |
  1 |  1 |  2 | 11
(5 rows)

Sevgiler

Comments

Popular posts from this blog

PGConf Europe 2018 Güncesi 1

Merhaba, Diğer tüm veritabanları arasında en popüler açık kaynak kodlu veritabanı olan PostgreSQL, tüm yıl boyunca farklı ülkelerde bir çok konferansa sahiplik yapmaktadır. En bilinenleri PGDay ve PGConf'dur. Ayrıca her yıl 2 Şubatta Brüksel’de yapılan FOSDEM etkinliğinde de PostgreSQL konuşmalarının yapıldığı bir oturum mutlaka olmaktadır. PostgreSQL etkinlik detaylarına bu linkten ulaşabilirsiniz. Bu yıl ki PGConf Europe konferansı Lizbon'da yapıldı. Konferansla ilgili izlenimlerimi, yaptığım neredeyse 6 günlük yolculuğun en başından tüm detaylarıyla birlikte paylaşmak istiyorum. Yolculuğumuz sevgili Seda ile birlikte Atatürk Havalimanı’ndan sabah 07:30’da Lizbon’a direk uçuşla başladı.  Hava şahaneydi ve uçuşumuz konforlu geçti. Koltuğumuz cam kenarı ve uçağın kanadının hemen yanındaydı (benim favori koltuklarım 24, 25, 26, 27 ve 28. sıradakiler) ve biz 27. sıradaydık. Bol bol resim çektik bulutların üstündeyken ve uçak kanatlı olanlardan.  Lizbon’a vardığımı...

PostgreSQL High Availability - Patroni 2

Patroni kurulumuyla ilgili oldukça fazla kaynak bulunmakta fakat kurulum ve yönetimini beraber barındıran kaynağa denk gelmedim. Bu yazıda hem Patroni kurulumu hem de kurulum sonrası yönetimiyle alakalı detaylara ulaşabilirsiniz. PostgreSQL cluster'larının yönetimi için kullanılan Patroni ile ilgili temel bilgilerin yer aldığı Autofailover üzerine hazırladığım yazı serisine aşağıdaki linklerden erişebilirsiniz. PostgreSQL ve Autofailover PostgreSQL'de Autofailover ve Patroni 1 (Giriş) PostgreSQL'de Autofailover ve Patroni 2 (Kurulum, Konfigürasyon ve Yönetim) PostgreSQL'de Autofailover ve Patroni 3 (Mevcut PostgreSQL Cluster'inin Patroni'ye Geçirilmesi) Patroni, PostgreSQL veritabanlarının kurulumundan ve konfigürasyonundan sorumludur. Yani Patroni'yi kurduğumuz sunucular aynı zamanda Patroni ile kurulmuş PostgreSQL'leri barındıracak. Üç node'lu PostgreSQL ve üç node'lu ETCD cluster'larını oluşturacağım. Kuruluma önce üç no...

Collapsible Group Box in Peoplesoft Pages

Hello, With using collapsible Group boxes you can minimize all fields and free up space in your pages. If your page has lots of field and you can make it understandable. Before use it, you should decide to where you want to use Collapsible Group Boxes. In your page; Add a new group box which include your fields that you want to hide or show all of them. Double click head of group box and open Group Box Properties. Give a name for group box's label in Label tab.