大虾们请进...(100分)

  • 主题发起人 主题发起人 Tintin
  • 开始时间 开始时间
T

Tintin

Unregistered / Unconfirmed
GUEST, unregistred user!
使用Delphi4+SQLServer7做C/S,需要一个生成序列号
的函数来生成主键字段的ID号,我想最好是以年月日的
方式生成,如'200002230001','200002230002'这个还
比较好办,主要是如何控制ID的连续性和唯一性,不知诸位
有什么高招?能提供完整函数者100分,提出好建议者
10-50分。(这可是造福芸芸众生的好事呀,分不够再加)
 
sql server本身不是就有这个功能嘛!
 
估计一下每天可能加的最多字段数,留出位置,就象你
提出的那样,然后就好办了,每次要加的时候,保留住最大id,
不过要考虑一下冲突的问题。
 
SQLServer自带的自增字段功能太弱,并不能反映一些有价值的信息,
所以我才想到将他扩充,这样通过主键获得该记录的取得时间,此问
题的主要难度在于并发情况下保证ID的连续性和唯一性(不考虑连续
性也给分-〉写出函数) :)
 
begin transaction
select max(id) as a from table1
b=1
if left(a,10) equal today then b=strtoint(right(a,5))+1
convert today+b to string c
insert into table1 (id....) values (c....)
end transaction
 
在服务器上建一存储过程,保存记录时调用存储过程.
该存储过程接受日期参数,找到当天最大编号,把编号加一
 
并发环境吓,max(id) 能保证是最大吗?

cytown: 你小子怎么老不来?忙些什么?
 
同cytown的做法一样,只是用存储过程对处理并发性更好一些.
 
呵呵, 我那个就可以写成sp呀.
max(id)当然可以保证是最大的, 注意格式是'200002230001','200002230002'.

最近比较忙, 不过过几天可能会更忙:-(
有可能会改去编php/jsp on linux/solaris了:-)
 
Thanks All,
请继续...
 
max(id)可不能保证有用啊
要是有2个客户端同时在找max id,
都找到一个相同数字,举个例子,100吧
然后都要写入 101, 那不就出问题了
 
呵呵, 所以才要transaction才行呀:-)
 
"QLServer自带的自增字段功能太弱,并不能反映一些有价值的信息,所以我才想到
将他扩充,这样通过主键获得该记录的取得时间"
用一个字段同时表示获得记录的时间和唯一标示记录的id?
这样是不是违反了数据库第一范式?
为什么不用两个字段表示:自增字段 id ;时间日期字段:cur_time,
我认为这样更好一些 :)
 
sql server我还不熟, 我提个见意吧.
1. 有否象oracle中的select * from table1 for update
2. 能否lock table
3. 表中只有一条记录,两个字段为date char(8), serialno char(4)
procedure 描述如下
开始事务;
if not exists(select * from table1)
insert into 今天日期+'0001'
else
update table1 set field1=field1 --锁定记录
.... --取记录,若是当天的, 则加序号; 否则为 今天日期+'0001'
结束事务;
 
还有吗?没有我要分分了...
 
多人接受答案了。
 
后退
顶部