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://flylib.com/books/en/2.290.1/expression_evaluation_and_type_conversion.html
在内部语法解析进行类型兼容性判断和转换时,domain会被扁平化处理为基类型+约束,所以也可以认为是一个语法糖特性,为了满足SQL标准实现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!