SQL 数据库中如何自动生成订单号

比如SOD130103001,听着!!!不要跟我说从表中选最大的ID然后再拼起来,考虑并发!并发!!!假如,某一秒内有3000个订单下来,这时候选最大ID会失效,最好用存储过程,GUID那个不方便记录。

SQL server中可以用sequence来实现订单号的自动生成。
例如创建如下序列:
create sequence orderSeq
as bigint --数据类型
start with 100000 --开始值
increment by 1 --增量
minvalue 1 --最小值
maxvalue 1000000--最大值
no cycle --不循环
cache 3 --设置cache大小为3
这样订单号就会从100000开始每次自增1生成。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-02-01
不知道你什么数据库

如果是 Oracle 或者 DB2 或者 SQL Server 2012

那么果断的使用 序列号 Sequence 来处理。追问

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 这样处理。
你没有表, 我也能创建序列号, 也能递增。
不要求你表里面, 有一列 和我序列号一样的数据。

本回答被提问者采纳
第2个回答  2013-02-01
如果只有数字的话采用自动编号,有字母的话,建议不用订单号做主键 这样就不会考虑并发问题了。
例如两个表 A表里面有ID字段 自动增加类型,在A表创建一条记录后获取当时创建的ID号,这个用存储过程很容易(sql server里面,oracle不清楚),在B表里面 订单号就用字母加ID 不会重复。
一秒1000条不清楚,但是150条/秒 ,是没问题的,我做过。追问

ID有一点我很烦恼,就是我想在增加到1000的时候将ID复位为1值开始,但是复位之后我就插不进去了 ,因为ID好像是默认的主键,这个有解决办法吗?还有如果我没有ID这个字段。

第3个回答  2013-02-01
在你的数据库中设定一个自增列呗,订单号就根据自增列产生。例如列号1,订单就是SOD0000001,这个插入成功就会自动生成订单号,又不会重复。追问

那订单号就不存储在数据库中了吗 我打算用他做主键的

追答

为什么不能存储在数据库中,你这样写(假设就两列,ID-自增列,ShopOrder-你要的Key),表明叫UniqID.

Insert into UniqID (ShopOrder) Values('Temp')
Update UniqID Set ShopOrder = 'SOD' + Right(1000000 + ID,6)
Where ShopOrder = 'Temp'
如果你一定要这列的话。何必太在意Key在这列上。

相似回答