上一篇文章主要介绍了 NOT NULL、DEFAULT、CHECK、UNIQUE、Primary Key、引用完整性等大家日常数据库开发中常用的约束类型,下面主要介绍下 DB2独特的 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.
说明 :
对于引用完整性约束,如果未强制实施该约束,那么可进一步指定能否信任该约束。未强制实施并且不可信的约束又称为统计引用完整性约束。可指定是否要将引用完整性约束或检查约束用于查询优化。
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 条评论