lightdb/postgresql domain详解

  CREATE DOMAIN创建一个新的域。域 本质上是一种带有可选约束(在允许的值集合上的限制)的数据类型。 定义一个域的用户将成为它的拥有者。把它作为类型别名用是可以的,非常适合于行业软件。

  如果给定一个模式名(例如CREATE DOMAIN myschema.mydomain ...),那么域将被创建在该指定的模式中。 否则它会被创建在当前模式中。域的名称在其模式中的类型和域之间 必须保持唯一。

  域主要被用于把字段上的常用约束抽象到一个单一的位置以便维护。例如, 几个表可能都包含电子邮件地址列,而且都要求相同的 CHECK 约束来验证 地址的语法。可以为此定义一个域,而不是在每个表上都单独设置一个约束。

  要创建一个域,你必须在其底层类型上拥有USAGE特权。

  例如:
CREATE DOMAIN us_postal_code AS TEXT
CHECK(
   VALUE ~ '^\d{5}$'
OR VALUE ~ '^\d{5}-\d{4}$'
);

CREATE TABLE us_snail_addy (
  address_id SERIAL PRIMARY KEY,
  street1 TEXT NOT NULL,
  street2 TEXT,
  street3 TEXT,
  city TEXT NOT NULL,
  postal us_postal_code NOT NULL
);

  值得一提的是:CREATE DOMAIN是SQL 92标准开始引入的语法

  在lightdb中,sys_refcursor当前的实现是通过domain的形式实现,具体因为对应到类型,所以存放在pg_type表中,在包中用sys_refcursor定义的变量会从pg_type表中检验类型是否存在。

  包(package)中自定义类型,也就是subtype,语法底层逻辑还是domain的逻辑,但是create domain接口调用不到这个节点,需要在包中对domain节点进行解析,包中仅使用这个定义的类型,逻辑与domain创建的类型下相同。自定义类型的相关DDL和使用可参考如下:

 https://begriffs.com/posts/2017-10-21-sql-domain-integrity.html

https://www.sqlines.com/sql-server-to-oracle/create_type

http://www.light-pg.com/docs/lightdb/13.3-22.2/sql-createdomain.html

https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/CREATE-TYPE-statement.html#GUID-389D603D-FBD0-452A-8414-240BBBC57034

https://flylib.com/books/en/2.290.1/expression_evaluation_and_type_conversion.html

  在内部语法解析进行类型兼容性判断和转换时,domain会被扁平化处理为基类型+约束,所以也可以认为是一个语法糖特性,为了满足SQL标准实现。

posted @ 2022-09-04 21:09  zhjh256  阅读(260)  评论(0编辑  收藏  举报