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