使用 CREATE DISTINCT TYPE 语句创建新的 distinct 数据类型。
该语句是 SQL ANSI/ISO 标准的扩展。
语法
用法
Distinct 类型是基于内置数据类型或现有不透明数据类型,指定的 ROW 数据类型或者其它 Distinct
数据类型的数据类型。Distinct 数据类型是强归类的。虽然 Distinct 类型与其源类型对数据有相同的
物理表示法,但两种类型的值在没有从一种类型到另一种类型的显式强制转型的情况下无法进行比
较。
要创建 Distinct 数据类型,您必须拥有数据库上的 Resource 权限。任何拥有 Resource 权限的
用户均可从内置数据类型之一创建 Distinct 类型,而该用户是用户 gbasedbt 所拥有的。
重要: 不能在 SERIAL 、BIGSERIAL 或 SERIAL8 数据类型上创建 Distinct 类型。
要从不透明类型、指定的 ROW 类型或另一 Distinct 类型创建 Distinct 类型,您必须是该数据类型
的所有者或在该数据类型上拥有 Usage 权限。
缺省情况下,一旦定义了 Distinct 类型,之一该 Distinct 类型的所有者和 DBA 可以使用它。然而,
Distinct 类型的所有者可向其他用户授权对该 Distinct 类型的 Usage 权限。
Distinct 类型与其源类型有相同的存储结构。以下语句创建了基于内置 DATE 数据类型的 Distinct
类型 birthday:
CREATE DISTINCT TYPE birthday AS DATE;
虽然 GBase 8s 使用对 Distinct 类型以及它的源类型使用相同的存储格式,但 Distinct 类型与其源
类型不能在一个操作中进行比较,除非一个类型显式强制转型到另一个类型。
如果您包含了 IF NOT EXISTS 关键字,当指定名称的 Distinct 数据类型已经在当前数据库中注册
过时,则数据库服务器不采取任何操作(而不是向应用程序发送异常)。
对 Distinct 类型的权限
要创建 Distinct 类型,您必须拥有该数据库上的 Resource 权限。当创建 Distinct 类型时,只有您,
即所有者对此类型拥有 Usage 权限。使用 GRANT 或 REVOKE 语句向其它数据库用户授权或调
用 Usage 权限。
要找出特定类型上存在哪些特权,请在 sysxtdtypes 系统目录表中检查所有者名称,并在
sysxtdtypeauth 系统目录表中检查可能已经授予的其它数据类型特权。有关系统目录表的更多信息,
请参阅 《GBase 8s SQL 指南:参考》 。
DB-Access 实用程序也可显示对 Distinct 类型的特权。
支持函数和强制转型
当您创建 Distinct 类型时, GBase 8s 自动定义两种显式强制转型:
从 Distinct 类型到其源类型的强制转型
从源类型到 Distinct 类型的强制转型
因为这两个数据类型具有相同的表示法(相同的长度和对齐方式),所以实现这些强制转型不需要
支持函数。
您可在 Distinct 类型与其源类型之间创建隐式强制转型。要创建隐式强制转型,请使用 Table
Options 子句来指定外部数据的格式。然而,您必须首先删除 Distinct 类型与其源类型之间的缺省显
式强制转型。
在源类型上定义的所有支持函数的强制转型可用于 Distinct 类型。然而,对 Distinct 类型定义的强
制转型和支持函数对源类型不可用。请使用 Table Options 子句指定外部数据的格式。
操纵 Distinct 类型
当将 Distinct 类型与其源类型进行比较或操纵它们的数据时,在以下情况中您必须显式地将一种类
型强制转型为其它类型:
使用其它类型的值插入或更改一种类型的列
使用关系运算符来加、减、乘、除、比较或以其它方式操纵两个值,一个源类型的值和一个
Distinct 类型的值
例如,假设您创建了 Distinct 类型 dist_type ,它基于 NUMERIC 数据类型。然后您创建了带有
两列的表,一个属于 dist_type 类型,一个属于 NUMERIC 类型。
CREATE DISTINCT TYPE dist_type AS NUMERIC;
CREATE TABLE t(col1 dist_type, col2 NUMERIC);
要直接将 Distinct 类型与其源类型进行比较或者将源类型的值分配到 Distinct 类型的列上,您必须
将一种类型强制转型到其它类型,如以下示例所示:
INSERT INTO tab (col1) VALUES (3.5::dist_type);
SELECT col1, col2
FROM t WHERE (col1::NUMERIC) > col2;
SELECT col1, col2, (col1 + col2::dist_type) sum_col
FROM tab;
有关在本地数据库外的表内存取 DISTINCT 数据类型的查询和其它分布 DML 操作的信息,请参阅
分布式操作中的 DISTINCT 类型 。