日期:2014-05-16  浏览次数:20434 次

DB2中列的唯一值的定义
在定义表的时候,需要指定一个或者多个字段作为主键;定义为主键的列必须是not null,且unique;
唯一值的列,及在所有的数据行中,该列的数据值不会重复;
对于唯一值的列,DB2提供了如下几种生成数据的方法。

1、IDENTITY列,数值型。
create table emp_info(
       empno int not null 
                 generated as identity, --自动增长
       empinfo_change timestamp,
       ename varchar(20),
       address varchar(30)
      )
IDENTITY属性其实是一个自动增长的序列,默认startwith=1,increment=1,cache=20。
在添加数据的时候,不需要指定自动增长列的值,否则将会返回错误信息:
insert into emp_info(empno,empinfo_change,ename,address) 
values(101,current_timestamp,'SCOTT','CHANGCHUN JILIN CHINA')
DB21034E  该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0798N  不能为定义为 GENERATED ALWAYS 的列 "EMPNO" 指定值。  SQLSTATE=428C9

insert into emp_info(empinfo_change,ename,address) 
values(current_timestamp,'SCOTT','CHANGCHUN JILIN CHINA')
db2 => select * from emp_info
EMPNO       EMPINFO_CHANGE             ENAME                ADDRESS
----------- -------------------------- -------------------- ------------------------------
          1 2013-03-28-18.26.06.734000 SCOTT                CHANGCHUN JILIN CHINA
  1 条记录已选择。

insert into emp_info(empinfo_change,ename,address) 
values(current_timestamp,'ChenLinBo','CHANGCHUN JILIN CHINA')
DB20000I  SQL 命令成功完成。
db2 => select * from emp_info
EMPNO       EMPINFO_CHANGE             ENAME                ADDRESS
----------- -------------------------- -------------------- ------------------------------
          1 2013-03-28-18.26.06.734000 SCOTT                CHANGCHUN JILIN CHINA
          2 2013-03-28-18.27.04.408000 ChenLinBo            CHANGCHUN JILIN CHINA
  2 条记录已选择。

2、FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP,timestamp类型。
对于timestamp类型的列,若想让此列自动填充当前时间戳的话,可以指定列的属性为:
FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP。
这种类型的列,只能在定义或者修改表的时候新增列,否则一个timestamp类型的列定义之后,就无法修改为改属性了。
我们先将上表emp_info中的empinfo_change列删除,再增加一个timestamp类型的自动填充当前时间戳的列。
ALTER TABLE emp_info DROP COLUMN empinfo_change
ALTER TABLE emp_info ADD COLUMN emp_info_chg timestamp NOT NULL 
GENERATED ALWAYS  
FOR EACH ROW ON UPDATE  
AS ROW CHANGE TIMESTAMP
因为表的结构发生了变化,所以需要重构一下表;否则将会报错!
reorg table emp_info
添加数据之后,如下:
db2 => SELECT * FROM EMP_INFO
EMPNO       ENAME                ADDRESS                        EMP_INFO_CHG
----------- -------------------- ------------------------------ --------------------------
          1 SCOTT                CHANGCHUN JILIN CHINA          2013-03-28-19.41.18.777000
          2 ChenLinBo            CHANGCHUN JILIN CHINA          2013-03-28-19.41.18.777001
         22 yeeXun               changchun                      2013-03-28-19.41.24.175000
         23 CSDN             &n