DB2 autoincretment(抄袭)

自动生成列:
1.在创建表的时候通过generated字句指定;
2.支持两个选项,generated always和generated by default.
   1)generated always:DB2控制值的生成,如果指定了值,将会报错;
   2)generated by default:如果指定了值,DB2将不会帮你生成值,因此不能保证数据的
      唯一性;
举例:
create table payroll
(employee_id int not null,
 base_salary  double,
 bonus double,
 commission double,
 total_pay double generated always as
                          (base_salary *(1 + bonus) + commission)
下面的两条语句,将产生相同的结果:
insert into payroll values(1,100,0.1,20,DEFAULT);    -- DEFAULT是DB2的保留字
insert into payroll (employee_id,base_salry,bonus,commission)
 values(1,100,0.1,20);
如何使用identity列和sequence对象:
作用:
用于生成雇员编号、订单号、票号码等,它的优点是能保证唯一性,比通过应用程序去实现速度要快。identity列和sequence对象具有下列属性:
start with            第一个值           
increment by            每次增加的值,缺省是1,通过它控制降序和升序           
minvalue /no minvalue            控制是否有最小值           
maxvalue/no maxvalue            控制是否有最大值           
cycle/nocycle            是否循环使用           
cache/no cache/cache 20            是否缓存值,缺省是20个值;但DB2重启之后会丢失值,造成数值不连续;
create table service_rq
         (  rqid smallint not null constraint rqid_pk primary key,
            accum_rqnum integer not null
                  generated always as identity
                  ( start with 1
                    ,increment by 1
                    ,cache 10)
5)通过函数identity_val_local可以检索出上一个语句生成的identity列
    的值
     select identity_val_local()  into p_accum_rqnum from sysibm.sysdummy1;
     values identity_val_local() into p_accum_rqnum;
6)如果在一个insert语句中插入多条记录,identity_val_local将返回空值
    insert into service_rq(rqid,accum_rqnum) values(30000,DEFAULT),(30001,DEFAULT);
7)identity列的属性可以通过alter table来修改,其中restart with语句最常用;
2.sequence
1)sequence也用于自动生成值,它和identity列的区别是不绑定到特定的表,是全局的,
   单独创建的对象,可以用于任何一个表。
2)创建
   create sequence staff_seq as integer
               start with 360
               increment by 10
               no maxvalue
               no cycle
               cache 10
3)修改属性
    通过alter sequence可以修改下列属性:
      restart with     minvalue /no minvalue    maxvalue/no maxvalue    cycle/ no cycle
      increment by     cache <integer constant>/ no cache
4)删除sequence
    drop sequence <sequence-name>
5)使用sequence对象需要的权限
    grant usage on sequence < sequence object name> to public
6.检索生成的值
    通过两个表达式来实现:
    next value     – 下一个值;
    previous value      – 当前的值;
 
create procedure seqexp ( out p_prevval1 int,
                                           out p_nextval1 int,
                                           out p_nextval2 int,
                                           out p_prevval2 int )
language sql
specific seqexp
begin
    declare v_prevstaffno int;
    insert into staff (id,name,dept,job,year,salary,comm)
               values (next value for staff_seq,’bush’,55,’mgr’,30,null,null);
    update staff  set  id =( next value for staff_seq ) where name=‘bush’;
    values previous value for staff_seq into v_prevstaffno;
    delete from staff  where id = v_prevstaffno;
          values ( previous value fro staff_seq           -- (1)
                      ,next value for staff_seq
                      ,next value for staff_seq
                      ,previous value fro staff_seq )
          into p_prevval1,p_nextval1,p_nextval2,p_prevval2;
end

需要注意的是:在行1中,如果在一个语句中多次引用同一个sequence对象,next value和previous value将只执行一次;假设staff_seq最后生成的值为500,那么行1中返回值分别为500、510、510、500。

收藏于 2011-01-30
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值