一个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 (参见“注释”部分)