比如SOD130103001,听着!!!不要跟我说从表中选最大的ID然后再拼起来,考虑并发!并发!!!假如,某一秒内有3000个订单下来,这时候选最大ID会失效,最好用存储过程,GUID那个不方便记录。
SEQUENCE 和 IDENTITY不都是从1开始自增的么
追答Sequence + 触发器啊.
因为 Sequence 是你 获取一次以后, 下一个人获取, 就是新的了。
不需要去检索当前表的 最大值。
Sequence 初始创建的时候, 可以从 1开始, 也可以从 100 开始, 取决于你怎么创建的。
例如:
SQL> CREATE SEQUENCE test_sequence2
2 increment by 1 -- 每次递增1
3 start with 1 -- 从1开始
4 nomaxvalue -- 没有最大值
5 minvalue 1 -- 最小值=1
6 NOCYCLE; -- 不循环
Sequence created.
序号号创建好了, 就是触发器里面, 完成
订单号 := 'SOD' || TO_CHAR( test_sequence2.nextval )
如果你那个 订单号的格式, 还是 SOD 后面固定9位数字的
如果从1开始, 要求是 SOD0000001 的话
那么在使用个数据库的函数, 把 1 格式化为 0000001,
然后再用 SOD 与这个字符串合并
我当然知道它可以设置从1还是多少开始递增,问题是如果用SEQUENCE向上自增,从SOD000001增到SOD999999之后就不能再往里插了,我本来想在前面加个日期,因为SEQUENCE在机器中总有个上限,我想问一下用SEQUENCE的话要不要必须在数据库表中建一个自增字段?如果是的话,那这个SEQUENCE和订单号其中之一都可以作为主码,我只是想要其中一个,如果SEQUENCE想SQL SERVER独占一个字段的话我就不用这个了
追答要加日期, 也是一样在触发器里面处理的啊
订单号 := 'SOD' || TO_CHAR( sysdate, 'YYMMDD' ) || TO_CHAR( test_sequence2.nextval, '000' )
这样, 这个号码就是 SOD年月日 + 3位数字。
例如
SOD130202001
这种情况下, 你需要一个 数据库作业, 每天晚上, 重置 序列号。 将其重置为 从1开始。
这样比如今天 号
码跑到
SOD130202888 了, 也就是那个序列号, 当前数值是 888 了。
明天早上0点, 重置序列号, 然后序列号数值, 又从1开始。
那么明天的第一个号码,就是
SOD130203001。
SEQUENCE 是个独立的东西, 就是用于产生 序列号 从1开始, 每获取一次, 就递增1 这样处理。
你没有表, 我也能创建序列号, 也能递增。
不要求你表里面, 有一列 和我序列号一样的数据。
ID有一点我很烦恼,就是我想在增加到1000的时候将ID复位为1值开始,但是复位之后我就插不进去了 ,因为ID好像是默认的主键,这个有解决办法吗?还有如果我没有ID这个字段。
那订单号就不存储在数据库中了吗 我打算用他做主键的
追答为什么不能存储在数据库中,你这样写(假设就两列,ID-自增列,ShopOrder-你要的Key),表明叫UniqID.
Insert into UniqID (ShopOrder) Values('Temp')
Update UniqID Set ShopOrder = 'SOD' + Right(1000000 + ID,6)
Where ShopOrder = 'Temp'
如果你一定要这列的话。何必太在意Key在这列上。