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替代。
DB2序列简介及使用
DB2序列的使用
Oracle序列

转载请注明出处:http://blog.csdn.net/bobo12082119/article/details/8734679

--the end--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值