`
tanglong8848
  • 浏览: 67299 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

oracle 表中字段自增长

 
阅读更多
分类: 数据库
<!-- 正文开始 -->
在MySql中,可以有选项可以选择该字段是否自增长。但在oracle 表中没有这个功能,要想字段自增长,通过“序列”和“触发器”来实现。
原理如下:当要往字段A中插入记录时,通过触发器,调用序列,产生序列的下一个值。

序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。
CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}];

INCREMENT BY 用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的。

START WITH 定义序列的初始值(即产生的第一个值),默认为1。

MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。

MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。

CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。

CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

创建序列

CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 10 MAXVALUE 9999999 NOCYCLE NOCACHE;

删除序列

DROP SEQUENCE ABC;

说明:以上创建的序列名为ABC,是递增序列,增量为1,初始值为10。该序列不循环,不使用内存。没有定义最小值,默认最小值为1,最大值为9 999 999。

序列的使用

如果已经创建了序列,怎样才能引用序列呢?方法是使用CURRVAL和NEXTVAL来引用序列的值。

序列名.NEXTVAL

序列名.CURRVAL.

触发器

是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。

功能:

1、 允许/限制对表的修改

2、 自动生成派生列,比如自增字段

3、 强制数据一致性

4、 提供审计和日志记录

5、 防止无效的事务处理

6、 启用复杂的业务逻辑

触发器的组成部分:

1、 触发器名称

2、 触发语句

3、 触发器限制

4、 触发操作

1、 触发器名称

create trigger biufer_employees_department_id

命名习惯:

biuferbefore insert update for each row

employees 表名

department_id 列名

2、 触发语句

比如:

表或视图上的DML语句

DDL语句

数据库关闭或启动,startup shutdown 等等

before insert or update

of department_id

on employees

referencing old as old_value

new as new_value

for each row

说明:

1、 无论是否规定了department_id ,对employees表进行insert的时候

2、 employees表的department_id列进行update的时候

3、 触发器限制

when (new_value.department_id<>80 )

限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。

其中的new_value是代表更新之后的值。

4、 触发操作

是触发器的主体

begin

:new_value.commission_pct :=0;

end;

主体很简单,就是将更新后的commission_pct列置为0

触发:

insert into employees(employee_id,

last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )

values( 12345,’Chen’,’Donny’, sysdate, 12, ‘donny@hotmail.com’,60,10000,.25);

select commission_pct from employees where employee_id=12345;

触发器不会通知用户,便改变了用户的输入值。

触发器类型:

1、 语句触发器

2、 行触发器

3、 INSTEAD OF 触发器

4、 系统条件触发器

5、 用户事件触发器

自增长这里用到的是语句触发器,即碰到insert语句的时候触发。
//建表
create table DT_USER
(
ID NUMBER(10) not null,
LOGIN_NAME VARCHAR2(255 CHAR),
NAME VARCHAR2(255 CHAR),
constraint USER_ID primary key(ID)
)
//建序列
create sequence SEQ_ID
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;
//建触发器
create or replace trigger Increase_GroupId
before insert on dt_group
for each row
when (NEW.ID IS NULL)
declare
-- local variables here
begin
SELECT SEQ_ID.NEXTVAL INTO :NEW.ID FROM DUAL;
end Increase_GroupId;
实验:
insert into DT_USER(LOGIN_NAME,NAME) values('Sunyu','hujun2')
insert into DT_USER(LOGIN_NAME,NAME) values('Sunyu','hujun2')
分享到:
评论

相关推荐

    oracle触发器实现主键自动增长

    oracle触发器实现主键自动增长操作

    oracle字段自增长

    完成Java编程过程中数据存储序号自增长。

    oracle设置主键自动增长

    oracle设置主键自动增长 首先,你要有一张表! 然后,你需要一个自定义的sequence  以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle...

    oracle 创建字段自增长实现方式

    mysql等其他数据库中有随着记录的插入而表ID自动增长的功能,而oracle却没有这样的功能,我们有以下两种方式可以解决字段自增长的功能。  因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式。 ...

    实现oracle数据库字段自增长(两种方式)

    主要通过两种方式实现oracle数据库字段自增长,第一种方式是序列+触发器,第二种方式序列+显示调用序列,需要的朋友可以参考下

    两种oracle创建字段自增长的实现方式

    介绍了两种oracle创建字段自增长的实现方式,一是序列+触发器,二是序列+显示调用序列,需要的朋友可以参考下

    对有自增长字段的表导入数据注意事项

    您可能感兴趣的文章:SQL Server设置主键自增长列(使用sql语句实现)oracle中的ID号实现自增长的方法mysql修改自增长主键int类型为char类型示例自增长键列统计信息的处理方法实现oracle数据库字段自增长(两种方式)

    Oracle使用序列创建自增字段

    Oracle使用序列创建自增字段,自增长列。

    oracle数据库id为uuid类型时自动生成id

    oracle数据库id为uuid类型时自动生成id的工具类,不再依赖sequence自增长

    oracle 实际值超过数据库某个字段指定长度报错解决

    常见的场景是oracle sequence自动增长,系统用到一定的时候,sequence的值不断的增大,系统开始报错。 解决方法:更改字段的长度解决 您可能感兴趣的文章:Oracle+Mybatis的foreach insert批量插入报错的快速解决...

    ORACLE分区

    禁止undo tablespace自动增长 alter database datafile 'full_path\undotbs01.dbf' autoextend off; 2.-- 创建一个新的小空间的undo tablespace create undo tablespace undotBS2 datafile 'full_path\UNDOTBS02....

    Oracle常用的命令如何查看表的结构

    5 autoExtend on next 10M --空间的自动增长的值是10M 6 permanent online; --永久使用 3.创建用户 7 create user shi --创建用户名为shi 8 identified by scj --创建密码为scj 9 default tablespace 表空间名 -...

    最全的oracle常用命令大全.txt

    如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句: SQL&gt;select column_name,comments from dict_columns where table_name='USER_INDEXES'; 依此类推,就可以轻松知道数据字典的详细...

    ORACLE实现字段自增示例说明

    下面用一个例子来说明如何实现oracle中字段的自增。 首先,创建一个表格SuperAmin 代码如下: create table SuperAdmin( ID number(11) primary key, Name varchar(11) not null unique, Password varchar(11) not ...

    Oracle 和 mysql的9点区别

    1.组函数用法规则 mysql中组函数在select语句中...ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。CREATE SEQUENCE序列号的名称(最好是表名+序列号标记)I

    ORACLE9i_优化设计与系统调整

    §9.10.2 对增长表进行规划和分析 112 第10章 数据库结构设计要点 113 §10.1 分析阶段的对表的理解 113 §10.2 正确的主键字段的选择 113 §10.3 字段类型及长度的选择 113 §10.3.1 如果能用字符型就不要用数字型 ...

    MySQL转换Oracle的需要注意的七个事项

    Oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。 CREATE SEQUENCE 序列号的名称 (最好是表名 序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 ...

Global site tag (gtag.js) - Google Analytics