zoukankan      html  css  js  c++  java
  • ORACLE自增长字段实现(转)

         首先,你要有一张表!
           CREATE TABLE example(
                 ID Number(4) NOT NULL PRIMARY KEY,
                 NAME VARCHAR(25),
                 PHONE VARCHAR(10),
                 ADDRESS VARCHAR(50)

              );

         然后,你需要一个自定义的sequence
         CREATE SEQUENCE emp_sequence
              INCREMENT BY 1 -- 每次加几个
              START WITH 1 -- 从1开始计数
              NOMAXVALUE -- 不设置最大值
              NOCYCLE -- 一直累加,不循环
              NOCACHE -- 不建缓冲区
         以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq
    ,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!)
         书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:
         CREATE TRIGGER "触发器名称" BEFORE
              INSERT ON example FOR EACH ROW WHEN (new.id is null)
          begin
              select emp_sequence.nextval into: new.id from dual;
           end;
         打完收工!下面你就试试插入数据吧!
              INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei');
     

    =============================================================
         ORACLE SEQUENCE的简单介绍(自增长字段)- -

         在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
         1、Create Sequence
              你首先要有CREATE SEQUENCE或者CREATE ANYSEQUENCE权限,
                   CREATE SEQUENCE emp_sequence
                        INCREMENT BY 1--每次加几个
                   STARTWITH 1--从1开始计数
                   NOMAXVALUE--不设置最大值
                   NOCYCLE--一直累加,不循环
                   CACHE10;

         一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
         CURRVAL=返回sequence的当前值
         NEXTVAL=增加sequence的值,然后返回sequence值
         比如:
              emp_sequence.CURRVAL
              emp_sequence.NEXTVAL

         可以使用sequence的地方:
         -不包含子查询、snapshot、VIEW的SELECT语句
         -INSERT语句的子查询中
         -NSERT语句的VALUES中
         -UPDATE的SET中

         可以看如下例子:
         INSERT INTO emp VALUES
              (empseq.nextval,'LEWIS','CLERK',7902,SYSDATE,1200,NULL,20);

              SELECT empseq.currval FROM DUAL;

         但是要注意的是:
         第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENTBY值,然后返回增加后的值。CURRVAL总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?

         如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。使用cache或许会跳号,比如数据库突然不正常down掉(shutdownabort),cache中的sequence就会丢失.所以可以在createsequence的时候用nocache防止这种情况。

         2、Alter Sequence
         你或者是该sequence的owner,或者有ALTE RANYSEQUENCE权限才能改动sequence.可以alter除start至以外的所有sequence参数.如果想要改变start值,必须drop sequence再re-create.
         Alter sequence的例子
              ALTER SEQUENCE emp_sequence
                   INCREMENT BY 10
                   MAXVALUE 10000
              CYCLE--到10000后从头开始
              NOCACHE;

              影响Sequence的初始化参数:
              SEQUENCE_CACHE_ENTRIES=设置能同时被cache的sequence数目。

              可以很简单的Drop Sequence
              DRO SEQUENCE order_seq;

    -------------------------------------------------------------
    自增长及触发器:

         如何在Oracle中实现类似自动增加ID的功能?
              我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在ORACLE中没有这样的功能,我们可以通过采取以下的功能实现自动增加ID的功能
         1.首先创建sequence
              create sequence seq maxincrement by 1
         2.使用方法
              select seqmax.nextval ID from dual
         就得到了一个ID
         如果把这个语句放在触发器中,就可以实现和mssql的自动增加ID相同的功能!


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

         ###建表###

         CREATE TABLE "SPORTS"."LINEUP"("ID" NUMBER NOT NULL,
              "TYPE" NUMBER(3) NOT NULL,
              "BODY" VARCHAR2(100) NOT NULL,
              "HITS" NUMBER(10) DEFAULT 0 NOT NULL,
              PRIMARYKEY("ID"))
         TABLESPACE "TS_SPORTS"

         ###建序列###

         CREATE SEQUENCE "SPORTS"."SPORTS_LINEUP_ID_SEQ" INCREMENT BY 1
         START WITH 1 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
         CACHE 50 NOORDER

         ###建自动更新的触发器###

         CREATE OR REPLACE TRIGGER "SPORTS"."SPORTS_LINEUP_ID_TRIGGER"
         BEFORE INSERT ON "SPORTS"."LINEUP" FOR EACH ROW
         DECLARE
         next_id NUMBER;
         BEGIN
         --Get the next id number from the sequence
         SELECT sports_lineup_id_seq.NEXTVAL INTO next_id FROM dual;

         --Use the sequence number as the primarykey
         --for there cord being inserted.
         :new.id:=next_id;
         END;

    ###建保护PRIMARYKEY的触发器###

         CREATE OR REPLACE TRIGGER "SPORTS"."LINEUP_ID_UPDATE_TRIGGER"
              BEFORE UPDATE OF "ID" ON "SPORTS"."LINEUP" FOR EACHROW
         BEGIN
         RAISE_APPLICATION_ERROR(-20000,
         'sports_lineup_id_update_trigger:Update sof the ID field'
         ||'arenotallowed.');
         END;

    ###建删除的触发器###
         create   or replace trigger tr_bis_exc_req_del
         before delete
              on bis_exc_req
              referencing old as old new as new
         for each row
         begin
            if :old.check_status = '3' then
            raise_application_error (-20001,'*****!');
            return;
            end if;
         end;
         /


    ###建更新的触发器###
         create   or replace trigger tr_bis_exc_req_upd
         before update
              on bis_exc_req
         referencing old as old new as new
         for each row
         begin
            if :old.check_status = '3' then
            raise_application_error (-20001,'*******!');
            return;
       end if;
      end;

  • 相关阅读:
    解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”
    解决SharePoint 2013 designer workflow 在发布的报错“负载平衡没有设置”The workflow files were saved but cannot be run.
    随机实例,随机值
    Spring4笔记
    struts2笔记(3)
    struts2笔记(2)
    获取文本的编码类型(from logparse)
    FileUtil(from logparser)
    DateUtil(SimpleDateFormat)
    struts2笔记
  • 原文地址:https://www.cnblogs.com/GeneralXU/p/1425748.html
Copyright © 2011-2022 走看看