oracle 实现 自增主键功能

转自:https://blog.csdn.net/zxh2075/article/details/78488141

之前有一项工作是将mysql的数据库实现转移到oracle,遇到了自增主键实现的问题。

首先介绍一下MySQL和Oracle的背景知识

1)MySQL建表时必须有一个主键(PRIMARY KEY), 每条主键内容必须唯一(Unique), 所以经常使用一个”ID”字段作为主键,给它一个”auto_increment”属性,让”ID”字段每条记录都自增”1″。

比如下表:

1 CREATE TABLE Demo
2 (
3     id INT NOT NULL auto_increment PRIMARY KEY,
4     key1 VARCHAR2(40) NULL,
5     key2 VARCHAR2(40) NULL
6 );  

id是自增主键。

insert 的时候,用不着理会自增主键的value,插入新项时会自动给id赋值,插入新纪录时用不着考虑自增主键。

1 insert into Demo(key1, key2) 2 value("k1","k2")

如果是第一条纪录,插入的数据项为

id    |    key1    |    key2

1     |    k1        |    k2

2)Oracle没有这个”auto_increment”属性,所以它没法像MySQL般在表内定义自增主键。

但是,Oracle里的序列(SEQUENCE),可间接实现自增主键的作用。

序列(Sequence),又叫序列生成器,用于提供一系列的数字,开发人员使用序列生成唯一键。每次访问序列,序列按照一定的规律增加或者减少。

序列的定义存储在SYSTEM表空间中,序列不像表,它不会占用磁盘空间。

序列独立于事务,每次事务的提交和回滚都不会影响序列。

创建的方法及参数说明如下,想了解更多,可以具体查一下oracle database sequence的说明:

1 CREATE SEQUENCE SEQNAME    //序列名字
2 INCREMENT BY 1                    //每次自增1, 也可写非0的任何整数,表示自增,或自减
3 START WITH 1                       //以该值开始自增或自减
4 MAXVALUE 1.0E20                   //最大值;设置NOMAXVALUE表示无最大值
5 MINVALUE 1                           //最小值;设置NOMINVALUE表示无最大值
6 CYCLE or NOCYCLE                  //设置到最大值后是否循环;
7 CACHE 20                              //指定可以缓存 20 个值在内存里;如果设置不缓存序列,则写NOCACHE
8 ORDER or NOORDER                  //设置是否按照请求的顺序产生序列 

oracle实现自增主键,如上例,其表的创建语句如下:

1 CREATE TABLE Demo
2 (
3     id INT NOT NULL PRIMARY KEY,
4     key1 VARCHAR2(40) NULL,
5     key2 VARCHAR2(40) NULL
6 );  

没有auto_increment属性了。

插入时实现自增主键,先创建序列:

1 CREATE SEQUENCE SEQ
2 INCREMENT BY 1
3 START WITH 1
4 MAXVALUE 1.0E20
5 MINVALUE 1
6 NOCYCLE
7 CACHE 20
8 NOORDER  

插入时:

1 insert into Demo(id, key1, key2)

2 value(SEQ.NEXTVAL,"k1","k2")

然而,上述方法不适用于insert的另一种使用方式;即

1 insert into table(key1, key2) select k1, k2 from anotherTable;

所以真正设计时,应该用触发器保证自增主键的实现,如下过程:

下面用一个例子来说明自增主键的创建:

1、建用户数据表

1 drop table dectuser;
2 create table dectuser(
3      userid integer primary key,  /*主键*/
4      name varchar2(20),
5      sex varchar2(2)
6      ); 

2、创建自动增长序列

1 drop sequence dectuser_tb_seq;
2 create sequence dectuser_tb_seq minvalue 1 maxvalue 99999999
3          increment by 1
4          start with 1;   /*步长为1*/ 

3、创建触发器

1 create or replace trigger dectuser_tb_tri
2 before insert on dectuser  /*触发条件:当向表dectuser执行插入操作时触发此触发器*/
3  for each row     /*对每一行都检测是否触发*/
4 begin   /*触发器开始*/
5 select  dectuser_tb_seq.nextval into :new.userid from dual;
6 /*触发器主题内容,即触发后执行的动作,在此是取得序列dectuser_tb_seq的下一个值插入到表dectuser中的userid字段中*/
7 end;
8 /  

4、提交

现在就完成了自增主键的设定,搞定!可以检测一下。

1 insert into dectuser(name,sex) values (‘feng‘,‘男);
2      commit;  /*提交*/   

提示“已创建一行”,表示成功。

上述示例的代码,是直接引用他人的文章内容;原贴在http://shanxmxj.javaeye.com/blog/948739

