oracle实现自增的方法和碰到的问题[亲测有效]

oracle实现自增的方法和碰到的问题[亲测有效]众所周知,Oracle是没有办法像Mysql里用AUTO_INCREMENT实现自增的。 但是Oracle可以通过序列实现自增。 –以下是oracle 12c的方法 create sequence

oracle实现自增的方法和碰到的问题

众所周知,Oracle是没有办法像Mysql里用AUTO_INCREMENT实现自增的。

但是Oracle可以通过序列实现自增。

--以下是oracle 12c的方法

create sequence temp_seq
increment by 1
start with 1001;
--创建一个简单的序列
create table temp(
id number default temp_seq.nextval primary key,
name varchar2(20)
);
--创建一个表 insert into temp(name) values("测试"); insert into temp(name) values("测试"); select * from temp;

但是这里有一个小问题,就是如果已存在该id,插入会报错,因为序列是一个跟表无关的对象。不会检查id,当id存在时,序列不会继续自动跳到下一个值。

oracle实现自增的方法和碰到的问题[亲测有效]

如上图,当表已存在行id = 1005时,序列增加到1005时会违反主键约束,那么有没有一种可能,可以让这个序列跳到1006呢?

还得是触发器啊。

create sequence test_seq
increment by 1
start with 1001;
--用触发器获取此序列的值

create table test( id number
default "0" primary key, name varchar2(20) ); --这里默认值设为0是判断使不使用序列
--当不使用序列时的插入是Insert into test (id,name) values("1234","测试");
--当使用序列时的插入是insert into test (name) values("测试");
create or replace trigger test_tri before insert on test
for each row declare v_val number;
     --定义v_val,当使用序列插入时,将序列值放到将变量中。 v_num number;
     --定义v_num,判断插入时使不使用序列。 begin
if :new.id = 0 then
    --判断,当id使用的是默认值0时,代表使用序列 v_val:
=test_seq.nextval; loop select count(id) into v_num from test where id = v_val;--查看test表的id列是否已存在跟序列相同的值,如果不存在,v_num = 0 。如果存在,v_num!=0; if v_num != 0 then v_val:=test_seq.nextval;--如果存在,则序列走一步。 end if; if v_num = 0 then exit;--如果不存在,则退出loop循环 end if; end loop; select v_val into :new.id from dual;--将序列值放进插入行,实现序列自增。 end if; end; /
--实现表自增功能触发器

 如下图所示

oracle实现自增的方法和碰到的问题[亲测有效]

以上第五次使用insert into test(name) values(“测试”);进行插入时,因为表里的id已存在1005了,所以触发器会循环一次,让序列走一下,变成1006;避免违反主键唯一约束。

原文地址:https://www.cnblogs.com/wfkfytmy/archive/2022/04/15/16147204.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5367.html

(0)
上一篇 2023-05-12
下一篇 2023-05-12

相关推荐

  • Python实现列表元素删除

    Python实现列表元素删除在Python中,列表是一种常用的数据类型,它可以存储多个值,并且其中的值可以是任何数据类型,例如数字、字符串、布尔值等等。我们可以通过以下方式来创建一个列表:

    2024-08-06
    23
  • Python中使用NumPy中的matmul函数

    Python中使用NumPy中的matmul函数在数据科学的世界里,线性代数是一项必需的技能。然而,矩阵运算是非常耗费计算资源的。Python中的NumPy是一个广泛使用的科学计算库,其中的matmul函数提供了一种高效的方法来执行矩阵乘法操作。在本篇文章中,我们将深入探讨NumPy中的matmul函数及其应用,帮助读者更深入地了解这个强大的函数。

    2024-07-18
    36
  • PostgreSQL源码学习(1)Page页

    PostgreSQL源码学习(1)Page页参考PG官方文档对于Page页存储的描述。https://www.postgresql.org/docs/12/storage-page-layout.html。 The Internals of …

    2023-02-15
    151
  • 使用Python中的split函数实现字符串分割功能

    使用Python中的split函数实现字符串分割功能Python是一种高级编程语言,它的强大在于它的简单易用和优美的语法。Python提供了许多内置函数和模块,其中之一就是split函数。Split函数是Python中的一个非常重要的字符串函数,我们可以使用它对字符串进行分割操作。下面我们将从多方面详细阐述如何使用Python中的split函数实现字符串分割功能。

    2024-03-02
    79
  • 数据库监控方案_监控数据库数据变化

    数据库监控方案_监控数据库数据变化作者:李红(老李),中国开源协会(oscna.org)数据库分会成员,热衷于数据库集群架构相关方向,上海某企业MySQL数据库负责人。 本文来源:Linux备忘录(iirwt.com)出品,转载请注…

    2023-04-01
    143
  • 数据库实现主从复制「终于解决」

    数据库实现主从复制「终于解决」MySQL的主从复制

    2023-03-24
    151
  • 袋鼠云陈吉平:深耕国产自研数字化技术与服务,持续为客户创造价值[亲测有效]

    袋鼠云陈吉平:深耕国产自研数字化技术与服务,持续为客户创造价值[亲测有效]在经济面临下行压力、疫情反复等不确定因素之下,推动数字化转型就成为了许多企业的“救命稻草”。然而,较高的数字化转型门槛、不成系统的数据服务,以及缺乏规范的行业标准等都成了企业数字化转型路上的“绊脚石”

    2023-06-14
    134
  • 【计理01组05号】MySql基础课程【2.0】[通俗易懂]

    【计理01组05号】MySql基础课程【2.0】[通俗易懂]博客推行版本更新,成果积累制度,已经写过的博客还会再次更新,不断地琢磨,高质量高数量都是要追求的,工匠精神是学习必不可少的精神。因此,大家有何建议欢迎在评论区踊跃发言,你们的支持是我最大的动力,你们敢

    2023-05-08
    129

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注