zoukankan      html  css  js  c++  java
  • 数据库sequence的作用和用法

    转:

    数据库sequence的作用和用法

    seqence的作用:

    sequence号是数据库系统按照一定规则自增的数字序列,因为自增所以不会重复。目前就我所了解的sequence的作用主要有两个方面。

    一:作为代理主键,唯一识别;

    二:用于记录数据库中最新动作的语句,只要语句有动作(I/U/D等),sequence号都会随着更新,所以我们可以根据sequence号来select出更新的语句。

    sequence的用法:

    sequence和创表类似,需要创建一个sequence,然后表的一个int型字段可以使用这个sequence。

    创建一个sequence(db2,oracle均适用)

    create seqence sequence_name 

    [start with n1] 

    [increment by n2] 

    [maxvalue n3|no maxvalue] 

    [minvalue n4|no minvalue] 

    [cache n5|no cache] 

    [cycle|no cycle] 

    [order|no order]

    ----------------->n1到n5都是整数

    ----------------->start with 生成的第一个n1值

    -----------------> increment by n2 递增量,可以为正整数或负整数,指明每一次增加多少

    ----------------->maxvalue最大值,no maxvalue用于指定序列没有上限

    ----------------->minvalue 最小值,no minvalue,没有指定最小下限

    ----------------->cache 用高速缓存中可以预分配的序列号个数,默认是20。 如果缓存中的序列号没有用完就关闭数据库等其它原因. 没有使用的序列号就丢失了,所以不能保证序列号是连续的。nocache高速缓冲中不预分配序列号,每次只生成一个序列号,虽然降低了获取序列号的速度,但是可以保证序列号的连续性。

    ----------------->cycle 序列达到最大值或最小值后是否循环。再从n1开始循环,默认不no cycle

    ----------------->order用于指定按顺序生成序列,只有在RAC时需要指定,指定ORDER 是为了保证序列号是因为有请求才生成的。在使用序列号做为一个时间戳时很有用,no order是不指定按顺序生成序列(默认)。

    创建一个sequence:

    create sequence sequence_name as int minvalue 1000 maxvalue 1000000000 start with 1000 increment by 1 no cache;

    或者

    create sequence sequence_name minvalue 1000 no maxvalue start with 1000 increment by 1 no cache;

    sequence的使用:

    sequence_name.nextval ------->引用下一个序列值

    sequence_name.currval /seqence_name.nextval.currval -------->引用当前序列值,必须最少经过一个nextval才能引用currval

    在表中使用sequence:

    create table tab_name(col_int int, col_varchar varchar(20), col_seq int);

    insert tab_name into values(1, 'abc', nextval for sequence_name);   或者 insert tab_name into values(1, 'xyz', sequence_name.nextval);

    insert tab_name into values(2, 'fgh', nextval for sequence_name);   或者 insert tab_name into values(2, 'fgh', sequence_name.nextval);

    update tab_name set col_varchar='678', col_seq=sequence_name.nextval where col_int=2; 

    delete tab_name col_sql=sequence_name.nextval where col_int=1;

    单独使用查询sequence:

    select sequence_name.nextval from dual; ------>每执行一次sequence号会一直增加

    select sequence_name.currval from dual; ------->执行多少次都不会变化

    改变sequence:

    比如对以上创建的sequence除了初始值以外的值进行修改,alter sequence_name minvalue 100000 maxvalue 99999999 increment by 10 cache 10 cycle;

    删除sequence:

    drop sequence sequence_name;

    利用解发器自动为表插入递增序列:---类似自增字段的作用

    建解发器代码为:
    create or replace trigger trigger_id
    before insert on tabname
    for each row
    declare
    nextid number;
    begin
    IF :new.col_seq IS NULL or :new.col_seq=0 THEN
    select sequence_name.nextval
    into nextid from sys.dual;
    :new.col_seq:=nextid;
    end IF;
    end trigger_id;

    或者

    create trigger trigger_id before
    insert on tabname
    for each row 

    begin
    select sequence_name.nextval 
    into:new.col_seq 
    from dual;
    end trigger_id;

    或者

    create or replace trigger trigger_id
    before insert or update of col_seq
    on tabname
    for each row
    begin
    if inserting then
    select sequen_name.nextval into:new.col_seq from dual;
    slse
    raise_application_error(-20020, '不允许更新ID值!');
    end if;
    end;

  • 相关阅读:
    Unity动态批处理和静态批处理学习
    Mac下Unity使用Jenkins自动化打包
    Mac 环境环境下安装Git与使用(码云)
    MySQL: 6、MySQL语句
    MySQL: 5、MySQL索引、视图、存储过程
    MySQL: 4、多表、外键、数据库设计
    MySQL: 3、SQL语言 ②约束、事务
    MySQL: 2、SQL语言 ①概念、分类
    MySQL: 1、MySQL基础
    Mac 系统下如何显示和隐藏文件
  • 原文地址:https://www.cnblogs.com/libin6505/p/11238576.html
Copyright © 2011-2022 走看看