iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 18
2
Postgresql 的 Domain 型態

先來講一下 Postgresql 的 Type System

有 Base Types, 像是 integer, text 等等.

Container Types, 包含 之前介紹過的 Array, Composite Types, 
還有之後會介紹的 range type.

再來是今天的主角,Domain Type

另外還有 Pseudo-Types , 用來宣告一些系統需要的,或是介接等.

在 Pseudo-Types 中,另外有 any開頭的,像是之前在介紹 Array 時,
查看運算子有出現的 anyarray, anyelement, 特別列為 Polymorphic Types.

接著來講今天的主角 Domain, 在看過昨天的複合資料型態,使用了 create type.
也許會有疑問,既然已經有 create type, 為何還需要 create domain?
create type 用來建立幾種 type, 一是複合資料型態, 二是 range type,
另外還有建立新的基本型態.
例如為了與 Oracle 的varchar2 相容,建立的以下的 varchar2.

CREATE TYPE miku."varchar2"
(
    INPUT = varchar2in,
    OUTPUT = varchar2out,
    RECEIVE = varchar2recv,
    SEND = varchar2send,
    TYPMOD_IN = varchar2typmodin,
    TYPMOD_OUT = varchar2typmodout,
    INTERNALLENGTH = -1,
    ALIGNMENT =  int4,
    STORAGE =  PLAIN,
    CATEGORY = 'S',
    DELIMITER = ',',
    COLLATABLE = True
);

還要先建立相關函數.

接著來看一個 Create Domain 的例子,為了與 Oracle Date 資料型態相容.
CREATE DOMAIN tdate
    AS timestamp(0) without time zone;

使用了基本資料型態 timestamp(0) without time zone

在psql 使用 \dD ,可以列出現在Database 的 自定義 Domain

List of domains
+-[ RECORD 1 ]-------------------------------+
| Schema    | miku                           |
| Name      | tdate                          |
| Type      | timestamp(0) without time zone |
| Collation |                                |
| Nullable  |                                |
| Default   |                                |
| Check     |                                |
+-----------+--------------------------------+

這樣就能很容易了解到 定義 Domain 是基於其他基本資料型態,可以定義新的 Collation , 
這樣我們就能指定 Collation 方便排序使用.
還有指定 Nullable , Default, 還有建立前面提到過的 Check 運算式.

create domain 是 ANSI SQL 標準.
有了 domain, 我們可以很方便的定義 domain specific type, 讓我們開發系統時,
有符合領域特性的 type system.

在資訊的領域中,還有 domain specific language (DSL). 有興趣可以自行查找.

接著我們來看實例

create domain md5 as
text not null
check (
    length(value) = 32
);

create table ithelp191002 (
  fname text
, checksum md5
);

insert into ithelp191002 values
('passwd', 'abcd123xxx');

ERROR:  23514: value for domain md5 violates check constraint "md5_check"
SCHEMA NAME:  miku
DATATYPE NAME:  md5
CONSTRAINT NAME:  md5_check

回報錯誤了...

insert into ithelp191002 values
('passwd', '76a2173be6393254e72ffa4d6df1030a');

這樣就正確了.

當我們建立了 domain 以後,還能做一些修改,這部分可以參考
https://www.postgresql.org/docs/current/sql-alterdomain.html

附帶提一下,在 Postgresql 的文件中,一些功能的描述,是在 ALTER 部分.


上一篇
Postgresql 的複合資料型態
下一篇
Postgresql 的 ENUM 型態
系列文
以Postgresql為主,聊聊資料庫.31

1 則留言

我要留言

立即登入留言