1、BoEing DB2开发规范,数据模型组,Company Logo,BoEing_DB2开发规范,Company Logo,BoEing_DB2开发规范,BoEing_DB2开发规范,BoEing_DB2开发规范,DB2 数据库控制语言,Company Logo,数据控制语言:简称DCL(Data Control Language)。主要用于对数据库操作权限的控制,包括GRANT(授权)语句和REVOKE(回收权限)语句。 主要包括对COLLECTION、DATABASE、PACKAGE、TABLE、VIEW、USER等的权限管理。GRANT privilege ON object_type
2、object_name to USER|GROUP|PUBLIC With grant option; REVOKE privilege ON object_type object_name from USER|GROUP|PUBLIC;给所有用户授予绑定(BIND)权限: GRANT BINDADD TO PUBLIC; GRANT PACKADM ON COLLECTION * TO PUBLIC; 给某个用户授予一个数据库管理员的权限: GRANT DBADM ON DATABASE xxxxxxxx TO BJAPxxx WITH GRANT OPTION;将表授权给某个用户 GRAN
3、T ALL|SELECT|UPDATE|INSERT|DELETE ON TABLE tablename TO BJAPxxx;给某一用户授予系统管理员权限: GRANT SYSADM TO BJAPxxx;,BoEing_DB2开发规范,BoEing_DB2开发规范,DB2 数据库定义语言_CREATE,Company Logo,CREATE用于创建数据库对象,主要包括:数据库(DATABASE)表空间(TABLE SPACE)表(TABLE)触发器(TRIGGER)视图(VIEW)索引(INDEX),Company Logo,ALTER语句可以用来改变现有数据库对象的一些特性,包括:数据库
4、(DATABASE)表空间(TABLE SPACE)表(TABLE)触发器(TRIGGER)视图(VIEW)索引(INDEX),DB2 数据库定义语言_ALTER,DROP语句可以删除任何CREATE语句创建的数据库对象。DROP语句将在删除数据库对象的同时也删除系统目录中关于该对象的定义。由于数据库对象之间可能存在某些依赖关系,所以删除对象可能会使有关的对象变成无效的状态。,Company Logo,DB2 数据库定义语言_DROP,Company Logo,DB2支持的数据类型,Company Logo,表创建的一个实例,CREATE TABLE EMP_INFO (EMPNO INTEG
5、ER GENERATED ALWAYS AS IDENTITY, EMP_INFOCHANGE NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP, EMP_ADDRESS VARCHAR(300), EMP_PHONENO CHAR(4), PRIMARY KEY (EMPNO),BoEing_DB2开发规范,BoEing_DB2开发规范,DB2 数据库操作语言_SELECT,Company Logo,(1)SELECT(主要用于检索表或视图数据)检索全表所有数据,如SELECT * FROM TA
6、BLE_NAME;FETCH FIRST:用于限制结果集显示的行数,如SELECT * FROM TABLE_NAME FETCH FIRST number ROWS ONLY;通过指定选择列表并用逗号分隔列名,可检索指定的列,如SELECT column_name_1,column_name_2 FROM TABLE_NAME;使用DISTINCT子句来排除结果集中重复的记录行信息,如 SELECT DISTINCT column_name FROM TABLE_NAME;使用AS子句为选择列表上的表达式或项指定一个有意义的名字,如:SELECT column_name_1,column_n
7、ame_2 AS other_name FROM TABLE_NAME;WITH UR:用于指定使用只读方式查询数据。如:SELECT * FROM TABLE_NAME WITH UR。,DB2 数据库操作语言_INSERT,Company Logo,(2)INSERT(主要用于向表或视图中添加新行) INSERT语句可以用于向表或视图中添加新行。向视图中插入一行,那么这一行也会被插入到该视图所基于的表中。可以使用VALUES子句来指定一行或多行的列数据。 如:INSERT INTO TABLE_NAME column_name_1,column_name_2 VALUES(column_v
8、alue_1,column_value_2);,DB2 数据库操作语言_UPDATE,Company Logo,(3)UPDATE(主要用于改变表或视图中的数据) UPDATE语句用于改变表或视图中的数据,用户可以改变满足WHERE子句指定条件的每一行中的一列或多列的值。如果不指定WHERE语句,则DB2会更新表或视图中的每一行数据信息。 UPDATE TABLE_NAME SET column_name_1 = value_new_1,column_name_2=value_new_2 WHERE column_name_1 = value_old_1 and column_name_2=v
9、alue_old_2,DB2 数据库操作语言_DELETE,Company Logo,(4)DELETE(主要用于从表中删除整行数据) DELETE语句用于从表中删除整行数据。用户可以删除满足WHERE子句指定条件的每一行。若不指定WHERE子句,则DB2将删除表或视图中的所有记录行。 DELETE FROM TABLE_NAME WHERE column_name=value。,DB2 数据库操作语言_WHERE,Company Logo,(5)WHERE子句(主要用于指定数据选择的范围条件) 通过WHERE子句可以指定若干选择条件或搜索条件,用来在表或视图中选择某些特定行。搜索条件由一个或
10、多个谓词组成。谓词指定了行的某种条件,它可能是TRUE或FALSE。建立搜索条件时需要注意:只对数值型数据类型应用算术运算;只在兼容数据类型间进行比较;字符型的值需要用单引号;%和_是DB2中的字符通配符,%可以代表多个字符,_代表单个字符。,DB2 数据库操作语言_ORDER BY,Company Logo,(6) ORDER BY子句(主要用于对结果集进行排序) 使用ORDER BY子句根据一列或多列中的值对结果集进行排序。ORDER BY子句中指定的列名不一定要在选择的列表中指定。可以在ORDER BY子句中指定DESC以降序排列数据结果集;若不指定或指定ASC,则是以升序排列数据结果集
11、。 【注意】 DB2 V9另外一个新的程序特性是可以使用SQL ORDER BY 加FETCH FIRST n ROWS 进行子选择和全选择。这个特性使得程序能够快速获取少量适当排序的行。 例如:如果只需要获取排序数据集中的一部分数据,则SQL语句如下: SELECT COLUMN_NAME_1,COLUMN_NAME_N FROM TABLE_NAME_1 WHERE COLUMN_NAME_3 IN (SELECT COLUMN_NAME_5 FROM TABLE_NAME_2 ORDER BY COLUMN_NAME_6 DESC FETCH FIRST 3 ROWS ONLY),DB2
12、 数据库操作语言_JOIN,Company Logo,(7)JOIN子句(主要用于对多个表的数据进行联合查询) JOIN连接是指把两个或两个以上的表中数据组合在一起进行查询。连接生成的结果集包含了多个表的列。全连接(又称笛卡儿积) 全连接是最基本的连接,但并不实用。如: SELECT * FROM TABLE_NAME_1,TABLE_NAME_2;等值连接 等值连接是最常用的一种连接方式,可连接两张或多张表。如: SELECT * FROM TABLE_NAME_1 AS A, TABLE_NAME_2 AS B WHERE A.column_name_value=B.column_name
13、_value;,DB2 数据库操作语言_JOIN,Company Logo,不等值连接 等值连接是在WHERE子句中使用等号,而不等值连接则是在WHERE子句中使用了除等号以外的其他比较运算符。如: SELECT * FROM TABLE_NAME_1 AS A,TABLE_NAME_2 AS B where A.column_name_value B.column_name_value; 内连接 内连接是只从笛卡儿积中返回满足连接条件的行。如果某一行在一个表中存在,但不在另一张表中,那么结果集中将不包括这一行。为了明确地说明内连接,可以通过在FROM子句中用INNER JOIN 操作符及关键
14、字ON为将要连接的表指定连续条件。如 SELECT * FROM TABLE_NAME_1 AS A JOIN TABLE_NAME_2 AS B ON A.column_name_value=;,DB2 数据库操作语言_JOIN,外连接 外连接返回的是内连接操作生成的行,以及内连接操作无法返回的行。外连接共有两 类,即:左外连接、右外连接、全外连接。 左外连接 包括内连接和在左表中但内连接不会返回的那些行。这类连接在FROM子句中使用LEFT OUTER JOIN(或 LEFT JOIN)操作符。如: SELECT * FROM TABLE_NAME_1 A LEFT OUTER JOIN
15、TABLE_NAME_2 B ON A.column_name_value = ; 右外连接 包括内连接和在右表中但内连接不会返回的那些行。这类连接在FROM子句中使用 RIGHT OUTER JOIN(或 RIGHT JOIN)操作符。如: SELECT * FROM TABLE_NAME_1 A RIGHT OUTER JOIN TABLE_NAME_2 B ON A.column_name_value = ; 全外连接 包括内连接和在左表、右表中但内连接不会返回的那些行。这类连接在FROM子句中使 用FULL OUTER JOIN(或FULL JOIN)操作符。,Company Logo
16、,DB2 数据库操作语言_JOIN & GROUP_ BY,表的自连接 表的自连接可以看成是两个相同表之间的直接连接,表的自连接是检查表中数 据一致性的很好的办法。如: SELECT * FROM TABLE_NAME A, TABLE_NAME B WHERE A.column_name_1= B.column_name_1 AND A.column_name_2 B.column_name_2;GROUP BY 子句 在结果集中可以使用GROUP BY子句来组织行信息,每一组用结果集中的一行 来表示。,Company Logo,UNION(主要用于集合运算) 可以使用UNION、UNION
17、 ALL把两个或两个以上的查询合并成一个查询。 UNION ALL与UNION类似,区别是它不删除重复值。 UNION集合运算符会把两个或两个 以上其他结果集合并生成一个结果集,并且将重复值删除掉。,Company Logo,DB2 数据库操作语言_UNION,INTERSECT: DCL C1 CURSOR FOR (SELECT COL1 FROM R1) INTERSECT DISTINCT (SELECT COL1 FROM R2); DO WHILE (SQLCODE=0) FETCH NEXT传统的方式: DCL C1 CURSOR FOR SELECT DISTINCT COL1
18、 FROM R1 WHERE EXISTS (SELECT COL1 FROM R2 WHERE R1.COL1=R2.COL1); DO WHILE (SQLCODE=0) FETCH NEXT【 INTERSECT语句比传统的处理语句在性能上都有显著提高】,Company Logo,DB2 数据库操作语言_INTERSECT,EXCEPT: DCL C1 CURSOR FOR (SELECT COL1 FROM R1) EXCEPT DISTINCT (SELECT COL1 FROM R2); DO WHILE (SQLCODE=0) FETCH NEXT传统的方式: DCL C1 CU
19、RSOR FOR SELECT DISTINCT COL1 FROM R1 WHERE NOT EXISTS (SELECT COL1 FROM R2 WHERE R1.COL1=R2.COL1); DO WHILE (SQLCODE=0) FETCH NEXT【EXCEPT语句比传统的处理语句在性能上都有显著提高】,Company Logo,DB2 数据库操作语言_EXCEPT,Company Logo,DB2 数据库操作语言_子查询,非相关子查询和相关子查询:,非相关子查询 SELECT DEPTNAME FROM DSN8910.DEPT D WHERE D.DEPTNO IN (SEL
20、ECT P.DEPTNO FROM DSN8910.PROJ P),相关子查询 SELECT FIRSTNME, LASTNAME FROM DSN8910.EMP E WHERE SALARY = (SELECT MAX(SALARY) FROM DSN8910.EMP E2 WHERE E2.WORKDEPT = E.WORKDEPT),HAVING与WHERE的区别 从功能角度来看,HAVING和WHERE是类似的,但是他们是对不同类型数据 进行操作的。任何一条SQL语句都可以使用WHERE子句来指定要返回的行所 需满足的条件。WHERE子句对表、视图、同义词和别名中的数据进行操作。 而
21、HAVING子句则不同,它对分组的信息进行操作。只有使用了GROUP BY子 句的SQL语句才能使用HAVING子句。,Company Logo,DB2 数据库操作语言_HAVING,CASE表达式 CASE语句根据指定的表达式的值,从多条语句中选择一条来执行。CASE语句常用来替代多个表进 行组合的UNION语句。 如: Select creator,name,TABLE from sysibm.systables where type=T union all; Select creatot,name,VIEW from sysibm.systables where type =V unio
22、n all; Select creator,name,ALIAS from sysibm.systables where type=A; 上述语句可以用CASE语句编写为如下形式: Select creator,name, CASE type When T then TABLE When V then VIEW When A then ALIAS Else OTHER END FROM sysibm.systables; 使用CASE语句代替多个合并操作时,性能可能将有所提高,因为DB2在产生结果集时,对数据的 访问次数更少。同时,CASE表达式的另一个有价值的用法是用来进行表的旋转。一个常见
23、的需求 就是对一个符合范式的表达式产生不符合范式的查询结果。,Company Logo,DB2 数据库操作语言_CASE,DB2 9引入了新的SQL语句MERGE。MERGE提升了应用程序的性能,允许DB2在SQL 语句中集成数据到一个表中。MERGE语句可以提高客户每夜进行的批处理数据库 INSERT和UPDATE过程,允许DB2避免进行SELECT数据存在性检查和INSERT或UPDATE 表的操作。现在一个SQL MERGE语句可以决定是否数据库关键字行已经在表中,并且集 成数据到数据库中。MERGE SQL语句操作可以使用多个行作为输入数组。当多个输入行被使用时,词 组NOT CONT
24、INUE ON SQL EXCEPTION可以被指定。这个词组允许DB2独立处理每一行 。如果在合并行的时候发生错误,只有错误的行会被剔除掉。DB2继续里剩下的输入 行。 DB2将会取多个输入行的每一行,然后决定正确的插入或升级操作来将它们集 成到表里。当表中有多个触发器时,每个成功合并的行将会引发触发器以采取适当 的行动。MERGE错误行将不触发触发器。,Company Logo,DB2 数据库操作语言_MERGE,传统的处理方式: UPDATE TABLE NAME SET VAL1=:HV_VAL1, VAL2=:HV_VAL2 If record not found (if SQL c
25、ode 0) then. INSERT INTO TABLE_NAME (VAL1, VAL2) VALUES (:HV_VAL1, :HV_VAL2) DB2 V9使用MERGE的SQL语句处理方式: MERGE INTO TABLE-NAME AS A USING (VALUES (:HV_VAL1, :HV_VAL2) FOR N ROWS AS T(VAL1, VAL2) ON A.VAL1=T.VAL1 WHEN MATCHED THEN UPDATE SET VAL2 = A.VAL2 + T.VAL2 WHEN NOT MATCHED THEN INSERT (VAL1, VAL
26、2) VALUES (T.VAL1,T.VAL2);,Company Logo,DB2 数据库操作语言_MERGE,在DB2 V8中已经支持SELECT FROM INSERT,如下所示:SELECT col1 FROM FINAL TABLE(INSERT INTO TABLE_NAME_2 (col1, col2)VALUES (aaaaa, bbbbb) ); DB2 V9新增SELECT FROM DELETE/UPDATE语句,如下所示: (1) SELECT FROM DELETE:SELECT SUM(col1) FROM OLD TABLE(DELETE FROM TABLE_
27、NAME_2 WHERE col2 = ccccc); (2) SELECT FROM UPDATE:SELECT Name, Salary FROM FINAL TABLE(UPDATE TABLE_NAME_2 SET col1= col1*1.1 WHERE col2= ccccc);,Company Logo,DB2 数据库操作语言_SELECT FROM INSERTUPDATEDELETE,在DB2中有三种游标类型,分别为只读游标、可更新游标和模糊游标。DB2对三种 游标类型的处理有所不同,这些不同主要体现在性能方面。 只读游标 : 当 DB2 知道游标是只读的时,就可以应用某些性
28、能方面的优势: DB2 通过能够执行记录组块(record blocking)来从服务器一次检索多行,而不 必担心如何获得允许更新行的锁。 DB2 有时可以为查询选择更好的访问计划。 如果我们知道游标不会用于更新或删除行,则应该将其标为只读,方法是将FOR READ ONLY (或 FOR FETCH ONLY( WITH UR )添加到该游标的 SELECT 语句中。如果游标的 SELECT 语句要联结多个表,或者包括像 ORDER BY 或 GROUP BY 这样的子句,那么该游标将被自动列为只读。,Company Logo,DB2 数据库操作语言_游标操作,可更新游标 如果在游标的 SE
29、LECT 语句中指定了 FOR UPDATE 子句,则该游标就是可更新的 ,这意味着游标中的行将被一条 Update Where Current Of 语句更新。在 SELECT 语句中只能引用一个表(或视图)。因为必须维持数据完整性,DB2 只能对可更新 游标执行最少的优化。 【可更改游标声明时必须使用“FOR UPDATE WITH 字段名”子句。】 模糊游标 如果 DB2 不能通过游标的定义决定它是只读的还是可更新的,则属于模糊游标。换 句话说,游标的 SELECT 语句既没有指定 FOR READ ONLY,也没有指定 FOR UPDATE,则该游标就是模糊游标。对于模糊游标,DB2
30、根据针对应用程序的 BIND 命 令的 BLOCKING 选项的值来选择是否为选择使用记录组块。如果执行了记录组块,但是 又出现了更新,就会产生负面的性能影响,因此最好尽可能避免使用模糊游标。 【注意:声明时必须指定是“只读游标”还是“可更新游标”。】,DB2 数据库操作语言_游标操作,限制返回集的大小 如果我们不希望在应用程序中提取n行以上的记录,应该在编程时指定“FETCH FIRST n ROWS ONLY”子句;反之,如果不指定该子句,结果集中可能就会有很多 行记录(大于n),而实际上这些行我们确使用不到,白白的消耗系统资源。 我们应用开发中的典型使用例子就是联机多笔查询交易。在做多笔
31、查询的时候, 由于CICS通讯区大小的限制,一般不可能一次将所有查询的记录返回给客户端, 都是返回通讯区允许范围内的数据记录数。如果不使用这个子句的话,每次都要查 询出整个结果集,但真正用到的确不多,浪费了很多系统资源。如果指定了“FETCH FIRST n ROWS ONLY”子句,并使N等与每次返回的记录条数,那么就会提高系统的 效率。 【注意,该子句不能与FOR UPDATE子句同时使用。】,Company Logo,DB2 数据库操作语言_游标操作_注意事项,使用游标时要特别注意在游标的循环内有没有Commit或Rollback语句,如 果游标声明时没有指明“WITH HOLD”子句的
32、话,那么,执行Commit或Rollback 语句后,该游标将被关闭。想要保持该游标不被关闭的话必须要加上“WITH HOLD”子句。 【提醒:避免游标被意外关闭应使用“WITH HOLD”子句。】另外,对于需要很多更新的程序(如我们的后台批处理程序)来说,保持一个 合适的更新频率也是非常重要的。如果更新频率过高的话(如每次改动后都做提交 ),虽然程序的并发性比较好,但由于提交操作需要大量的时间,整个程序的效率 就比较低。如果更新频率过低的话,相对来说,程序的执行效率比较高,但程序的 并发性就比较低了,如果控制得不好的话,非常容易产生死锁或长时间等待。 【根据IBM的建议,一般每1000500
33、0条记录做一次提交比较适合。】,Company Logo,DB2 数据库操作语言_游标操作_注意事项,当批量处理程序中使用游标获取数据信息,则可以通过MULTI-ROW FETCH来获取多 条数据信息,与一条条获取数据相比来说它能有效地提高效率,特别是在分布式环 境中,能有效地减少网络传输的消耗。例如:long serial_num 10; struct short len; char data 18; name 10; EXEC SQL DECLARE C1 CURSOR FOR SELECT NAME, SERIAL_NO FROM EMPLOYEE WITH ROWSET POSITIO
34、NING; EXEC SQL OPEN C1; EXEC SQL FETCH FIRST ROWSET FROM C1 FOR 10 ROWS INTO :NAME, :SERIAL_NUM;,Company Logo,DB2 数据库操作语言_游标操作_注意事项,BoEing_DB2开发规范,Company Logo,DB2 数据库操作函数,使用SQL语句对DB2表中的数据进行操作时,有两类内置的函数可供使用,它们是列函 数和标量函数。可以使用这些函数进一步简化对复杂数据的访问。DB2同时也提供了 让用户创建自己定义函数的功能,称为“用户定义函数”。,(1)列函数(Column Functio
35、n):可从一组数据中计算出一个特定的列值或表达 式值。它提供了汇集数据的能力,使用户能够在一条SQL语句中进行跨越多个行的数据统计和计算。使用列函数需注意如下几条规则:列函数只能用在SELECT语句中;对列函数不许显式地指定列名或表达式;每个列函数对所做的SELECT操作的数据行稽核只返回一个值;如果对SELECT语句的某个列使用列函数,除非也使用GROUP BY,否则必须对同 一个SELECT语句中的其他所有列也使用这个函数;使用GROUP BY子句来对一组命令列使用列函数,任何在这条SELECT语句中的命 令列也必将被这个列函数处理;,除COUNT和COUNT_BIG函数外,列函数的结果值
36、与它处理的列具有相同的数据类型。COUNT列函数返回整型值,而COUNT_BIG列函数返回小数值; 如果预先在WHERE子句中定义的条件没有返回数据,而是返回空值NULL,则列函数将不返回,SQLCODE为100; 当在可以取空值的列上使用AVG、MAX、MIN、STDDEV、SUM和VARIANGE函数时,应在使用这些函数之前将所有的空值剔除; 在使用某个列函数之前,可以使用DISTINCT关键字来去除重复值,DISTINCT对MAX和MIN函数无效; 可以使用ALL关键字指出重复的值不被去除,ALL在列函数使用中是默认的; 只有当一个WHERE子句是HAVING子句的子查询的一部分时,列函
37、数才能在WHERE子句中被定义; 在列函数表达式中指定的每个列名都必须被相同的组所引用。,Company Logo,DB2 数据库操作函数_列函数,Company Logo,COUNT函数是对某个表的行数进行计数,或者对某个给定的具有不同值的列进行计数。COUNT函数可以在列一级或行一级上进行操作,相应的语法有所不同。COUNT函数只是简单地对行数进行计数并返回结果值,并不关心所计数的行中存储的数据值。具体语法如下:SELECT COUNT(*) FROM Table_Name;,DB2 数据库操作函数_列函数_COUNT,MAX函数返回指定的列或表达式值中的最大值。MAX函数返回结果应当与指
38、定的列或表达式具有相同的数据 类型。它的参数是除去大对象类型(CLOB、DBCLOB或BLOB)外 任何系统内置的数据类型。字符串类型的参数不能长于255字节 ,而图形串类型的参数不能长于127字节。具体语法如下:SELECT MAX(COLUMN_NAME) FROM TABLE_NAME;,Company Logo,DB2 数据库操作函数_列函数_MAX,MIN函数返回指定的列或表达式值中的最小值。MIN函数返回结果应当与指定的列或表达式具有相同的数 据类型。它的参数是除去大对象类型(CLOB、DBCLOB或BLOB )外任何系统内置的数据类型。字符串类型的参数不能长于 255字节,而图形
39、串类型的参数不能长于127字节。具体语法如下:SELECT MIN(COLUMN_NAME) FROM TABLE_NAME;,Company Logo,DB2 数据库操作函数_列函数_MIN,SUM函数返回对指定列或表达式的值的累加和,它的参数可以 使用任何系统定义的数值型数据,返回值必须在其数据类型可以允 许接受的值的范围之内。除下列情况外,函数返回值的数据类型必须同参数值的数据类 型相同:对SMALLINT值求和将返回INTEGER值;对单精度数求和将返回双精度值。具体语法如下:SELECT SUM(COLUMN_NAME) FROM TABLE_NAME;,Company Logo,D
40、B2 数据库操作函数_列函数_SUM,Company Logo,DB2 数据库操作函数_标量函数,标量函数是应用在某个列或表达式上对单个值进行运算处理的函数,而列函数是应用在某个数据集合上的。标量函数将某个列或表达式的值进行转换并将转换结果作为返回值。DB2提供的标量函数如下:ABS:返回数的绝对值;HEX:返回值的十六进制表示;LENGTH:返回自变量中的字节数(对于图形字符串则返回双字节字符数);YEAR:抽取日期时间值的年份部分。 CONCAT LTRIM、RTRIM STRIP SUBSTR,BoEing_DB2开发规范,约束是数据库管理程序实施的规则,DB2包含4种类型的约束处理。
41、唯一性约束:确保表中的关键字值是唯一的。检查对组成主关键字的列的任何更改,以保证唯一性; 参照完整性约束:在插入、更新和删除操作上实现参考约束。所有外部关键字的所有值都有效才是数据库的一个正确状态; 表检查约束:验证更改后的数据有无违反创建或更改表时指定的条件; 触发器:定义要执行的一组操作,当对指定的表执行更新、删除或插入操作时要调用这组操作。,Company Logo,DB2 数据库操作建议_数据库约束,唯一性约束是一个规则,它确保关键字值在表中是唯一的。在唯一 约束中组成该关键字的每一列必须定义为NOT NULL。可以使用PRIMARY KEY或UNIQUE子句的CREATE TABLE
42、或ALTER TABLE语句中定义唯一约束。一个表可有任意多个唯一约束,但是只能定义一个唯一约束作为一 个表的主键,此外,一个表在相同的一组列上不能又多个唯一约束。当 定义一个唯一约束时,DB2就会创建一个唯一索引并将它指定为系统必 需的主索引或唯一索引。此约束通过唯一索引来实现。一旦在某列上建 立了唯一约束,则在多行更新期间对唯一性的检查将延迟到更新结束后 进行。,Company Logo,DB2 数据库操作建议_数据库约束_唯一性约束,DB2通过参照约束维护参照完整性。参照完整性要求子表给定的属性的所有值存 在于父表的某些列中。参照约束是指一个指定的外部关键字的非NULL值只有是指定 表的
43、唯一关键字的值时才有效。参照约束的目的是保证数据库表之间的关系得到维 持,并遵守数据输入规则。对于参照约束的表,在INSERT、DELETE、UPDATE和DROP等SQL操作上有某些限制。(1)INSERT规则:可以随时在父表中插入一行,而不必在子表中执行任何操作,但不能在子表中插 入行,除非在父表中有一行键值等于要插入的行的外键,或该外键值是NULL;,Company Logo,DB2 数据库操作建议_数据库约束_参照完整性约束,(2)DELETE规则:当从父表中删除一行时,需检查在子表中是否有某行或某些行的外键值等于父表被删除的行的 键值。若不存在则可正确删除;若存在,是否可以删除该行由
44、创建子表时指定的删除规则决定。 若定义为RESTRICT,则阻止父表删除任何行,如果一定要删除,需先删除子表对应的行再删除父 表的行才可实现; 若定义为NOACTION,则强制要求父表不能删除行; 若定义为CASCADE,则在删除父表的行后自动删除子表对应的行,无需首先删除子表对应的行。 若子表还有关联的子表,则再对之后的子表实施删除规则,DB2可实现级联删除; 若定义为SET NULL,则在删除父表的行后将子表中的外键值置为NULL,而该行的其他部分保持不 变; 若创建子表时未定义删除规则,则默认为NOACTION规则。 在一个删除操作中可能涉及的任何表称为删除连接的表。下列限制应用于删除连
45、接的关系: 当多个表组成的一个参照循环中,一个表不能与它自己是删除连接关系; 当一个表通过多个从属关系与另一个表形成删除连接关系时,这些关系必须有相同的删除规则 CASCADE或NOACTION; 当一个自参照表是CASCADE关系中另一个表的子表时,自参照关系的删除规则也必须是CASCADE。,Company Logo,DB2 数据库操作建议_数据库约束_参照完整性约束,(3)UPDATE规则:若需要更新子表的外键,而该外键值不NULL时,它必须与父表的某个键值匹 配,否则不允许更新任何行。若更新父表的某个键值时:若子表中存在某些行与父表的该键值匹配,且更新规则是RESTRICT时拒绝 该更
46、新;若更新语句完成时(触发后的情况除外)子表中的任何行没有对应的父表 键值,当更新规则未NOACTION时拒绝该更新。要更新父表的该行,必须通过下列操作首先除去与子表的某些子行的关系: 删除子行;更新子表中的外键值,以包括另一个有效的关键字。,Company Logo,DB2 数据库操作建议_数据库约束_参照完整性约束,Company Logo,BoEing_DB2开发规范,BoEing_DB2 数据类型应用规范,Company Logo,BoEing_DB2 数据类型应用规范,Company Logo,BoEing_DB2 数据类型应用规范,Company Logo,Company Logo
47、,BoEing_DB2开发规范,Company Logo,BoEing_DB2 数据库索引,索引是表的一个或多个列的键值的有序列表。创建索引的原因主要有两个: 确保一个或多个列中值的唯一性; 提高对表进行查询的性能。当执行查询时想以更快的速度中找到所需要的数据列, 或要以索引的顺序显示查询结果时,DB2优化器选择使用索引。 【如果表上不存在索引,那么必须对SQL查询中引用的每个表执行表扫描,表越大, 表扫描所花费的时间越长,因为表扫描需要顺序访问每个表行。】 尽管索引能显著缩短数据库表的访问时间,但是他们也会给性能带来负面影响。在 创建索引前,考虑多个索引给磁盘空间和处理时间带来的影响。每个索
48、引都需要存储器和磁盘空间,准确的容量取决于表的大小以及关系索引中的列的大小和数目。 对一个表执行的每个INSERT或DELETE操作都需要对该表上的每个索引进行额外的更新。 对于更改索引键值的每个UPDATE操作,也是如此。 关系索引就是常规索引。,对于分区表,需要一些键值来控制表的分区,简单的来讲如果这些键值划分是 在CREATE TABLE建表语句中,这个表就是Table-Control的表,如果是在Create Index语句中,这个表就是Index-Control。使用Index-Control,一定需要有一个来控制分区的索引,而且这个索引需要 建成聚簇索引,不存在第二个索引为分区索引
49、。而对于Table-Control就不存在这 种情况,分区由表控制,和索引无关,不必须使用聚簇索引,且可以有多个分区索 引。,Company Logo,BoEing_DB2 数据库索引,(1)对于Index-Control的表,索引分为两种,第一种为分区且聚簇索引,第二种 为非分区非聚簇索引。 (2)对于Table-Control的表,有三个概念: Partitioning,用于分区的键值称为Partitioning字段; Partitioned,分区的索引称为Partitioned,在Create Index的时候有Partitioned关键字; Secondary,非Partitionin
50、g的字段称为Secondary字段。,Company Logo,BoEing_DB2 数据库索引_索引的分类,根据这三个概念,索引划分为: NPI(None Partitioned Index),这种索引物理上不分区,可以包含任何字段。 DPPI(Data Partitioned Partitioning Index),这种索引必须要以所有的Partitioning字段开头,随后可以包含Secondary字段,不需要一定是聚簇的; DPSI(Data Partitioned Secondary Index),非DPPI的分区索引都是DPSI。 除了索引Q1外还有两个索引: CREATE INDEX ORDERNO_IX ON Q2 (ORDERNO); CREATE INDEX ORDERNO_IX ON Q3 (ORDERNO) PARTITIONED; Q1为DPPI索引,Q2为NPI索引,Q3为DPSI索引。 对于NPI索引,V8之前,在Reorg的时候有个Build2阶段,需要的维护时间较长,但在V9中进行了改进,去除了Build2阶段。 【不建议使用NPI索引,可能会影响程序的并发性;并且维护成本较高。在DB2 V8之 前会导致应用程序一段时间内不可用,DB2 V9有所改进,但将消耗更多的时间,磁盘 和CPU来维护NPI,且需要取消并发重组模式。】,