EntityFramework实体默认值遇到Oracle自增主键

1. Oracle实现主键自动增长

一般我们在Oracle实现主键自动增长,通常通过序列加触发器实现。

定义序列用于获取递增数字

CREATE SEQUENCE 序列名

[INCREMENT BY n]

[START WITH n]              

[{MAXVALUE n | NOMAXVALUE}]

[{MINVALUE n | NOMINVALUE}]

[{CYCLE | NOCYCLE}]

[{CACHE n | NOCACHE}]

定义触发器,关联序列和表,并在插入数据前补充主键ID

create [or replace] tigger 触发器名 before insert
on 表名
[for each row]
begin
 select 序列名.nextval into :new.id from dual;
end

一般我们会加上条件以应对已经指定主键的情况

create [or replace] tigger 触发器名 before insert
on 表名
[for each row WHEN(NEW.ID IS NULL)]
begin
 select 序列名.nextval into :new.id from dual;
end

2. EntityFramework默认值带来的问题

通过触发器和序列一般我们就可以实现主键的自动增长,但是在EF中,实体中的主键会被赋值为默认值0。这导致触发器达不到触发的(默认触发条件),

这时我们就需要调整触发器执行条件:当未指定id或者id为默认值0时自动生成主键。

create [or replace] tigger 触发器名 before insert
on 表名
[for each row WHEN(NEW.ID IS NULL or NEW.ID = 0)]
begin
 select 序列名.nextval into :new.id from dual;
end

原文地址:https://www.cnblogs.com/zhangdk/p/8711304.html

时间: 2024-10-07 05:38:51

EntityFramework实体默认值遇到Oracle自增主键的相关文章

Oracle自增主键的添加[sequence]--表数据已存在

--增加主键ID alter table CLERK_COMPARE add id number(16); --设置sequence使ID自增 create sequence SEQ_ID minvalue 1 maxvalue 999999999 start with 1; --将id的值设置为sequence Update clerk_compare set id=seq_id.nextval; commit; --设置id为主键 alter table CLERK_COMPARE add

【转】oracle自增主键的添加[sequence]

注意点: 1:一个sequence可以被多个表共享. 2:被多个表共享的sequence生成的数字序列始终连续,不会重新开始. 3:如果不再使用的sequence请删除. SELECT * FROM DAYSBFJ.DAYS_CARD_UPDATE3 order by id asc --alter table DAYSBFJ.DAYS_CARD_UPDATE3 add source_Flag varchar2(2); --create sequence DAYS_CARD_UPDATE2_SEQ

如何获取数据表中自增主键的值

一.MySql数据库 当向数据库中插入一条数据的时候,默认是拿不到自增主键的值的, 需要设置如下两个属性才可以拿到主键值! 设置userGeneratedKeys属性值为true:使用自动增长的主键.使用keyProperty设置把主键值设置给哪一个属性 1 <insert id="addEmp" parameterType="com.neuedu.mybatis.bean.Employee" useGeneratedKeys="true"

INNODB自增主键的一些问题 vs mysql获得自增字段下一个值

今天发现 批量插入下,自增主键不连续了....... InnoDB AUTO_INCREMENT Lock Modes This section describes the behavior of AUTO_INCREMENT lock modes used to generate auto-increment values, and how each lock mode affects replication. Auto-increment lock modes are configured

oracle 实现 自增主键功能

转自:https://blog.csdn.net/zxh2075/article/details/78488141 之前有一项工作是将mysql的数据库实现转移到oracle,遇到了自增主键实现的问题. 首先介绍一下MySQL和Oracle的背景知识 1)MySQL建表时必须有一个主键(PRIMARY KEY), 每条主键内容必须唯一(Unique), 所以经常使用一个”ID”字段作为主键,给它一个”auto_increment”属性,让”ID”字段每条记录都自增”1″. 比如下表: 1 CRE

MySQL 插入与自增主键值相等的字段 与 高并发下保证数据准确的实验

场景描述: 表t2 中 有 自增主键 id  和 字段v  当插入记录的时候 要求 v与id 的值相等(按理来说这样的字段是需要拆表的,但是业务场景是 只有某些行相等 ) 在网上搜的一种办法是 先获取自增ID SELECT max(id)+1 from t2 然后给v字段插入获取到的值 但是这样的做法在有删除行+调整过自增值的表中是不准确的 于是换个思路 从 information_schema 下手 读取表的信息 INSERT INTO `t2` VALUES ( NULL, ( SELECT

jdbc 预编译处理 和spring返回自增主键值

利用GeneratedKeyHolder获得新建数据主键值 Spring利用GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值的方法 : int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)//该方法返回受影响的行数,同时将新增记录对应主键值赋值给generatedKeyHolder参数 Spring为KeyHolder接口指代了一个通用的实现类GeneratedKeyHolder,该

oracle 触发器实现主键自增

drop table book; --创建表 create table book( bookId varchar2(4) primary key, name varchar2(20) ); --创建序列 create sequence book_seq start with 1 increment by 1; --创建触发器 create or replace trigger book_trigger before insert on book for each row begin select

2HQL及自增主键

1HQL Hibernate Query Language是一种面向对象的查询语言,HQL的操作对象时类,实例,属性:与EJB3 QL很接近. HQL的功能非常丰富,where子句后支持的运算符异常丰富,不仅包括SQL的运算符,还包括EJB-QL的运算符等. 除了Java类与属性的名称外,查询语句对大小些并不敏感. HQL 不支持union联合查询. select子句 select子句用于确定选择出的属性,当然select选择的属性必须是from后持久化类包含的属性.例如: select p.n