Postgresql 的複合資料型態
英文是 Composite Types, 有些時候會用 Row Type 或是 Record.
定義以後,可以讓多個 Table 都使用,這對系統開發來說,善用會有不錯的效率提升.
當然遇到亂改的,也是傳播性的災難.會有災難的,時常是大家都能改,這種不嚴謹的團隊,
災難也不會是因為這種資料型態,是早晚發生的事.
先來看一些簡單的例子
create type typ_191001a as (
a integer
, b text
, c boolean
, d timestamp
, e jsonb
);
實務上,較少在複合資料型態中,再放 JSON 型態,但也不是不行.
一切應用應該是有彈性,多種選擇,擇優.
一般較常見到是使用基本型態,來組合.例如地址,可以用text
分別存放城市,里鄰,等等來組合.
為了舉例起見,我們再來建立一個.
create type typ_191001b as (
a integer
, b text
, c boolean
);
當我們建立了 type ,就可以用 ::
select (2, '測試', true)::typ_191001b;
+------------+
| row |
+------------+
| (2,測試,t) |
+------------+
大多是應用在 table 當小夥伴
create table tbl_191001 (
id int generated always as identity
, val typ_191001b
);
insert into tbl_191001 (val) values
(row(3, '不知火', false)),
(row(4, '野分', false)),
(row(5, '冬月', true));
select *
from tbl_191001;
+----+--------------+
| id | val |
+----+--------------+
| 1 | (3,不知火,f) |
| 2 | (4,野分,f) |
| 3 | (5,冬月,t) |
+----+--------------+
(3 rows)
取出裡面的成員
select (val).b
, (val).c
from tbl_191001;
+--------+---+
| b | c |
+--------+---+
| 不知火 | f |
| 野分 | f |
| 冬月 | t |
+--------+---+
要用 () 將 欄位名稱包住.
還可以用來當組成其他複合資料型態.
例如與 Array
select unnest(array[(5, '冬月', true)
,(3, '不知火', false)]::typ_191001b[])
+--------------+
| unnest |
+--------------+
| (5,冬月,t) |
| (3,不知火,f) |
+--------------+
select ((un.val)::typ_191001b).a
, (un.val).b
, (un.val).c
from (select unnest(array[(5, '冬月', true)
,(3, '不知火', false)]::typ_191001b[]) as val) un;
+---+--------+---+
| a | b | c |
+---+--------+---+
| 5 | 冬月 | t |
| 3 | 不知火 | f |
+---+--------+---+
(2 rows)
複合型態是 Postgresql 一個很不錯的特色,使用原生資料型態組合,在儲存空間以及存取速度
都有不錯的效率.可以視情況導入使用.