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标准。
在lightdb中,sys_refcursor当前的实现是通过domain的形式实现,具体因为对应到类型,所以存放在pg_type表中,在包中用sys_refcursor定义的变量会从pg_type表中检验类型是否存在。
包中自定义类型,也就是subtype,语法底层逻辑还是domain的逻辑,但是create domain接口调用不到这个节点,需要在包中对domain节点进行解析,包中使用这个定义的类型,逻辑与domain创建的类型下相同。具体代码实现如下:
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://flylib.com/books/en/2.290.1/expression_evaluation_and_type_conversion.html