转自: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/sharpest/p/10160370.html

oracle 实现 自增主键功能相关推荐

  1. Mysql和Oracle获取自增主键

    mysql <!-- parameterType:参数类型,可以省略,      获取自增主键的值:         mysql支持自增主键,自增主键值的获取,mybatis也是利用statem ...

  2. Oracle创建自增主键ID(序列+触发器)

    根据需求创建了一张表,主要做插入操作,需要主键自增:把我的建表详情分享如下: -- Create table create table auto_incre (auto_id NUMBER(10) n ...

  3. oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程

    在设计数据库表的时候发现Oracle没有自增主键的设置,Google了解到Oracle本身并不支持自增主键,需要通过序列(Sequence)和触发器(Trigger)实现. 创建表Student Cr ...

  4. MySQL导入csv文件内容到Table及数据库的自增主键设置

    写在前面 目的是测试将csv文件内容导入到表中, 同时记录一下自增主键的设置. 测试采用MySQL8.0. 新建表customer_info如下, 未设置主键. 修改上表, 添加主键id, 并设置为自 ...

  5. oracle 创建表定义主键,Oracle 学习----:创建表(主键自增)

    一.创建表 create table testTable ( Id numbere, name varchar2(100), age number, createTime date, primary ...

  6. mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列

    parameterType: 参数类型, 可以省略 mysql支持自增主键,自增主键的获取, mybatis也是利用statement.getGenreatedKeys();  useGenerate ...

  7. oracle批量插入并且返回自增主键_mybatis + (oracle)实现主键自增 + 插入数据并返回主键...

    一.实现主键自增 在oracle数据库中,主键并没有办法自动增长,无法使用insert对应的useGeneratedKeys和keyProperty属性自动返回增加的主键. 要实现自增需要修改 ID列 ...

  8. datatable如何生成级联数据_通过源码分析Mybatis是如何返回数据库生成的自增主键值?...

    在Mybatis中,执行insert操作时,如果我们希望返回数据库生成的自增主键值,那么就需要使用到KeyGenerator对象. 需要注意的是,KeyGenerator的作用,是返回数据库生成的自增 ...

  9. 学习笔记 - Postgres如何创建有自增主键的表

    1.MySQL迁移到Postgres 之前用mysql习惯了,所以建表都是有自增主键的,建表规范里面大部分都是这样约定的,比如:(`id` BIGINT (11) UNSIGNED NOT NULL ...

最新文章

  1. java中遍历map的两种方式
  2. vivo应用商店电脑版_好车网APP|苹果商城、华为应用市场、腾讯应用宝、vivo应用商店、OPPO应用商店用户免费下载...
  3. 关于解决tomcat的一个错误
  4. 使用libxml提示libxml/tree.h找不到的问题解决
  5. jQuery 1.9+ 移除$.browser方法
  6. 计算机网络互联设备功能,计算机网络互联设备简介
  7. arraylist 初始化_ArrayList - 遍历ArrayList的三种方法
  8. python是什么专业-python有什么用(会计专业)
  9. 测试过程中用shell的地方_软件测试之学习shell流程控制结构
  10. 基本数据结构----顺序表
  11. ✿ iBm T60 水货入手了 满意 2005
  12. Revit二次开发-设置视图范围无限制
  13. Windows批处理文件bat学习(一)
  14. 想加薪怎么和领导谈?学会这四招轻松涨薪
  15. html5人脸拼图,面向眼机交互的界面控件设计方法研究.pdf
  16. 矩阵乘法,矩阵中各元素对应相乘及其梯度计算;
  17. Java高级之Float类和Double类的isNaN()方法
  18. 有衬线字体和无衬线字体
  19. Mysql通过binlog恢复误删数据
  20. 原型工具介绍———墨刀以及Axure RP比较

热门文章

  1. poj2229 基础的动态规划算法 挑战程序设计竞赛
  2. Python Flask服务同时接收单个、多个上传的文件
  3. SQLAlchemy 多态进阶(__mapper_args__ )、多对多标签
  4. 洛谷P2312解方程题解
  5. java基础的第二轮快速学习!day03
  6. 搭建一个jumpserver跳板机
  7. Android入门之文件系统操作(一)简单的文件浏览器
  8. 来到博客园 就要好好记录 分享技术
  9. myeclipse+8.6各个版本注册码(貌似8.5也可以)
  10. UNION,EXISTS,IN等在SQL语句中的灵活应用和场境的选择。