如何生成唯一的序列号

wglee 2000-01-18 11:41:00
请问如何自动生成数据库的关键字段值?
...全文
2547 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆 2000-01-25
  • 打赏
  • 举报
回复
可以写一个存储过程通过后台数据得到唯一的序列号嘛
Landy 2000-01-23
  • 打赏
  • 举报
回复
如果是大型数据库最好是利用trigger和存储过程来生成唯一编号,这样肯定是最好的
wglee 2000-01-20
  • 打赏
  • 举报
回复
谢谢各位的指教!我记得在<<计算机世界>>或<<中国计算机报>>上有有关的文章,只是一时疏忽,未摘录,现在也想不起来究竟在哪一期上了.辛有各位指教,得以非浅.
929 2000-01-20
  • 打赏
  • 举报
回复
在DELPHI中在DEMO\DB\BKQUERY 有一个后台查询例子,其中在RESLTFRM单元中用函数GetUniqueNumber对变量GUARD进行操作,说可保证产生唯一数,可试一下
supershan 2000-01-19
  • 打赏
  • 举报
回复
根据数据不同,有不同的处理,数据库结构可设置自动增加字段类型,如不行可取随机数或最大号加1.
Firing_Sky 2000-01-19
  • 打赏
  • 举报
回复
给字段设一个自增值
CJ 2000-01-19
  • 打赏
  • 举报
回复
1、建立一个表,一个字段,一条记录,为0
2、每次需要时,锁表,把此值加1取出(当然数据库中的也要更新)、保存,解锁。
3、OK?
实在不行,取COM的GUID吧?呵呵。
WHQ 2000-01-18
  • 打赏
  • 举报
回复
补充:比如你找一个比你预计的记录数稍大的一个素数M,再找一比M小几倍的素数N,对于你的第i条记录,其序列号No = i*N%M,如果M和N取得较合适时,序列号就会分布得比较均匀。对于非数字的序列号,可再找一个单值函数由此数产生。
WHQ 2000-01-18
  • 打赏
  • 举报
回复
每添加一条记录时,主键自动增一不行吗?
chengxin 2000-01-18
  • 打赏
  • 举报
回复
如数据库有 identify 型字段 可使用此类型字段
wglee 2000-01-18
  • 打赏
  • 举报
回复
对.但是不能与已有的值重复.
zdg 2000-01-18
  • 打赏
  • 举报
回复
是指一个随机数吗???
barton 2000-01-18
  • 打赏
  • 举报
回复
这样的事情一般交给数据库去处理。不过如果你非要用Delphi来处理的话,也可以。

给你一个好主意:取这个表中的最大ID号,然后将这个ID加1就是最合适的序列号。
darkness 2000-01-18
  • 打赏
  • 举报
回复
In Oracle,u can use
Create sequence test_sequence increment by 1
start with 1 maxvalue 999999 cycle order
later,u can use test_sequence.nextval to get the unique key.
every time u use it,it can automatically increase by 1.
for example,
insert into test_table(id,name) values(test_sequence.nextval,'Mike')
jing 2000-01-18
  • 打赏
  • 举报
回复
你用的数据库是?
象SQL SERVER ,ACCESS...等都有AutoNumber的类型
如果要生成特别的单号:
'Dim MyDB As Database, MYSET As Recordset
Dim CurrentTime As String
Dim CurrentTime1 As String
Dim TempCount As Integer
Dim Max As Variant
Dim AdoTemp As ADODB.Recordset
Dim comp_code As String
Dim Count As Integer
Dim n_month As Integer, w_month As String, w_day As String, w_year As String
Dim MaxCount As Integer
'笆穝糤腹
Set AdoTemp = MyAdo
Dim x As Variant, news As Variant, newstr
If MyAdo.State = 1 Then
MyAdo.Close
End If
MyAdo.Open
Count = Len(Class) + 4
MaxCount = MyAdo.RecordCount
TempCount = MyItem
'If MaxCount <> 0 Then
' Max = Left(Right(MyAdo.Fields.Item(TempCount), count), 4)
'End If
w_year = Year(MyDate)
w_month = Month(MyDate)
If w_month < 10 Then
w_month = "0" + w_month
End If
CurrentTime1 = CStr(w_year) + CStr(w_month)
'comp_code = DLookup("company_code", "dpif09", "") //そ嘿ぃ莉眔
'news = DMax(Myfield, Mytable, Myfield & " Like '" & Left(comp_code, 2) & w_month & w_day & "*'")
If MaxCount - 1 <> 0 Then
With AdoTemp
.MoveFirst
While Not .EOF
If (Not IsNull(.Fields(TempCount))) Then
CurrentTime = Mid(.Fields(TempCount), 2, 6)
Else
If IsNull(CurrentTime) Then
CurrentTime = 0
End If
End If

If CurrentTime1 = CurrentTime Then
If Max < Mid(.Fields.Item(TempCount), 8, 4) Then
Max = Mid(.Fields.Item(TempCount), 8, 4)
End If
End If

.MoveNext
Wend
End With

If IsNull(Max) Then
Max = 0
End If

news = Max
If IsNull(news) Or news <> "" Then
newstr = Format(CStr(Max + 1), "0000")
Else
newstr = "0001"
End If
Else: newstr = "0001"
End If

'If Language = "china" Then
NewNo2 = Factory & w_year & w_month & w_day & newstr & Class
'End If
LaoZheng 2000-01-18
  • 打赏
  • 举报
回复
比如Table 中Id为唯一的序列号(int)字段
当增加记录时取出id=Max(id)+1,则id 为唯一的序列号
zyb 2000-01-18
  • 打赏
  • 举报
回复
用自动增量在删除操作后会留下空号,我在编程时自己定义一个LongInt型唯一序列号,在对表进行操作时进行手动增减,可以定期清理空号,稍微占用点机时。
渤海海峡 2000-01-18
  • 打赏
  • 举报
回复
对于不同的数据库要不同对待:
有自动增量字段的和象interbase这样有生成器的可以象以上各位所说的那样做,
如果数据库本身没有这样的功能,那只有自己办了,这样的问题在做网络开发时
比较突出,我一般的处理方法是用一个表存键值,而且这个键值的前面放上计算机的
名字,这样就是几台计算机的也可以保证键值的唯一。
Herbert 2000-01-18
  • 打赏
  • 举报
回复
不必那么复杂,您可以用Delphi所附带的InterBase中的GENERATOR实现,具体语法是:
CREATE GENERATOR MyKeyNo;
然后在您的数据库中用一个Trigger调用一下GEN_ID(MyKeyNo)即可。您以后就可以再也不用管这个字段了,增加时InterBase会自动给您生成新的号码,只不过删除时会留下空号码。
wglee 2000-01-18
  • 打赏
  • 举报
回复
如果库中的记录需要删除呢?
加载更多回复(1)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