域DOMAIN
域是关系数据库中的对象类型之一,域被当作一种特定的数据类型带有某些附加的属性而创建。一旦它被定义在数据库中,它可以重用多次定义表列,PSQL参数和PSQL局部变量。这些对象继承的所有域的属性。如果需要的话,一些属性可以重载定义在新的对象被定义时
本节介绍用于创建、 修改和删除域的语句的语法。详细的说明域和它们的用法可以在自定义数据类型中发现 — — 域。
作用:创建一个新的域
用于: DSQL, ESQL
语法:
CREATE DOMAIN name [AS]
[DEFAULT {literal | NULL | }]
[NOT NULL] [CHECK ()]
[COLLATE collation_name];
::=
{SMALLINT | INTEGER | BIGINT} []
| {FLOAT | DOUBLE PRECISION} []
| {DATE | TIME | TIMESTAMP} []
| {DECIMAL | NUMERIC} [(precision [, scale])] []
| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)]
[] [CHARACTER SET charset_name]
| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING]
[(size)] []
| BLOB [SUB_TYPE {subtype_num | subtype_name}]
[SEGMENT SIZE seglen] [CHARACTER SET charset_name]
| BLOB [(seglen [, subtype_num])]
::= [[m:]n [,[m:]n ...]]
::=
| [NOT] BETWEEN AND
| [NOT] IN ( [, ...] | )
| IS [NOT] NULL
| IS [NOT] DISTINCT FROM
| [NOT] CONTAINING
| [NOT] STARTING [WITH]
| [NOT] LIKE [ESCAPE ]
| [NOT] SIMILAR TO [ESCAPE ]
| {ALL | SOME | ANY} ()
| [NOT] EXISTS ()
| [NOT] SINGULAR ()
| ()
| NOT
| OR
| AND
::=
<> | != | ^= | ~= | = | < | > | <= | >= | !< | ^< | ~< | !> | ^> | ~>
::=
VALUE
| literal
|
|
| NULL
| NEXT VALUE FOR genname
| GEN_ID(genname, )
| CAST( AS )
| ()
| func([ [, ...]])
表 5.5. CREATE DOMAIN 语句参数
参数 | 描述 |
datatype | 数据类型的数据类型 |
literal | 文本的值与数据类型兼容 |
context_var | 任何上下文变量,其类型是兼容的数据类型 |
dom_condition | 域条件 |
collation_name | 一个同charset_name参数对应的字集的有效的排序规则名称,如果它是同数据类型一起被提供 |
array_dim | 数组维度 |
m,n | 整数定义数组维度的索引范围 |
precision | 数据类型的值可以 hold(1..18) 的有效位数总数 |
scale | 小数点 (0..precision) 后的数字位数 |
size | 字符的字符串的最大大小 |
charset_name | 一个有效的字符集的名称,如果要让域的字符集不同于数据库的默认字符集 |
subtype_num | BLOB 子类型数量 |
subtype_name | BLOB 子类助记符名称 |
seglen | 段大小 (最大 65535) |
select_one | 一个标量的 SELECT 语句 — — 选择一列并返回唯一行 |
select_list | 选择一列并返回零个或更多行的 SELECT 语句 |
select_expr | 选择一个或多个列并返回零个或更多行的 SELECT 语句 |
expression | 表达式解析为一个兼容的数据类型的值 |
genname | 序列(生成器)名称 |
func | 内部函数或 UDF |
CREATE DOMAIN语句创建一个新的域
任何SQL数据类型都可以作为域的类型
特定类型的细节
ARRAY 类型:
• 如果域是一个数组,基本的数据可以是除了 BLOB和ARRAY的任何数据类型
• 数组的维数被规定在方括号中. (在语法块中,这些括号使用黑体出现,以区别于方括号标识的可选语法元素.)
• 对于每个数组维度,一个或两个整数数字定义其索引的上下边界范围:
- 默认情况下,数组是基于 1 的。下限是隐式的和仅上限边界需要指定。一个单独的数字小于 1 定义范围num..1 。和大于 1 的数字定义范围 1..num。
-用冒号(':')分隔的两个数字 和可选的空白,第二数大比第一大,可以用于显式的定义范围。一个或两个边界可以小于零,只要在上限边界是大于下限。
• 当数组具有多个维度时,每个维度的范围定义必须用逗号分隔和可选的空白。
• 仅当数组实际上存在时下标才会被验证。这意味着没有关于无效下标的错误消息将被返回,如果选择特定元素返回无,或者如果数组字段为空。字符类型 ︰ 可以使用 CHARACTER SET子句来指定 CHAR,VARCHAR 的字符集和 BLOB (SUB_TYPE 文本) 类型。如果未指定字符集,字符集指定为创建数据库时的默认字符集。如果没有字符集指定,默认情况下,当创建一个字符域时,将应用字符集 NONE。
警告
提交字符数据存储和检索的方式使用字符集NONE。在任何数据编码可以添加到列基于此类的域,但它是不可能将此数据以一种不同的编码添加到列的。因为没有音译被执行在源和目标的编码之间,可能会导致错误。
DEFAULT 子句: 可选项DEFAULT允许为域指定一个默认值. 这值将被添加到继承此域的列,如果INSERT 语句执行时,在 DML 语句中没有为它指定值。局部变量和参数在PSQL模块参考这个域将用默认值初始化。对于默认值,使用的兼容的文本类型或一个兼容的类型的上下文变量。
NOT NULL 约束: 基于域的NOT NULL约束的列和变量将被阻止被作为NULL写入,即,需要一个值.
警告
在创建一个域时,注意避免指定相互矛盾限制。例如,非空和默认为空是矛盾的。
CHECK 约束: 可选项CHECK 子句为域指定约束 .域的约束指定条件必须满足表的列值或变量是从域继承而来,条件必须括在括号中,条件是逻辑表达式(也称为断言)能返回布尔结果TRUE、FALSE和UNKNOWN.条件考虑是否满足断言为其返回的值为 TRUE 或"未知的值"(相当于 NULL)。如果该谓词返回 FALSE,不符合接受条件。
VALUE 关键字: 关键字VALUE在一个域中的约束替换为基于这个域的表列或 PSQL 模块中的变量。它包含的值分配给变量或表列。
VALUE可以在CHECK约束的任何地方使用。虽然它通常用于条件的左边部分.
COLLATE: 可选项 COLLATE 允许指定排序序列,如果域是基于字符串数据类型之一,包括BLOB及其文本子类.如果没有指定排序规则序列,创建域是将指定一个默认的字符集的排序序列。
任何连接数据库的用户都能创建域。
CREATE DOMAIN例子
1.创建一个域,使得它可以取的值大于1000,10,000为默认值。
CREATE DOMAIN CUSTNO AS
INTEGER DEFAULT 10000
CHECK (VALUE > 1000);
2. 创建一个域,使得它可以取的值为 'Yes'或'No',使用数据创建时的指定的默认字符集 .
CREATE DOMAIN D_BOOLEAN AS
CHAR(3) CHECK (VALUE IN ('Yes', 'No'));
3.创建一个域使用 UTF8字符集和 UNICODE_CI_AI 排序规则序列.
CREATE DOMAIN FIRSTNAME AS
VARCHAR(30) CHARACTER SET UTF8
COLLATE UNICODE_CI_AI;
4.创建一个DATE类型的域, 将不接受NULL值且使用当前的日期作为默认值.
CREATE DOMAIN D_DATE AS
DATE DEFAULT CURRENT_DATE
NOT NULL;
5. 创建一个域定义NUMERIC(18, 3)类型的2个元素作为数组,开始的数据索引是1.
CREATE DOMAIN D_POINT AS
NUMERIC(18, 3) [2];
备注
一个数组类型定义的域可以仅用来定义表列。在PL SQL模块不能使用数组域来定义局部变量。
6. 创建一个域的元素只能是在COUNTRY表中定义的国家代码。
CREATE DOMAIN D_COUNTRYCODE AS CHAR(3)
CHECK (EXISTS(SELECT * FROM COUNTRY
WHERE COUNTRYCODE = VALUE));
备注
给出的例子只显示使用断言和查询在域中的测试条件的可能性。不建议在实践中创建这种风格的域,除非查找表包含
永远不会删除的数据。
参阅: ALTER DOMAIN, DROP DOMAIN