博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle序列化实现主键自增长
阅读量:6883 次
发布时间:2019-06-27

本文共 2090 字,大约阅读时间需要 6 分钟。

一直都是用sql server作为开发数据库,最近因为开发新的项目使用oracle数据库,我才开始学习oracle.

学习了一段时间,发现SQL Server和Oracle还是有这很大的差别。首先,我在SQL Server中用得很顺手的自增长字段就在ORACLE中找不到了,朋友说可以用序列可以实现,于是查阅资料,整理出如下示例:

1.建立测试数据表

CREATE TABLE TEST
(
 ID NUMBER,
 NAME VARCHAR2(20),
 PRIMARY KEY(ID)
);

2.创建序列

CREATE SEQUENCE SEQ_TEST;

3.创建触发器

CREATE OR REPLACE TRIGGER AUTOINCREMENT
BEFORE INSERT ON TEST
FOR EACH ROW
WHEN (NEW.ID IS NULL)
BEGIN
SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
/

4.插入数据

INSERT INTO TEST(NAME) VALUES('NAME1');

5.查看插入结果

SELECT * FROM TEST;

 

 

其他讲解

 

这和序列的cache有关,默认cache为20,也就是每次拿出20个放到内存中,当实例崩溃或者内存清洗后则会发生断号的情况。如果你想解决这个问题,可以设置序列的cache为1 -------------------------------- 在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; 一旦定义了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会自动增加你定义的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;

转载于:https://www.cnblogs.com/pcfengzi/archive/2012/05/13/2498006.html

你可能感兴趣的文章
python 学习笔记 表达式(9)
查看>>
pku 1328 第一周训练 ——贪心
查看>>
一直以来伴随我的一些学习习惯(三):阅读方法(转载)
查看>>
查看Linux 环境系统、CPU位数
查看>>
hudson 邮件信息优化
查看>>
oracle字符集。
查看>>
Visual Studio 2010 Crystal Report 子报表 提示 您请求的报表需要更多信息 解决方案
查看>>
sql2005数据库转换成sql2000
查看>>
Hark的数据结构与算法练习之若领图排序ProxymapSort
查看>>
绕过IE10直接安装VS2013
查看>>
ASP.NET SignalR 高可用设计
查看>>
《用户体验要素》澄清了 UI 原型设计中看不见确感受得到的那一层
查看>>
HttpClient使用具体解释
查看>>
导师制
查看>>
js面向对象
查看>>
EasyUI学习之menu and button(菜单和按钮)
查看>>
微信开放平台 公众号第三方平台开发 教程一 平台介绍
查看>>
javascript有关this的那些事(某渣提出的问题)
查看>>
Java构造和解析Json数据的两种方法详解二——org.json
查看>>
using log4net on my project within a self-hosted WCF application z
查看>>