Navicat 博客

在 Navicat 17 中扩展 PostgreSQL 数据类型 - 第二部分 2025 年 1 月 3 日,由 Robert Gravelle 撰写

复合类型

欢迎来到,使用 Navicat Premium 17 在 PostgreSQL 创建自定义数据类型系列的第二部分。 在 第 1 部分 ,我们学习了如何为免费的 DVD Rental database 创建自定义域。域是一个用户定义的包含 NOT NULL 和 CHECK 等约束的数据类型。在今天的博客中,我们将创建一个复合类型,以便从用户定义的函数中返回复杂数据。

PostgreSQL 类型定义

类型是通过 CREATE TYPE 命令生成的。它创建的复合类型可在存储过程和函数中用作输入参数和返回值的数据类型。

PostgreSQL 的 CREATE TYPE 支持四种基本类型:

  • 复合类型:定义复合数据,将两种或多种数据类型结合在一起,从而创建复杂的多字段数据类型,以表示复杂的数据结构。
  • 枚举类型:定义一组固定的预定义命名值,只允许输入这些特定选项。
  • 范围类型:表示数值之间的连续间隔,可对日期或数字等连续数据范围进行复杂操作。
  • 基本类型:用户自定义类型可根据现有的基本类型(如 int、varchar 或 numeric)创建。 虽然用户定义的类型没有特定的“基本类型”,但新类型本质上是对 PostgreSQL 基本类型的扩展或约束。

在接下来的几节中,我们将通过创建一个类型并在函数中使用它来更详细地探索复合类型。

CREATE TYPE 语句

所有类型都是通过 CREATE TYPE 语句创建的。比方说,我们想用一个函数来返回关于一部电影的几个值,如电影 ID、片名和发行年份。下面是创建名为“film_summary”的类型的语句:

CREATE TYPE film_summary AS (
    film_id INT4,
    title VARCHAR(255),
    release_year CHAR(4)
);

在 Navicat 17 中创建类型

Navicat Premium 17Navicat for PostgreSQL 17 都提供了一个基于图形用户界面的工具来生成类型,而无需了解所有确切的语法。你可以在主工具栏的“其他”下找到它:

type_menu_command (33K)

接下来,我们点击“对象”工具栏中“新建类型”项目旁边的箭头。这时会出现创建类型的四个不同选项。从弹出的菜单中选择“复合”项:

composite_menu_item (16K)

这将弹出一个网格,我们可以在其中输入字段的详细信息。由此可见,构成“film_summary”类型的三个字段已经存在,我们可以在表设计器中调出“film”表,并从其中复制类型和长度数据。下面是用 红色 突出显示的三个字段:

fields_in_table_designer (85K)

网格中的第一个字段已经有了一个空行,输入详细信息后,我们可以点击“添加成员”来添加新行。下面是已完成的网格:

composite_type_fields (30K)

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

sql_preview_tab (22K)

请注意,由于我们尚未保存定义,所以类型名称是“无标题”。这是意料之中的。

现在我们来指定名称。单击“保存”按钮会弹出“保存为”对话框,我们可以在此为我们的类型命名为“film_summary”:

save_as_dialog (31K)

在函数中使用 film_summary 类型

现在开始使用“film_summary”作为函数返回类型。与创建类型一样,我们将使用 Navicat 的图形用户界面工具来创建。若要访问函数设计器,请单击主工具栏上的“函数”按钮,然后单击 “对象”工具栏上的“新建函数”:

function_buttons (23K)

编辑器会为我们预填充 CREATE FUNCTION 的大部分语法;我们只需提供一些细节,如函数名、输入参数、返回类型和函数体。下面是完整的 CREATE FUNCTION 语句:

CREATE FUNCTION get_film_summary (f_id INT4)
  RETURNS film_summary
AS $BODY$
  SELECT 
    film_id,
    title,
    release_year
  FROM
    film
  WHERE
    film_id = f_id;
$BODY$
  LANGUAGE SQL VOLATILE;
get_film_summary_function_definition (40K)

同时确保将语言设置为“SQL”。

点击“保存”按钮后,我们的函数就可以使用了。点击“执行”按钮是试用函数最快捷、最简单的方法。这时会弹出一个提示,要求我们为参数“f_id”提供一个值:

input_parameter_prompt (35K)

结果将显示在新的“结果”选项卡中:

function_results (28K)

结语

在今天的博客中,我们使用 Navicat Premium 17 的类型工具创建了一个复合类型,并设计了一个返回该复合类型的函数。第 3 部分将继续介绍枚举类型。

Navicat 文章
频道条目
分享
文章归档