PostgreSQL 用户自定义类型教程
本文将讨论如何在 PostgreSQL 中如何使用用户自定义类型。
PostgreSQL 允许您使用 CREATE DOMAIN 和 CREATE TYPE 语句创建用户定义数据类型。
- 使用
CREATE DOMAIN您能基于已有的类型创建一个子类型,并可以为其添加一些约束,目前支持 3 中约束:NULL,NOT NULL,CHECK。 - 使用
CREATE TYPE您能创建复合类型,枚举类型,或RANGE类型。
PostgreSQL CREATE DOMAIN 语法
PostgreSQL CREATE DOMAIN 语句用于创建一个域。 域是具有可选约束的数据类型。
要基于一个现有的数据类型创建一个域,请按照如下语法使用 CREATE DOMAIN 语句:
CREATE DOMAIN name [ AS ] data_type
[ COLLATE collation ]
[ DEFAULT expression ]
[ { NOT NULL | NULL | CHECK (expression) } ]
解释:
name-
要创建的域(子类型)的名称。
data_type-
域的基础数据类型。
collation-
域的排序规则,它是可选的。
DEFAULT expression-
使用此数据类型的列的默认值。
CHECK (expression)-
使用此数据类型的列的
CHECK约束。
比如,要创建一个默认值为空字符串且不能为 NULL 的 TEXT 类型 not_null_text,请使用以下语句:
CREATE DOMAIN not_null_text
AS TEXT
DEFAULT '';
下面的 CREATE TABLE 语句使用此 not_null_text 类型:
CREATE TABLE test_domain (
col1 not_null_text,
col2 not_null_text
);
PostgreSQL CREATE TYPE
PostgreSQL CREATE TYPE 语句用于创建一个复合类型,枚举类型,或 RANGE 类型。
语法
以下语法使用 CREATE DOMAIN 语句用于创建一个复合类型:
CREATE TYPE name AS (
field_name1 data_type
[, field_name2 data_type, ...]
);
以下语法使用 CREATE DOMAIN 语句用于创建一个枚举类型:
CREATE TYPE name AS ENUM (
label_1
[, label_2, ... ]
);
以下语法使用 CREATE DOMAIN 语句用于创建一个 RANGE 类型:
CREATE TYPE name AS RANGE (
SUBTYPE = subtype
[ , SUBTYPE_OPCLASS = subtype_operator_class ]
[ , COLLATION = collation ]
[ , CANONICAL = canonical_function ]
[ , SUBTYPE_DIFF = subtype_diff_function ]
[ , MULTIRANGE_TYPE_NAME = multirange_type_name ]
);
创建复合类型实例
使用下面的语句创建一个自定义类型:
CREATE TYPE address as (country TEXT, city TEXT);
上面的语句创建了一个名字为 address 自定义类型,它有两个字段: country 和 city 字段,他们都是 TEXT 类型。
下面的语句将一个复杂的 JSON 对象转为 SQL 行:
SELECT
*
FROM
json_to_record(
'{"name": "Tom", "age": 20, "address": {"country": "CN", "city": "BeiJing"}}'
) AS x(name TEXT, age INT, address address);
name | age | address
------+-----+--------------
Tom | 20 | (CN,BeiJing)
(1 row)创建枚举类型实例
使用 CREATE TYPE 语句创建一个枚举类型 my_color:
CREATE TYPE my_color AS ENUM (
'yellow',
'red',
'blue',
'green',
'white',
'black'
);
使用 PostgreSQL enum_first() 函数返回 my_color 中的第一个枚举值:
SELECT enum_first(null::my_color);
enum_first
------------
yellow使用 PostgreSQL enum_last() 函数返回 my_color 中的最后一个枚举值:
SELECT enum_last(null::my_color);
enum_last
-----------
black结论
PostgreSQL 允许您使用 CREATE DOMAIN 和 CREATE TYPE 语句创建用户定义数据类型。
使用 CREATE DOMAIN 您能基于已有的类型创建一个子类型,并可以为其添加 NULL, NOT NULL, 或 CHECK 约束。
使用 CREATE TYPE 您能创建复合类型,枚举类型,或 RANGE 类型。