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
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 测试
参考文献:
[1]http://www.cnblogs.com/hyzhou/archive/2012/04/12/2444158.html