自己试过此方法,但对select into感觉还是有些地方理解得不好。

原文地址:https://www.cnblogs.com/yuanshuo/p/11555868.html

时间: 2024-08-28 12:33:59

oracle 实现 自增主键功能的相关文章

【oracle11g自增主键】

oracle的自增主键需要用序列和触发器来实现, 我们首先创建一张表:主键为int,实现自增 createtableTEST ( ID intPRIMARYKEY, test1 varchar2(20), test2 varchar2(20), test3 varchar2(20) ) 创建一个序列: create sequence SEQ_TEST minvalue 1    --最小值 maxvalue 999999999999999999999999999 --最大值 start with

08Mybatis_入门程序——增加用户的操作以及返回自增主键的功能以及返回非自增主键的功能

本文要实现的功能是:给user表增加一个用户. 建表如下: 案例整体结构如下: 第一步:编写po包下面的User.java代码对应上面的数据库 package cn.itcast.mybatis.po; import java.util.Date; public class User { private int id;//主键 private String username;//用户的名称 private Date birthday;//生日 private String sex;//性别 pr

2HQL及自增主键

1HQL Hibernate Query Language是一种面向对象的查询语言,HQL的操作对象时类,实例,属性:与EJB3 QL很接近. HQL的功能非常丰富,where子句后支持的运算符异常丰富,不仅包括SQL的运算符,还包括EJB-QL的运算符等. 除了Java类与属性的名称外,查询语句对大小些并不敏感. HQL 不支持union联合查询. select子句 select子句用于确定选择出的属性,当然select选择的属性必须是from后持久化类包含的属性.例如: select p.n

mybatis自增主键返回

自增主键的返回: mysql自增主键,执行insert提交之前自动生成一个自增主键. 通过mysql函数获取到刚插入记录的自增主键: LAST_INSERT_ID() 是insert之后调用此函数. 修改insertUser定义: 非自增主键返回: 使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位. 执行思路: 先通过uuid()查询到主键,将主键输入 到sql语句中. 执行uuid()语句顺序相对于insert语句之前执行. 通过oracle的

关于mybatis用mysql时,插入返回自增主键的问题

公司决定新项目用mybatis,虽然这个以前学过但是一直没用过都忘得差不多了,而且项目比较紧,也没时间去系统点的学一学,只好很粗略的百度达到能用的程度就行了. 其中涉及到插入实体要求返回主键id的问题,以前用ssh配合oracle很容易实现,因为有sequence,而且mysql也基本没用过,所以只好去百度了. 这个内容还是比较好查的,如下: <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapp

mybatis 添加事物后 无法获取自增主键的问题

检查代码后没发现mapper文件设置自增主键返回的问题,后来检查到,关闭事务后,执行完是可以获取返回的主键的, 我在mysql的客户端里关闭自动提交,发现使用select last_insert_id() 也是可以正确获取最新主键的, 我意识到可能是mybatis配置的问题. 问同事后发现了问题,将 defaultExecutorType 从 BATCH 改为 SIMPLE 即可. 1 <?xml version="1.0" encoding="UTF-8"

MySQL 插入与自增主键值相等的字段 与 高并发下保证数据准确的实验

场景描述: 表t2 中 有 自增主键 id  和 字段v  当插入记录的时候 要求 v与id 的值相等(按理来说这样的字段是需要拆表的,但是业务场景是 只有某些行相等 ) 在网上搜的一种办法是 先获取自增ID SELECT max(id)+1 from t2 然后给v字段插入获取到的值 但是这样的做法在有删除行+调整过自增值的表中是不准确的 于是换个思路 从 information_schema 下手 读取表的信息 INSERT INTO `t2` VALUES ( NULL, ( SELECT

mycat分布式mysql中间件(自增主键)

一.全局序列号 全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键是全局唯一,而默认的MySQL的自增长主键无法满足这个要求.全局序列号的语法符合标准SQL规范,其格式为:next value for MYCATSEQ_XXXMYCATSEQ_XXX 是序列号的名字,MyCAT自动创建新的序列号,免去了开发的复杂度,另外,MyCAT也提供了一个全局的序列号,名称为:MYCATSEQ_GLOBAL 注意,MYCATSEQ_必须大写才能正确识别.MyCAT温馨提示:实践中,建议

【转】mybatis 自增主键配置

mybatis自增主键配置(?) mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同.基本上经常会遇到的就是Oracle Sequece 和 MySQL 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置. 不返回自增主键值 如果考虑到插入数据的主键不作为其他表插入数据的外键使用,那么可以考虑使用这种方式. Oracle Sequence 配置 <sql id='TABLE_NAME'>TEST_US