前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle 设置ID自增

Oracle 设置ID自增

作者头像
郭顺发
发布2023-07-07 11:34:49
5240
发布2023-07-07 11:34:49
举报
文章被收录于专栏:pandacode_cnpandacode_cn

1. 先有个表

代码语言:javascript
复制
# 首先得有个表
create table t_user(
user_id number not null primary key,
user_name varchar2(30),
credits number,
user_password varchar2(32),
last_visit date,
last_ip varchar2(23)
)

2. 创建一个序列

转载自:https://blog.csdn.net/jiejie5945/article/details/44198283

代码语言:javascript
复制
# 为这个表创建序列
create sequence T_USER_SEQ
minvalue 1
maxvalue 999999999999999999999999999
start with 21
increment by 1
cache 20;

参数描述:

  • create sequence seq_name:创建序列,seq_name为序列名称
  • minvalue:自增最小值,缺省值为nominvalue,即不设置最小值。
  • maxvalue:自增最大值,缺省值为nomaxvalue,即不设置最大值;系统能产生的最大值为10的27次方。
  • start with:自增开始值,设置成21则从21开始自增。
  • increment by:自增数值,设置成1则每次递增1,负数表示递减,缺省值为1。
  • cache:定义缓存序列的个数,缺省值为20,nocache表示不设置缓存;使用缓存可以提高序列的性能,但数据库出错时会造成数据丢失使序列不连续。
  • NOCYCLE:一直累加,不循环
  • cycle:定义当序列达到最大/小值后是否循环,缺省值为不循环;nocycle:不循环;**cycle:循环;如果不使用循环达到限制值后继续产生新值就会出错;使用循环达到最大值后的下一个值为1,和start** **with**设置的值无关,递增还是increment **by**设置的值;

2.1. 序列详细描述

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

可以使用sequence的地方:

  • 不包含子查询、snapshotVIEWSELECT 语句
  • INSERT语句的子查询中
  • NSERT语句的VALUES
  • UPDATESET

可以看如下例子:

代码语言:javascript
复制
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.2. 调整序列

你或者是该sequenceowner,或者有ALTER ANY sequence权限才能改动sequence。 可 以alterstart值之外的所有sequence参数。如果想要改变start值,必须drop sequencere-create。例子:

代码语言:javascript
复制
ALTER sequence emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 到10000后从头开始
NOCACHE;

影响sequence的初始化参数: sequence_CACHE_ENTRIES = 设置能同时被cachesequence数目。

可以很简单的Drop sequence DROP sequence order_seq;

3. 创建一个触发器

代码语言:javascript
复制
create or replace trigger t_user_tr
before insert on t_user
for each row
begin
select t_user_seq.nextval into :new.user_id from dual;
end t_user_tr;

参数描述:

  • t_user_tr: 随意的名字,不要重复就行
  • t_user: 表名
  • user_id :自增的id

删除触发器:

代码语言:javascript
复制
DROP TRIGGER trigger_name;

参数描述

  • trigger_name:要删除的触发器的名称。

4. 测试

代码语言:javascript
复制
insert into t_user values(null,'xiaoming',123,'1114',sysdate,'192.168.37.132');
insert into t_user values(null,'xiaoming1',123,'1114',sysdate,'192.168.37.132');
insert into t_user values(null,'xiaoming1',123,'1114',sysdate,'192.168.37.132');
insert into t_user values(null,'xiaoming1',123,'1114',sysdate,'192.168.37.132');
insert into t_user values(null,'xiaoming2',123,'1114',sysdate,'192.168.37.132');
insert into t_user values(null,'xiaoming',123,'1114',sysdate,'192.168.37.132');
insert into t_user values(null,'xiaoming',123,'1114',sysdate,'192.168.37.132');
insert into t_user values(null,'xiaoming',123,'1114',sysdate,'192.168.37.132');
insert into t_user values(null,'xiaoming',123,'1114',sysdate,'192.168.37.132');
insert into t_user values(null,'xiaoming',123,'1114',sysdate,'192.168.37.132');

select * from t_user

参考文章

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 先有个表
  • 2. 创建一个序列
    • 2.1. 序列详细描述
      • 2.2. 调整序列
      • 3. 创建一个触发器
      • 4. 测试
      • 参考文章
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档