ID自动增加怎么设? oracle内部的存储机制没有顺序的概念,所以不可能有vfp中类似的recn()函数,只能用sequence实现,好像只能程序中实现 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 从ITPUB的精华区看来的:====================== 自增的identity如何移植? SQL Server中的identity特性给我们的工作带来了很大的方便,我们可以利用它方便的进行排序.但是在Oracle中却没有这样的特性.Oracle只有sequence的概念.sequence是事务无关性的,sequence并不是依附在表的上面,它是独立存在的,和事务是无关的.但是我们可以利用sequence来达到SQL SERVER中identity的效果.例程如下: SQL SERVER的原表结构: create table ftm07 -- 应收票据异动 ( ftg00c TYPE_v_CMPID not null, -- 公司别 ftg01c varchar(20) not null, -- 票据号码 ftg02f int identity not null, -- 流水号 ftg03d TYPE_v_DATE null , -- 状况处理日 ftg04c TYPE_v_ENUM null , -- 状况 ftg06c varchar(20) null , -- 传票管理编号 ftg07c varchar(2) null , -- 票据异动别 ftg08c varchar(20) null , -- 票据异动单号 constraint PK_FTM07 primary key (ftg00c, ftg01c, ftg02f) ) 移植至Oracle中的做法: create table ftm07 -- 应收票据异动 ( ftg00c varchar2(3) not null, -- 公司别 ftg01c varchar2(20) not null, -- 票据号码 ftg02f int not null, -- 流水号 /* SEQUENCE */ ftg03d varchar2(8) null , -- 状况处理日 ftg04c varchar2(1) null , -- 状况 ftg06c varchar2(20) null , -- 传票管理编号 ftg07c varchar2(2) null , -- 票据异动别 ftg08c varchar2(20) null , -- 票据异动单号 constraint PK_FTM07 primary key (ftg00c, ftg01c, ftg02f) ); CREATE SEQUENCE ftm07_seq INCREMENT BY 1; create or replace TRIGGER Cash_ftm07_insert_before -- 增加一个insert之前的触发器 before insert on ftm07 for each row declare i_id integer; begin select ftm07_seq.nextval into i_id from dual; :NEW.ftg02f := i_id; end; 可以从上面看到,如同SQL SERVER一样,你并不需要对ftg02f字段进行操作,触发器会帮你搞定一切.但是有一个不同需要注意了:sequence的值不能被手工重置 在SQL SERVER中可以通过dbcc checkident(表名,reseed,0)或者truncate table tableName(如果数据也不需要的话)将表中的identity栏位重置为1,而Oracle的sequence做不到这点,sequence只有达到最大值後,系统才会自动将其重置为预定的最小值. 出现什么错误?上面的方法是没错的,ORALCE中没有递增的字段,只能通过定义序列号来实现,在触发器中每插入一条记录序列号就递增一个ftm07_seq.nextval! 数据迁移报错问题 数据库备份问题 如何提高此sql執行效率 oracle能承受每秒多少此的查询请求? 大家看这个存储过程错在什么地方? impdp导入 在拨号网络下oracle8的客户端数据库和服务器端数据库如何实现同步? 为什么会出现这个问题?怎么解决啊? oracle无耻的问题?来看看! 关于把两张表的内容合成视图的编写 请问ASP中连接Oracle数据库,其连接字符串怎么写? 请教一条ORACLE中的SQL语句 急,100求解,帮女朋友。
======================
自增的identity如何移植?
SQL Server中的identity特性给我们的工作带来了很大的方便,我们可以利用它方便的进行排序.但是在Oracle中却没有这样的特性.Oracle只有sequence的概念.sequence是事务无关性的,sequence并不是依附在表的上面,它是独立存在的,和事务是无关的.但是我们可以利用sequence来达到SQL SERVER中identity的效果.例程如下:
SQL SERVER的原表结构:
create table ftm07 -- 应收票据异动
(
ftg00c TYPE_v_CMPID not null, -- 公司别
ftg01c varchar(20) not null, -- 票据号码
ftg02f int identity not null, -- 流水号
ftg03d TYPE_v_DATE null , -- 状况处理日
ftg04c TYPE_v_ENUM null , -- 状况
ftg06c varchar(20) null , -- 传票管理编号
ftg07c varchar(2) null , -- 票据异动别
ftg08c varchar(20) null , -- 票据异动单号
constraint PK_FTM07 primary key (ftg00c, ftg01c, ftg02f)
)
移植至Oracle中的做法:
create table ftm07 -- 应收票据异动
(
ftg00c varchar2(3) not null, -- 公司别
ftg01c varchar2(20) not null, -- 票据号码
ftg02f int not null, -- 流水号 /* SEQUENCE */
ftg03d varchar2(8) null , -- 状况处理日
ftg04c varchar2(1) null , -- 状况
ftg06c varchar2(20) null , -- 传票管理编号
ftg07c varchar2(2) null , -- 票据异动别
ftg08c varchar2(20) null , -- 票据异动单号
constraint PK_FTM07 primary key (ftg00c, ftg01c, ftg02f)
);
CREATE SEQUENCE ftm07_seq INCREMENT BY 1; create or replace TRIGGER Cash_ftm07_insert_before -- 增加一个insert之前的触发器
before insert on ftm07
for each row
declare
i_id integer;
begin
select ftm07_seq.nextval into i_id from dual;
:NEW.ftg02f := i_id;
end;
可以从上面看到,如同SQL SERVER一样,你并不需要对ftg02f字段进行操作,触发器会帮你搞定一切.但是有一个不同需要注意了:sequence的值不能被手工重置
在SQL SERVER中可以通过dbcc checkident(表名,reseed,0)或者truncate table tableName(如果数据也不需要的话)将表中的identity栏位重置为1,而Oracle的sequence做不到这点,sequence只有达到最大值後,系统才会自动将其重置为预定的最小值.
在触发器中每插入一条记录序列号就递增一个ftm07_seq.nextval!