首页 > 数据库 >oracle中的自动增长列的插入实现

oracle中的自动增长列的插入实现

时间:2023-05-05 18:33:16浏览次数:43  
标签:EMPID insert 21 into 插入 自动 EMP oracle


我们知道,在oracle中自动增长类型是依靠sequence类实现的,但是我们在插入一条数据时不能像sqlServer或者mySql中那么方便必须使用sequence.nextval来取得输入的值,能不能做到和Sqlserver一样吗,比如有表:

create table EMP(
 EMPID NUMBER(4) not null,
 EMPNAME VARCHAR2(4000),
 EMPPASS VARCHAR2(4000),
 EMPSEX NUMBER(1),
 EMPLEVELID NUMBER(4),
 EMPLASTLOGINTIME DATE
)


alter table EMP
add constraint EMP_PK primary key (EMPID)
然后有一个序列:
create sequence EMP_SEQ
minvalue 1
maxvalue 9999999999
start with 10
increment by 1
cache 20;
我们现在的问题是:能不能把序列EMP_SEQ与表自动绑定起来实现插入时的方便呢?

正常的插入语句是这样的:

insert into EMP (EMPID, EMPNAME, EMPPASS, EMPSEX, EMPLEVELID, EMPLASTLOGINTIME) values (emp_seq.nextval(),'Jerry','jerry',1,3,to_date('01-04-2007 12:41:21', 'dd-mm-yyyy hh24:mi:ss')

自动绑定之后应该是这样的:

insert into EMP

(EMPNAME, EMPPASS, EMPSEX, EMPLEVELID, EMPLASTLOGINTIME)
values ('tom', '202cb962ac59075b964b07152d234b70', 1, 6, to_date('01-04-2007 22:41:21', 'dd-mm-yyyy hh24:mi:ss'));

解决方法是:
在EMP表的插入时做一个触发器,自动修改插入的EMPID的值:

create or replace trigger "BI_EMP"
before insert on "EMP"
for each row
begin
select "EMP_SEQ".nextval into :NEW.EMPID from dual;
end;

这样就可以达到我们想要的效果。插入时就可以写成:

insert into EMP

(EMPNAME, EMPPASS, EMPSEX, EMPLEVELID, EMPLASTLOGINTIME)
values ('tom', '202cb962ac59075b964b07152d234b70', 1, 6, to_date('01-04-2007 22:41:21', 'dd-mm-yyyy hh24:mi:ss'));

要注意的是:由于使用触发器在自动插入empid因此在插入时上面黑体部分内容不能省略,如果省略,依然需要手工添加一个empId的值,才能正常插入,也就是说,必须这样:

insert into EMP values (任意整数值,'Jerry','jerry',1,3,to_date('01-04-2007 12:41:21', 'dd-mm-yyyy hh24:mi:ss')

否则无法正常运行,很明显这样做复杂了程序的可读性。

标签:EMPID,insert,21,into,插入,自动,EMP,oracle
From: https://blog.51cto.com/iwtxokhtd/6247410

相关文章

  • oracle比较大小函数greatest与least
    目录oracle比较大小函数greatest与least1、greatest函数取最大值2、least函数取最小值oracle比较大小函数greatest与least比较出最大或者最小值的函数,null为最大或最小的值。语法:select函数名(value_1,value_2,...,value_n)fromdual;1、greatest函数取最大值select......
  • Oracle 给用户赋予dblink权限,创建dblink
    1.判断用户是否具备创建databaselink的权限  一:查看当前登录用户(如果查询有返回行,则表示具备创建权限,否则,需要创建权限)1select*fromuser_sys_privswhereprivilegelikeupper('%LINK%');二:查询某个用户test(如果查询有返回行,则表示具备创建权......
  • oracle中用户删除不了,ORA-01940提示 “无法删除当前已连接用户”
    Oracle删除用户的提示无法删除当前已连接用户两种解决方法如下:1、先锁定用户、然后查询进程号,最后删除对应的进程、在删除对应的用户SQLalteruserXXXaccountlock;SQLSELECT*FROMV$SESSIONWHEREUSERNAME='LGDB';Oracle删除用户的提示无法删除当前已连接用户两种解决......
  • Oracle使用Impdp导入dmp文件的详细过程
    这一天为了导入这个Oracle的dmp文件,简直就是血泪史,因本人对Oracle并不是很会,随意踩了很多小白会踩的坑,因此特意记录一下过程,防备下次的使用。1、首先将你需要的dmp文件准备好,将其放在Oracle安装目录的任意位置,但是如果你想按照我的步骤来,就和我安装到相同的目录,否则会和第五步的......
  • Oracle 强行断开用户连接的方法
    1、查找目标用户的当前进程selectsid,serial#fromv$sessionwhereusername='test';2、使用上述语句会返回一个进程列表,每行有两个数字,用数字替代下面的sid和serialaltersystemkillsession'sid,serial';3、执行kill语句altersystemkillsession‘9,154......
  • Azure DevOps(三)Azure Pipeline 自动化将程序包上传到 Azure Bolb Storage
    一,引言结合前几篇文章,我们了解到AzurePipeline完美的解决了持续集成,自动编译。同时也兼顾了Sonarqube作为代码扫描工具。接下来另外一个问题出现了,AzureDevOps由于有人员限制,项目上不能给非开发人员或者外包成员开权限,这个时候就需要将编译好的程序包上传到公共网盘或......
  • Python自动寻路算法
    一、题目描述在一个迷宫游戏里,有一些小怪物要去攻击主角,现在希望给这些小怪物加上聪明的AI,让他们可以自动绕过迷宫中的障碍物,寻找到主角所在。二、解题思路迷宫游戏里的场景通常都是由小方格组成。假设我们有一个7*5大小的迷宫,图中红色格子是终点,绿色格子是起点,蓝色格子是一堵墙......
  • 【解决】mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用
    在计算机管理中启动时,发现mysql报错:mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。该问题的解决方式为:1找到Mysql的安装路径,看看有没有data文件夹,如果没有data文件夹,自己重新建一个;如果有的话,就把里面的内容全部清空,但保留该目录......
  • 3个月,从功能测试进阶到自动化测试涨薪10k,我悟了....
    ​因为我最近在分享自动化测试技术,经常被问到:功能测试想转自动化,请问应该怎么入手?有没有好的资源推荐?那么,接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。(学习路线和网盘资源放在文末了)3个月是怎么从功能测试进阶到自动化测试并且涨薪呢?今天我们就来聊一聊一......
  • C# 通过iTextSharp实现关键字签字盖章(通过在内容中插入盖章图片的形式)
    此功能通过 iTextSharp 读取PDF文档信息,并循环查找每一页PDF文件,在整个PDF中只要是符合条件的地方都会盖章,如只需要在最后一页盖章,请将方法中For循环去掉,并将PdfContentBytecontentByte=pdfStamper.GetUnderContent(i);parser.ProcessContent<PdfLocation>(i,location);......