`

[转]Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

阅读更多

先假设有这么一个表:

create table S_Depart  (
   DepartId             INT                             not null,
   DepartName           NVARCHAR2(40)                   not null,
   DepartOrder          INT                            default 0,
   constraint PK_S_DEPART primary key (DepartId)
);
 

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。 

1、Create Sequence 

你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限, 
CREATE SEQUENCE emp_sequence 
INCREMENT BY 1 -- 每次加几个 
START WITH 1 -- 从1开始计数 
NOMAXvalue -- 不设置最大值 
NOCYCLE -- 一直累加,不循环 
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

针对S_Depart创建的sequence如下:

create sequence S_S_DEPART
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache;

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


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

可以看如下例子:

insert into S_Depart(departId,Departname,Departorder)values(S_S_Depart.Nextval,'12345',1);
SELECT empseq.currval FROM DUAL;
 

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

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


2、Alter Sequence 
你 或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动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 
DROP SEQUENCE order_seq;

一个简单的例子:

create sequence SEQ_ID
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache
order;

建触发器代码为:

create or replace trigger tri_test_id
  before insert on S_Depart   --S_Depart 是表名
  for each row
declare
  nextid number;
begin
  IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名
    select SEQ_ID.nextval --SEQ_ID正是刚才创建的
    into nextid
    from sys.dual;
    :new.DepartId:=nextid;
  end if;
end tri_test_id;

 
OK,上面的代码就可以实现自动递增的功能了。

分享到:
评论

相关推荐

    Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍 很有用哦

    Oracle创建自增字段--ORACLE SEQUENCE的简单使用介绍

    在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方接下来为大家介绍下Oracle创建自增字段方法感兴趣的各位可不要错过了哈

    Oracle在表上建立自增字段的方法

     primary key(id) //id为主键,下面的方法把它设为自增字段  )  1、建立自增序列TEMP_TEST_IDADD,命名任意,从1开始,每次加1  CREATE SEQUENCE TEMP_TEST_IDADD INCREMENT BY 1 START WITH 1;  2、在表...

    Oracle创建自增字段–ORACLE SEQUENCE的简单使用介绍

    先假设有这么一个表: 代码... 在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。 1、Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限, CREAT

    Oracle创建自增字段sequence

    Oracle中没有sqlserver中那么方便的自增序列,如果想要达到sqlserver中那种效果,也不是很麻烦,需要创建一个自增序列SEQUENCE,然后建一个触发器即可。  CREATE SEQUENCE emp_sequence  INCREMENT BY 1 — ...

    Oracle9i中建立自增字段的最新办法

    很多人都知道在Oracle中并没有像其他数据库中的自增字段,那么我们怎样才能实现Oracle的自增字段功能呢?本文介绍了通过Oracle中的Sequence和Trigger来实现此功能。

    【总结】数据库自增字段的 3 种实现方式

    我们今天的主题就是自增字段的实现,下表列出了主流数据库中创建自增字段的几种方法: 自增字段实现方式 MySQL Oracle SQL Server PostgreSQL SQLite 标识列(IDENTITY) — :check_mark: :check_mark: :...

    简单三步轻松实现ORACLE字段自增

    代码如下: create sequence AutoID start with 1 //根据需要自己可修改该数值 increment by 1 //步长值 minvalue 1 nomaxvalue 其实到此步骤,已经可以实现字段自增了。新增记录时看如下代码: 代码如下: Insert in

    在oracle数据库里创建自增ID字段的步骤

    在oracle里使用自增ID字段的步骤比较繁琐,总结如下: — 创建表 CREATE TABLE ADVICE ( ID INT NOT NULL, ACTIVE INT DEFAULT 1 NOT NULL, TYPE INT NOT NULL, MSG VARCHAR2(512) NOT NULL, ADVICE VARCHAR2(4000)...

    oracle迁移mysql自增序列问题

    今天从oracle迁移数据到mysql碰到个需求:原先的主键字段需要改成mysql中的自增字段,而且原先数据的值不能变,以后新插入的值从原先数据最大的值开始自增。 解决办法: 构建环境: mysql> CREATE TABLE test -> ( ...

    Oracle 实现类似SQL Server中自增字段的一个办法

    创建sequence: 代码如下:CREATE SEQUENCE SEQU_DATA_DATAINFO INCREMENT BY 1 START WITH 1 NOCYCLE NOCACHE NOORDER; 2. 创建触发器: 代码如下:create or replace TRIGGER TRIG_TEST BEFORE INSERT ON TABLE1 ...

    浅析常用数据库的自增字段创建方法汇总

    DB2 代码如下:CREATE TABLE T1( id INTEGER NOT NULL GENERATED ... Oracle(需要创建一个SEQUENCE和一个TRIGGER): 代码如下:CREATE TABLE T1( id NUMBER(10,0) NOT NULL, …);CREATE SEQUENCE T1_ID_SEQ

    ORACLE实现字段自增示例说明

    Password varchar(11) not null ) 然后就是创建一个序列 代码如下: create sequence autoid start with 1 increment by 1 minvalue 1 nomaxvalue 然后在插入记录的时候就可以调用上面创建的序列来实现字段的自增了...

    oracle 实际值超过数据库某个字段指定长度报错解决

    常见的场景是oracle sequence自动增长,系统用到一定的时候,sequence的值不断的增大,系统开始报错。 解决方法:更改字段的长度解决 您可能感兴趣的文章:Oracle+Mybatis的foreach insert批量插入报错的快速解决...

    oracle 创建字段自增长实现方式

    mysql等其他数据库中有随着记录的插入而表ID自动增长的功能,而oracle却没有这样的功能,我们有以下两种方式可以解决字段自增长的功能。  因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式。 ...

    Oracle 使用触发器创建自动序列号

    --建表 drop table TEST create table TEST ...--测试 insert条语句将会自动生成自定义主键,即插入其他字段,主键在插入记录前自动生成 insert into test(test1) values('bbb'); select * from test;

    MySQL转换Oracle的需要注意的七个事项

    Oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。 CREATE SEQUENCE 序列号的名称 (最好是表名 序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 ...

    Oracle 自增(auto increment) 或 标识字段的建立方法

    下面给出ORACLE的一种实现方式,要分2步走: 1. 建立 SEQUENCE CREATE [ OR REPLACE ] SEQUENCE sequence_identity START WITH initial seed INCREMENT BY step MAXVALUE upper bound [NOMAXVALUE] NOCYCLE [empty] ...

    oracle数据库id为uuid类型时自动生成id

    oracle数据库id为uuid类型时自动生成id的工具类,不再依赖sequence自增长

Global site tag (gtag.js) - Google Analytics