PS:当需要产生唯一ID的时候,MSSQL只需将ID设置为int类型,并且设置为自增长就能达到.
oracle中需要用序列+触发器 才可以达到 MSSQL中的只增长效果.(俩者还是有区别的.oracle中需要用序列类似于建了一张临时表专门用来管理序列,可以为多张表诸如A,B,C,D,E等多张表的ID都可以用这个公共的序列来做他们的主键,并且表与表的主键也不会重复.)
序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量增长的值。序列可以循环,或者是连续增加的,直到指定的最大值为止。
范例:
CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
案例:
--队列测试
CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE NOCACHE --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
--nextVal
select seqtest.nextVal from dual
select * from seqTest
select seqTest.currval from dual
--设置Shenqingdh队列
CREATE SEQUENCE seqShenqingdh
INCREMENT BY 1 -- 每次加几个
START WITH 100000001 -- 从100000001开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10 --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
--查询 (第一次要先查nextVal 值,否则直接查currval 值会报错)
select seqShenqingdh.currval from dual
select seqShenqingdh.nextVal from dual
--得到Sequence值
--定义好sequence后,你就可以用currVal,nextVal取得值。
-- CurrVal:返回 sequence的当前值
-- NextVal:增加sequence的值,然后返回 增加后sequence值
--SELECT [定义Sequence名称].CurrVal FROM DUAL;
--如得到上边创建Sequence值的语句为:
select seqShenqingdh.nextVal from dual
NEXTVAL
16100000000044
NEXTVAL
16100000000045
C#后台使用案例:
获取nextVal的值给给实体entity.SHENQINGDH赋值.
#region 获取Shenqingdh队列
var dv_seq = IBll.EntityHelper.Dal.Query(string.Format("select seqShenqingdh.nextVal from dual"));
if (dv_seq.Tables[0].Rows.Count > 0)
{
entity.SHENQINGDH = dv_seq.Tables[0].Rows[0]["nextVal"].ToString();
}
else
{
result = -1;
resultXml = GetErrorStr("获取Shenqingdh队列失败" + BAOJIANCH, result);
LogUtil.WriteLog("log", "content:" + "失败." + "|msg:" + resultXml + "|原始请求数据:" + inXML, getMaxValueByXml("sType8"));
return result;
}
#endregion
扩展插入
-- Create table
create table CXPTEST
(
id VARCHAR2(50),
content VARCHAR2(50),
remarks VARCHAR2(50)
)
tablespace TS_FYBJ
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 8K
minextents 1
maxextents unlimited
);
--insert into 表名 (id, name) values ( [定义Sequence名称].Nextval, 'sequence 插入测试');
INSERT INTO CXPTEST(ID,CONTENT) VALUES(seqShenqingdh.nextVal,'测试')
select * from CXPTEST
ID CONTENT REMARKS
1 16100000000046 测试
2 16100000000047 测试
3 16100000000048 测试