• 45.4.7 序列:USER_SEQUENCES(SEQ)


    45.4.7 序列:USER_SEQUENCES(SEQ)

    要显示序列的属性,可以查询USER_SEQUENCES 数据字典视图。该视图也能用公有同义词SEQ 进行查询。USER_SEQUENCES 视图的列如下所示:

    Sequence_Name 序列名

    Min_Value 序列的最小值

    Max_Value 序列的最大值

    Increment_By 序列值之间的增量

    Cycle_Flag 一个标志,一旦达到Max_Value 值,用来表明该值能否再循环回Min_Value 值

    Order_Flag 一个标志,用来表明序列号是否按顺序生成

    Cache_Size 内存中缓存的序列项的编号

    Last_Number 使用的或缓存的最后一个序列号,一般大于缓冲区中的最后一个值

    Last_Number 列在普通的数据库操作过程中不被更新,它在数据库的重新启动/恢复操作中使用。

    ALL_SEQUENCES 视图列出了用户拥有的所有序列,或授权该用户或PUBLIC 所有用户访问的序列。由于ALL_SEQUENCES 视图包含多个用户的项,因此除已经列出的列外,它还包含一个Sequence_Owner 列。DBA_SEQUENCES 视图列出了数据库的全部序列,它与ALL_SEQUENCES 视图具有相同的列定义。

    转载:

    http://book.51cto.com/art/201007/212274.htm

    ---------------------------------------------------------------------------------------------------------------

    一、序列
      序列是oracle用来生产一组等间隔的数值。序列是递增,而且连续的。oracle主键没有自增类型,所以一般使用序列产生的值作为某张表的主键,实现主键自增。序列的编号不是在插入记录的时候自动生成的,必须调用序列的方法来生成(一般调用nextval方法)。我们也可以编写表的insert触发器来进自动生成。
      创建语法:

    create sequence 序列名称
    [start with 初始量] 
    [increment by 递增量] 
    [maxvalue 最大值| nomaxvalue] 
    [minvalue 最小值| nominvalue] 
    [cycle | nocycle] 
    [cache 缓存个数| nocache];

    start with:生成第一个序列号,对于升序列,其默认值为序列最小值;对于降序序列,其默认值为序列的最大值 。
    increment by:用于指定序列号之间的间隔,其默认值为1,如果integer为正值,则生成的序列按升序排列,如果integer为负值,则生成的序列将按降序排列。
    maxvalue:序列可以生成的最大值。
    nomaxvalue:oracle将升序序列的最大值设为1027,将降序序列的最大值设为-1.这是默认选项。
    minvalue:minvalue必须小于或等于start with的值,并且必须小于maxvalue的值。
    nominvalue:oracle将升序的最小值设为1,或将降序序列的最小值设为-1026.这是默认值。
    cycle:序列在达到最大值或最小值后,将继续从头开始生成值。
    nocycle:序列在达到最大值或最小值后,将不能再继续生成值。不写默认为nocycle这是默认选项 。
    cache:预先分配一组序列号,并将其保留在内存中,这样可以更快地访问序列号.当用完缓存中的所有序列号.oracle将生成另一组数值,并将其保留在缓存中。
    nocache:不会加快访问速度而预先分配序列号,如果在创建序列时忽略了cache和nocache,orcale将默认缓存20个序列号。

    修改语法:
    alter sequence 序列名称
    [start with 初始量] 
    [increment by 递增量] 
    [maxvalue 最大值| nomaxvalue] 
    [minvalue 最小值| nominvalue] 
    [cycle | nocycle] 
    [cache 缓存个数| nocache];

    二、例子

       以下代码person表如下:

    复制代码
    DROP TABLE person ;
    CREATE TABLE person (
    id NUMBER(11) NOT NULL ,
    username VARCHAR2(255 ) NULL ,
    age NUMBER(11) NULL ,
    password VARCHAR2(255) NULL ,
    PRIMARY KEY (id)
    )
    复制代码

      创建序列

    create sequence seq_tb_person
    minvalue 1
    maxvalue 999999999999999999999999999
    start with 1
    increment by 1
    cache 20;

      使用序列

    insert into person (id, username, age, password) values (seq_tb_person.nextval, '张三', 20, 'zhang123')

      我们也可以通过建立触发器,当有数据插入表person时,使用oracle序列为其去的递增的主键值

    复制代码
    -- 创建触发器
    create or replace trigger trigger_set_person_id before insert on person
    for each row
    begin
        select seq_tb_person.nextval into :new.id from dual;
    end;
    -- 插入数据
    insert into person ( username, age, password) values ('张三', 20, 'zhang123')
    复制代码

      修改序列

    alter sequence seq_tb_person
    minvalue 1
    maxvalue 999999999999999999999999999
    -- start with 49 对于已经启动的序列,无法设置初始值
    increment by 1
    cache 20;

      查看用户的序列:

    select sequence_name, min_value, max_value, increment_by, last_number from user_sequences;

      删除序列

    drop sequence 序列名;

      通过USER_OBJECTS可以查看用户拥有的序列,USER_SEQUENCES可以查看序列的设置。

    三、注意点

    • 一个序列可以被多张别使用,不过一般建议为每个表建立单独的序列。
    • 当使用到序列的事务发生回滚。会造成序列号不连续。在用生成的序列值作为编号做插入数据库操作时,可能遇到事务提交失败,从而导致序号不连续。
    • 大量语句发生请求,申请序列时,为了避免序列在运用层实现序列而引起的性能瓶颈。Oracle序列允许将序列提前生成 n个先存入内存,在发生大量申请序列语句时,可直接到运行最快的内存中去得到序列。但cache个数最好不要设置过大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入n个。这种情况也能会在数据库关闭时也会导致序号不连续。

    转载:

    https://www.cnblogs.com/always-online/p/4029703.html

  • 相关阅读:
    C语言资料分享
    vue子组件添加事件无效解决
    vue-cli3 vue动画 打包后不生效解决
    setTimeOut定时器实现数组内容循环获取
    echart 之仪表盘 动态分段颜色实现
    elementUI table树默认箭头修改
    《二》打包发布工程-README.md编辑
    《一》打包发布工程--npm 打包发布js库篇
    npm打包发布js库包npm ERR! 403 Forbidden
    安装nrm 后执行报错TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string
  • 原文地址:https://www.cnblogs.com/sunice/p/10020953.html
Copyright © 2020-2023  润新知