范围类型

PostgreSQL 是市场上最灵活的数据库之一,这已不是什么秘密。事实上,PostgreSQL 的可扩展性和丰富的功能集使 PostgreSQL 近期已超越 MySQL,成为最受开发人员推崇和最受欢迎的数据库系统。在这个使用 Navicat Premium 17 PostgreSQL 创建自定义数据类型的系列中,我们已经探索了一些选项,包括自定义域、复合类型和枚举类型。本周博客的主题是范围类型,当你需要处理连续区间或数值范围时,范围类型特别有用。


范围类型的简要说明


PostgreSQL 中的范围类型提供了一种处理连续区间值的方法。因此,一个范围可以包括 10 美元到 20 美元之间的所有产品价格。通过这些范围,你可以处理在其范围内的任何值,从而轻松检查计划冲突或价格匹配等问题。在数据库中,如果需要处理连续的时间跨度、数字区间或任何其他连续数据,范围尤其有用。


例如,在一家电影院的数据库中,你可以使用范围来表示放映时间,确保没有两部电影在同一影院重映。或者,在酒店预订系统中,范围可以跟踪客房空房日期,方便检查空房冲突。范围类型特别有用,因为PostgreSQL可以处理所有比较和操作这些区间的复杂逻辑,提供内置操作来检查范围之间的重叠、包含和交叉。


定义电影放映时间范围


在考虑自定义范围类型之前,我们应该确认下 PostgreSQL 的内置范围类型是否能实现我们的目标。这些类型包括:

int4range:整数范围

int8rangebigint 的范围

numrange:数字范围

tsrange: 不含时区的时间戳范围

tstzrange:包含时区的时间戳范围

daterange:日期范围

虽然 DVD Rental 数据库中的电影放映时间是以整数形式存储的,但当我们有特定的业务需求而内置类型又无法满足时,创建我们自己的范围类型还是很有意义的。例如,如果我们要跟踪具有特殊验证规则的影片放映时间范围:


 


Navicat 17 中创建范围类型

定义自定义类型的更简单方法是使用 Navicat 基于图形用户界面的工具。你可以在 Navicat Premium 17  Navicat for PostgreSQL 17 中找到它们。若要访问类型工具,只需单击主工具栏中的其他,然后从下拉菜单中选择类型



这将弹出对象窗格,我们将看到现有类型的列表。若要创建新类型,请单击对象工具栏中新建类型项旁边的箭头,然后从上下文菜单中选择范围项:



范围类型设计器有三个选项卡:常规、注释和 SQL 预览。在常规选项卡上,我们需要提供的主要信息是子类型子类型差异。我们的类型将以 int4 为基础,如下所示:



在单击保存按钮之前,我们可以通过单击“SQL 预览选项卡查看 Navicat 将生成的语句:



注意到类型名称是无标题,因为我们还没有保存定义。这是意料之中的。

点击保存按钮后,我们将看到一个另存为对话框,在此我们可以将类型命名为 “runtime_range ”



现在,我们可以像使用其他 PostgreSQL 数据类型一样使用“runtime_range”类型。例如,如果我们创建了上面例子中的“film_runtime_categories”表,我们可以从对象类型下拉菜单中选择“typical_runtime”列,将其设置为我们的自定义类型:



然后,我们就可以在检查选项卡上添加字段验证: