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','男);
二、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>
四、新增返回主键
首先是主键要自增,不然可以直接获得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主键新增下一个的时候,主键重复,修改主键值
来源:oschina
链接:https://my.oschina.net/u/3204029/blog/4442405