当你想在一张表设置一个column来记录编号或流水号
如:
create or replace table test_sq
(
id number(3),
dd varchar2(20)
);
/
在第二列里插入系统日期,同时在第一列里自动编号(从1开始,每插入一行记录,id就自动加1)
这个时候,我们就可以用到oracle的sequence了。
以上例为例,我们来创建一个序列newsq,语法如下:
create sequence "newsq" increment by 1 start with 1 minvalue 1 maxvalue 999 cycle nocache order;
说明:
increment by 表示序列的增量,可正可负
start with 表示序列的初始值
minvalue 最小值
maxvalue 最大值
cycle 循环使用,用大最大值再返回
nocache 不使用cache,这样不影响数据库性能,自身处理会慢点,较安全,对 于多个实例使用同一个序列,则需要使用cache
order 顺序使用序列值
要使用sequence,还必须用上oracle的triger(触发器)
通过triger来告诉数据库,在向表test_sq里插入记录时要用序列newsq.语法如下:
create or replace trigger insert_newsq
before insert on test_sq
referencing old as old new as new
for each row *表明在向test_sq插入每一行之前触发
begin
select newsq.nextval into :new.id from dual;
*读取newsq的下一个值赋给test_sq的新id
exception
when others then
-- consider logging the error and then re-raise
raise;
end insert_newsq
现在,我们创建的序列就可以工作了!
可以测试下:
insert into test_sq(dd) values(sysdate);
如果,我们希望序列包含更多的信息,比如日期等,以便日后做统计用,可以吗?
当然可以!
我们可以在triger那里打主意:)
比如我们要在序列里加上日期20030225xxx,后面的xxx表示是从序列里的来值。
先要更新表:
alter table test_sq modify (id number(11) ) *扩展列宽
然后修改triger
create or replace trigger insert_newsq
before insert on test_sq
referencing old as old new as new
for each row begin
select to_char(sysdate,'yyyymmdd')||lpad(newsq.nextval,3,'0') into :new.id from dual;
exception
when others then
-- consider logging the error and then re-raise
raise;
end insert_newsq
ok,再插入一个值看看发现序列变漂亮了吧!
<script type="text/javascript">ShowMagicFace();</script>
如:
create or replace table test_sq
(
id number(3),
dd varchar2(20)
);
/
在第二列里插入系统日期,同时在第一列里自动编号(从1开始,每插入一行记录,id就自动加1)
这个时候,我们就可以用到oracle的sequence了。
以上例为例,我们来创建一个序列newsq,语法如下:
create sequence "newsq" increment by 1 start with 1 minvalue 1 maxvalue 999 cycle nocache order;
说明:
increment by 表示序列的增量,可正可负
start with 表示序列的初始值
minvalue 最小值
maxvalue 最大值
cycle 循环使用,用大最大值再返回
nocache 不使用cache,这样不影响数据库性能,自身处理会慢点,较安全,对 于多个实例使用同一个序列,则需要使用cache
order 顺序使用序列值
要使用sequence,还必须用上oracle的triger(触发器)
通过triger来告诉数据库,在向表test_sq里插入记录时要用序列newsq.语法如下:
create or replace trigger insert_newsq
before insert on test_sq
referencing old as old new as new
for each row *表明在向test_sq插入每一行之前触发
begin
select newsq.nextval into :new.id from dual;
*读取newsq的下一个值赋给test_sq的新id
exception
when others then
-- consider logging the error and then re-raise
raise;
end insert_newsq
现在,我们创建的序列就可以工作了!
可以测试下:
insert into test_sq(dd) values(sysdate);
如果,我们希望序列包含更多的信息,比如日期等,以便日后做统计用,可以吗?
当然可以!
我们可以在triger那里打主意:)
比如我们要在序列里加上日期20030225xxx,后面的xxx表示是从序列里的来值。
先要更新表:
alter table test_sq modify (id number(11) ) *扩展列宽
然后修改triger
create or replace trigger insert_newsq
before insert on test_sq
referencing old as old new as new
for each row begin
select to_char(sysdate,'yyyymmdd')||lpad(newsq.nextval,3,'0') into :new.id from dual;
exception
when others then
-- consider logging the error and then re-raise
raise;
end insert_newsq
ok,再插入一个值看看发现序列变漂亮了吧!
<script type="text/javascript">ShowMagicFace();</script>