一个 domain
(有时称为“派生类型”)是基于现有数据类型用户定义的数据类型,通常用于提供检查约束的通用定义,该定义可用于多个表定义。
注意事项
与常规约束不同,虽然将列转换为域类型或插入列时会检查应用于域的任何约束,但如果修改了域定义,则不会追溯检查这些约束。
psql 命令
\dD[S+]
列出域
更改历史记录
- PostgreSQL 9.1
- 添加了排序规则支持(提交 414c5a2e)
- PostgreSQL 7.4
ALTER DOMAIN
命令已添加(提交 17194f41)- 添加了对
CHECK
表达式的支持(提交 6b603e67)
- PostgreSQL 7.3
- 已添加(提交 01c76f74)
示例
创建域
postgres=# CREATE DOMAIN git_sha1 AS CHAR(40) NOT NULL CHECK (VALUE ~ '^[0-9a-fA-F]+$'); CREATE DOMAIN
顾名思义,这定义了一个适合存储 GIT sha1
标签的域。
列出可用的域
postgres=# \dD List of domains Schema | Name | Type | Collation | Nullable | Default | Check --------+----------+---------------+-----------+----------+---------+---------------------------------------- public | git_sha1 | character(40) | | not null | | CHECK (VALUE ~ '^[0-9a-fA-F]+$'::text) (1 row)
使用域创建表
postgres=# CREATE TABLE object_commit_ref ( repo TEXT NOT NULL, commit_ref GIT_SHA1, PRIMARY KEY(repo, commit_ref) ); CREATE TABLE
插入有效数据
postgres=# INSERT INTO repo_commit_ref VALUES('postgresql', 'd31084e9d1118b25fd16580d9d8c2924b5740dff'); INSERT 0 1
尝试插入无效数据
postgres=# INSERT INTO object_commit_ref VALUES('foo', NULL); ERROR: domain git_sha1 does not allow null values postgres=# INSERT INTO object_commit_ref VALUES('bar', 'baz'); ERROR: value for domain git_sha1 violates check constraint "git_sha1_check"
参考文献
- PostgreSQL 文档: 域类型
- PostgreSQL 文档: CREATE DOMAIN (参见“注释”部分)