oracle添加一个自增的列,Oracle创建自动增长列
为在Oracle数据库中创建序列;当向数据库中写入数据时,在使用sql语句的过程中;借助所生成的唯一值;从而使得表中的主键字段数值递增。
数据库对象中的序列项是一种允许多个用户生成唯一数字序列的对象。该对象存储于数据字典中并提供按顺序生成唯一数值的功能来简化程序设计工作。首次被查询执行时,该序列将返回预先指定的第一个值;随后每次查询都将返回比前一次递增指定步长的结果值。该序列项可以在达到最大值后重新开始(循环)或者继续递增至设定上限(非循环)。创建该对象所需的SQL语句如下所示:CREATE SEQUENCE <模式> <名称> [<START_WITH=...> [
基于起始数字、最大范围、最小范围以及步长参数的变化情况来判定数列是否为递增还是递减数列及其变化幅度大小。该选项用于阻止在达到最大范围(递增时)或最小范围(递减时)后不再生成新的数值。
在Oracle数据库系统内生成序列,在当使用SQL语句往数据库中写入数据时(或每当执行往数据库中插入数据的操作时),借助生成的唯一值从而实现主键字段的自增功能。例如:
SQL>createtable tablename
(id number notnull,…);
SQL >createsequence autoID increment by 1 start with 1 maxvalue 999999 cycle;
SQL >insertinto tablename values(autoID.nextval,...);
多个用户能够共享同一个序列;然而该机制涉及所有表格并且对于单个表格而言其主键值是唯一的并且是不连续的
使用触发器产生主键值。
在数据表设计中,有时会需要为主键字段设置自增功能。然而,在 Oracle 数据库环境中,并不提供像 MySQL 那样直接支持自动增长机制的数据类型。为了实现 Oracle 数据库中的字段自增需求,则可以通过创建 DML 触发器的方式完成这一功能。
triggers(触发器)是一些程序,在特定的数据库事件发生时自动执行操作。这些程序通常用于增强数据完整性。DML(Data Manipulation Language)是用来操作数据库中数据的数据语言,既可以由用户直接使用也可以由程序员开发并实现功能需求。基本的数据操作分为两类:查询与更新(包括插入、删除与修改)。triggers类似于函数与过程,在数据库中独立存在作为单独对象。它们能够响应一系列不同的DML(insert/update/delete)操作以及其他相关操作,并引发相应的trigger动作。每一个triggers都有自己的类型,并且每个triggers前后都可对应地创建before型与after型triggers。每一种trigger类型前后都可对应地创建before型与after型triggers以确保完整的功能覆盖范围。例如,在表上可以设置一个在insert动作前执行的动作;又或者可以在表上建立一个在update动作前执行的动作;再或者可以在表上设置一个在delete动作前执行的动作;甚至还可以在表上建立一个在insert动作后的相应处理流程等等
创建触发器的语法如下:
create[orreplace]trigger 触发器名称
{before|after|insteadof}激发触发事件
referencing_clause
[WHEN trigger_condition]
[FOR EACH ROW]
为了引用修改中的行的数据(referencing_clause),当指定trigger_condition时则首先评估该条件。当满足trigger_condition时触发器主体才会执行操作。通过将触发器与序列机制结合使用,在执行DML操作的同时自动完成主键字段的自增功能。其具体实现步骤可参考以下示例说明。
droptable book;
--创建表
createtable book(
bookId varchar2(4) primarykey,
name varchar2(20)
);
--创建序列
createsequence book_seq start with 1 increment by 1;
--创建触发器
createorreplacetrigger book_trigger
before inserton book
for each row
begin
select book_seq.nextval into :new.bookId from dual;
end ;
--添加数据
insertinto book(name) values ('cc');
insertinto book(name) values ('dd');
commit;
demo:
创建一个名为t_mid_RoleToOrg的表,并包含以下字段:FID(Primary Key)、FRolemappingid(长度为150的varchar)和FOrgNumber(长度为150的varchar)。
--创建一个序列
create sequence seq_test START WITH 1 INCREMENT BY 1 CACHE 20;
commit;
--创建触发器
create trigger seq_trigger
before insert on t_mid_RoleToOrg for each row when(new.fid is null)
begin
select seq_test.nextval into :new.fid from dual;
end;
Insert to t_mid_RoleToOrg [FRolemappingid, Forgnumber] the values '刘uster', '刘uster'.
SELECT * FROM t_mid_RoleToOrg ;
drop trigger seq_trigger;
drop sequence seq_test;
drop table t_mid_RoleToOrg;

本文原创发布php中文网,转载请注明出处,感谢您的尊重!
