atpeace331
作者atpeace3312020-09-16 15:59
数据库管理员, 银行

DB2 业务规则的应用实践(2)

字数 3087阅读 2483评论 0赞 2

上一篇文章主要介绍了 NOT NULL、DEFAULT、CHECK、UNIQUE、Primary Key、引用完整性等大家日常数据库开发中常用的约束类型,下面主要介绍下 DB2独特的 NOT ENFORCED 信息约束。

NOT ENFORCED 信息约束

信息约束是一种约束属性, SQL 编译器可使用它来改善对数据的访问 。信息约束 不是由数据库管理器 强制执行的,并且不用于数据的附加验证;它们用来提高 SQL查询性能。

在 INSERT 和 UPDATE 操作期间,定义许多约束可能 需要大量的系统资源来强制执行这些约束。如果应用程序被编码进行数据验证,则创建 NOT ENFORCED 信息约束可能比创建其他约束更加有效。 NOT ENFORCED 信息约束不会在数据 INSERT 或 UPDATE 操作期间强制执行该约束, 但是,DB2优化器在考虑解析查询的最佳访问路径时,将评估 NOT ENFORCED 信息约束提供的信息。

在表创建过程中,可以使用 CREATE TABLE 语句定义 NOT ENFORCED 信息约束,也可以使用ALTER TABLE 语句将其添加到现有表中如下:

 -- Table Creation Process
 CREATE TABLE employee (
     empid INTEGER,
     name VARCHAR(30),
     ssn VARCHAR(11),
     salary INTEGER CHECK (salary >= 5000)
 NOT ENFORCED
ENABLE QUERY OPTIMIZATION );

 -- Table Attribute Modification Process
 ALTER TABLE demo.employee ADD CONSTRAINT check_Sal_employee
 CHECK (SALARY >= 5000)
 NOT ENFORCED
 E NABLE QUERY OPTIMIZATION;

重要的是了解 DB2优化器如何在执行 SELECT操作时评估 NOT ENFORCED 信息约束, 因为有些查询可能不会返回已经插入到表中的记录。DB2优化器允许您插入一个违反 CHECK约束的值,如下所示:

 INSERT INTO demo.employee VALUES (006, 'Jones, Jay', '999-99-9999', 4900);
 DB20000I The SQL command completed successfully.

但是,当您尝试使用带有违反约束的 CHECK 约束的相等谓词来选择数据时,DB2将不会返回结果,即使它存在于在表中。 例如,由于 NOT ENFORCED CHECK约束 CHECK_SAL_EMPLOYEE ,将不会返回以下内容:

 SELECT * FROM demo.employee WHERE salary=4900;

 EMPID NAME SSN SALARY
 ----------- ------------------------------ ----------- -------
 0 record(s) selected.
 

说明 :

  1. CHECK 约束本身在列组织的表中不受支持,但是当用 NOT ENFORCED子句定义 CHECK约束时就支持它。
  2. 对于 PK 约束、UNIQUE约束 和 CHECK约束,可进一步指定是否可信任该约束。
  3. 对于引用完整性约束,如果未强制实施该约束,那么可进一步指定能否信任该约束。未强制实施并且不可信的约束又称为统计引用完整性约束。可指定是否要将引用完整性约束或检查约束用于查询优化。

    NOT ENFORCED 约束也可以与主键约束一起使用,并且在行组织表和列组织表中都支持。以下列出的示例显示了 PRIMARY KEY NOT ENFORCED的行为:

 CREATE TABLE demo.employee (
     id INTEGER NOT NULL,
     name VARCHAR(20),
     location VARCHAR(10),
     create_date TIMESTAMP );

 ALTER TABLE demo.employee ADD  PRIMARY KEY (id) NOT ENFORCED;

 INSERT into demo.employee values ( 1 ,'Tom', 'Dallas', CURRENT_TIMESTAMP);

 INSERT into demo.employee values (2,'Trey', 'Fort Worth', CURRENT_TIMESTAMP);

 INSERT into demo.employee values (3,'Greg', 'Plano', CURRENT_TIMESTAMP);

 INSERT into demo.employee values ( 1 ,'Charles', 'Houston', CURRENT_TIMESTAMP);

 SELECT * FROM demo.employee;

 ID NAME LOCATION CREATE_DATE
 ----------- ---------- ---------- --------------------------
 1 Tom Dallas 2017-11-11-01.26.39.612916
 2 Trey Fort Worth 2017-11-11-01.26.49.789062
 3 Greg Plano 2017-11-11-01.26.57.690662
 1 Charles Houston 2017-11-11-01.27.07.215106

 4 record(s) selected.

当您使用 PRIMARY KEY NOT ENFORCED 定义列时, 它将允许将重复的值插入到列中。 当您通过列组织表中的主键列谓词执行 SELECT 时,它将返回首先插入的行 。 另一方面,在 行组织表中 SELECT 将返回所有匹配的记录:

 -- Column Organized Table Behavior

SELECT * FROM demo.employee WHERE id=1;

 ID NAME LOCATION CREATE_DATE
 ----------- -------------------- ---------- ------------------
 1 Tom Dallas 2017-11-11-01.29.22.201775

 1 record(s) selected.

 -- Row Organized Table Behavior
 ID NAME LOCATION CREATE_DATE
 ----------- ------------------- ---------- ------------------
 1 Tom Dallas 2017-11-11-01.26.39.612916
 1 Charles Houston 2017-11-11-01.27.07.215106

 2 record(s) selected.

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广