当前位置:数据库 > DB2 >>

DB2中列的唯一值的定义

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                 beijing                        2013-03-28-19.43.48.647000
  4 条记录已选择。
修改表之后,emp_info_chg列自动填充了当前时间戳值。
db2 => update emp_info set address ='tianjin' where empno=2
DB20000I  SQL 命令成功完成。
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            tianjin                        2013-03-28-20.25.39.736000
         22 yeeXun               changchun                      2013-03-28-19.41.24.175000
         23 CSDN                 beijing                        2013-03-28-19.43.48.647000
 
3、序列
序列用来实现列的自增长,可以再添加数据的时候使用序列,但是序列的属性一定为no cycle;下面是序列的两个伪列:
next value:表示下一个序列值,可以使用nextval替代;
previous value:表示当前序列值,可以使用currval替代。
 
来源:http://blog.csdn.net/bobo12082119/article/details/8734679
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,