oracle新增数据库表数据

那年仲夏 提交于 2020-08-13 20:19:56

oracle新增数据库表数据

一、触发器增加主键

1.建用户数据表

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

2.创建自动增长序列

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

3.创建触发器

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

4.提交

insert into dectuser(name,sex) values ('feng','男);    

引用文章:https://www.cnblogs.com/sharpest/p/10160370.html

二、selectKey标签增加主键

<insert id="addLoginLog" parameterType="map" >
          <selectKey  keyProperty="id" resultType="int" order="BEFORE">
              select nvl(max(id),0)+1 from ap_loginlog
          </selectKey>
          insert into ap_loginlog(ID,MEMBER_ID) values(#{id},#{memberId})
</insert>

说明: keyProperty是指vo类中的主键属性名称,resultType是指vo类中的主键属性类型,order有两个属性, 一个是AFTER是指限制性插入语句,一个是BEFORE是指先执行selectKey标签内的语句

select nvl(max(主键名),0)+1 from 表名

三、序列增加主键

1.创建序列

CREATE SEQUENCE loginlog_squence   
INCREMENT BY 1  
NOMAXVALUE  
NOCYCLE  
CACHE 10;

2.使用序列

<insert id="addLoginLog" parameterType="map" >
      insert into ap_loginlog(ID,MEMBER_ID) values(loginlog_squence.nextval,#{memberId})
</insert>

引用文章:https://www.cnblogs.com/uzxin/p/11930347.html

四、新增返回主键

首先是主键要自增,不然可以直接获得id

1.主键自增

<insert id="insertNews" parameterType="com.jykj.po.OaNews">
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			select
			OA_NEWS_ID.CURRVAL from dual
		</selectKey>
		insert into OA_NEWS(name) values('aaa')
</select>

字段说明: keyProperty:是去要传值的主键ID,在外面用什么接就取什么名字 order:AFTER|BEFORE 之后|之前 resultType:类型 OA_NEWS_ID:是自增的序列,写了触发器也可以使用。

2.java引用

Integer insertNews = service.insertNews(oanews);
System.out.println(oanews.getId());

字段说明: service:是service里面调用insertNews方法添加oanews这个参数,返回一个Integer的值是是否成功添加 打印的语句oanews实体类里面有一个参数是id接到添加方法中返回的id值,所以打印的语句就是添加后的id值

引用文章:https://blog.csdn.net/weixin_40620337/article/details/80675401

五、执行insert语句出错

无效的列类型: 1111

原因及解决:java.sql.SQLException: 无效的列类型: 1111
1.原因 where 占位符被传递了 NULL,在其他的博客和一些论坛中有人说还有这个原因:where 后字段既有String又有Integer造成类型冲突(经测试,不存在这个原因)

2.解决方法
明确字段类型#{str,jdbcType=VARCHAR}(字符类型),#{num,jdbcType=NUMERIC}或#{num,jdbcType=DECIMAL}(数值类型)

ORA-04098: 触发器 'DL.BRANCH_SEQ' 无效

Cause: java.sql.SQLSyntaxErrorException: ORA-04098: 触发器 'DL.BRANCH_SEQ' 无效且未通过重新验证 原因:序列建立错误,重新建立

ORA-00001: 违反唯一约束条件

java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 违反唯一约束条件 (DL.SYS_C0011056) 原因:branch_seq.nextval主键新增下一个的时候,主键重复,修改主键值

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!