南大通用GBase8s 常用SQL语句(七十四)

南大通用GBase8s 常用SQL语句(七十四)

CHECK 子句

使用 CHECK 子句来指定在 INSERT 或 UPDATE 语句中为某列指定数据之前应满足的条件。

CHECK 子句

 

条件不能包含用户定义的例程。

在插入或更新期间,如果某行的检查约束等于 false ,则数据库服务器将返回错误。如果对某行进行检查约束时的值等于 NULL ,数据库服务器将不会返回错误。在某些情况下,您可能希望同时使用检查约束和 NOT NULL 约束。

使用搜索条件

定义了检查约束的搜索条件不能包含以下元素:用户定义的例程、子查询、聚集、主变量或行标识。此外,搜素条件还不能包含以下内部函数:CURRENT 、SYSDATE 、USER 、CURRENT_USER 、SITENAME 、 DBSERVERNAME 或 TODAY 。

当您在搜素条件中指定日期值时,确保为年指定了四位数,这样 DBCENTURY 环境变量就不会影响条件。当您指定了 2 位数的年份时,如果条件取决于缩写形式的年份值,则 DBCENTURY 环境变量将产生不可预料的结果。有关 DBCENTURY 的更多信息,请参阅 GBase 8s SQL 参考指南

更多情况下,数据库服务器从检查约束创建时就开始保留这些环境变量的设置。如果这些设置中的任意一个发生了更改,并且此更改将影响检查约束中对条件的求值,则对条件进行求值时将忽视新设置,使用最初的环境变量设置。

对于 BYTE 或 TEXT 列,可以检查是否有 NULL 或 not-NULL 值。该约束是 BYTE 或 TEXT 列上的唯一约束。

使用单列约束格式时的限制

当使用单列约束格式定义检查约束时,该检查约束无法依赖表中其它列的值。以下示例将创建有两列具有检查约束的 my_accounts 表,每个约束都是单列约束格式:

CREATE TABLE my_accounts (

        chk_id   SERIAL PRIMARY KEY,

        acct1    MONEY CHECK (acct1 BETWEEN 0 AND 99999),

        acct2    MONEY CHECK (acct2 BETWEEN 0 AND 99999));

acct1 acct2 都是 MONEY 数据类型的列,其值必须在 0 到 99999 之间。然而,如果您想测试 acct1 的余额是否比 acct2 多,则不能使用单列约束格式。如果要创建在多列中检查值的约束,则必须使用多列约束格式。

约束定义

使用 CREATE TABLE 的约束定义部分,是为了:

  • 为约束声明一个名称
  • 将约束设置为禁用的、启用的或过滤方式。

约束定义

 

元素

描述

限制

语法

constraint 

约束的名称

必须在索引和约束名称中是唯一的

标识符 

声明约束名称

数据库服务器将约束作为索引实现。每次使用单列或多列约束格式在列上放置数据约束,但没有声明约束名称时,数据库服务器将创建一个约束并在 sysconstraints 系统目录表中为该约束添加一行。

数据库服务器还生成一个标识符并在 sysindices 系统目录表中为不与已有约束共享索引的每个新主键、唯一或引用约束添加一行。即使为约束声明了一个名称,数据库服务器也会生成一个名称并出现 sysindices 表中。(该系统目录表还包含 sysindices 表上的视图,称为 sysindexes ,列出了复合索引的每个组件。)

如果愿意的话,您还可以为该约束指定一个有意义的名称。在数据库中的约束和索引的名称中,该名称必须是唯一的。

如果约束违例则约束名称将出现错误消息中。当您使用 ALTER TABLE 语句的 DROP CONSTRAINT 子句时可以使用该名称。

当您使用 SET Database Object Mode 语句或 SET Transaction Mode 语句更改约束方式时也可以指定约束名称以及在 DROP INDEX 语句中约束作为用用户定义名称的索引实现 。

在兼容 ANSI 的数据库中,当声明任何类型约束名称时,在数据库内所有者名称和约束名称的组合必须是唯一的。

数据库服务器生成的约束名称

如果未指定约束名称,数据库服务器将使用以下模板生成一个约束名称:

<constraint_type><tabid>_<constraintid> 

模板中,constraint_type 是字母 u 时标识唯一约束或主键约束,r 表示引用约束,c 表示检查约束,n 表示 NOT NULL 约束。模板中,tabid 和 constraintid 分别来自 systables  sysconstraints 系统目录表的 tabid 和 constrid 列的值。例如,唯一约束的约束名称可能看起来像” u111_14”前面有一个空格)。

如果生成的名称与已有的名称冲突,则数据库服务器将返回一个错误并且您必须提供一个显式的约束名称。

sysindexes(或 sysindices)中生成的索引名称具有以下格式:

[blankspace]<tabid>_<constraintid>

例如,索引名称类似于“ 111_14 “(这里是有引号显示空白的位置)。

选择约束方式选项

使用约束方式(ENABLED 、DISABLED 和 FILTERING)选项来控制 INSERT 、DELETE 、MERGE 和 UPDATE 操作中约束的行为。

对于 CREATE TABLE 语句定义的约束,这些是可选的。

方式            作用

DISABLED       不要在 INSERT 、DELETE 和 UPDATE 操作期间强制约束

ENABLED        在 INSERT 、DELETE 和 UPDATE 操作时强制使用约束。如果目标行引起约束违例,则该语句失败。该方式是缺省值。

FILTERING       如果 START VIOLATIONS 语句创建了违例表和诊断表,在 INSERT 、DELETE 和 UPDATE 操作时强制使用约束。如果目标行引起约束违例,则该语句继续进行。数据库服务器将有问题的行写到与目标关联的违例表中,并将诊断信息写到关联的诊断表中。

如果选择过滤方式,则可以指定 WITHOUT ERROR 或 WITH ERROR 选项。以下列表将说明这些 ERROR 选项。

错误选项            作用

WITH ERROR       在 INSERT 、DELETE 和 UPDATE 操作期间,如果违反过滤方式约束将返回违反完整性的错误。

WITHOUT ERROR  在 INSERT 、DELETE 和 UPDATE 操作期间,如果违反过滤方式约束将不返回违反完整性的错误。这是缺省错误选项。

注: 

要使 FILTERING WITHOUT ERROR 方式具有这些作用,您还必须使用 START VIOLATIONS TABLE 语句为定义约束的目标表启动违例表和诊断表。您可以发出这些语句

  1. 在您设置表的任何约束为过滤方式之前,
  • 或在您将约束设置成过滤方式后,但在任何用户在对表中的行执行 INSERT、DELETE 或 UPDATE 操作之前。

约束方式注册在 sysobjstate 系统目录表中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值