怎樣生成唯一、連續自動加一的字段

hychieftain 2003-03-27 07:36:38
公司開發ERP系統,VB+SQL Server,建表時一直用Identity這個來生成主鍵,如訂單ID,發票ID等,但現在有一個問題是用Identity字段不能保証連續,經常有斷號現象,現在已經用DBCC CHECKINDENT命令強制取最大值,但這個命令需要較高的權限的數據庫管理員才能執行,影響系統安全。
請問大家開發時用的什麼辦法?
...全文
21 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hychieftain 2003-03-27
  • 打赏
  • 举报
回复
to happydreamer(黑DD)
按你給的例子,如果有幾個用戶幾乎同時新增一筆供應商記錄,有一個或二個用戶輸入錯誤,
用IDENTITY的話,這二筆記錄的所佔的IDENTITY值不會放開,所以造成斷號。
例 現在ID號是'PU0003032703,張三輸入一筆記錄,它會佔有'PU0003032704',這時李四也輸入,但張三輸入失敗時,這個號還被張三輸入的這筆記錄所佔,那李四輸入完後存盤就是'PU0002032705',這樣是不充許的。
你有什麼好建議呢?
hychieftain 2003-03-27
  • 打赏
  • 举报
回复
用DBCC CHECKIDENT 運行速度可能是最快的。
to yeag(云中人)
你公司用這種辦法,性能怎麼樣呢?
to cgm0
專門寫個存儲過程,能詳細一點嗎?
happydreamer 2003-03-27
  • 打赏
  • 举报
回复
给个思路

我是这样编号的PU00020302001
PU-purchase的缩写, 0002-供应商标号(对应供应商表)
0302--'2003-02' 001-该月的编号

如: PU00020303004 是2003-03 的第4张单据
cgm 2003-03-27
  • 打赏
  • 举报
回复
专门写一个建立主键的存储过程,用一个表存放当前主键值。每次调用这个过程,值加一。
wzbstudy 2003-03-27
  • 打赏
  • 举报
回复
declare @cou;
select @cou=count(*) from table;
delcare @max;
select @max=max(id) from table;
if @max>@cou
begin
while @max>0
begin
insert into table2 values(@i);
select @max=@max-1;
end
end
--漏号
select * from table2 where id not in(select id from table)


我只会这样写。用游标也可以
yeag 2003-03-27
  • 打赏
  • 举报
回复
我们的做法是用一个函数来实现,在这个函数中,可根据表名,在相应表中录找漏号或最大号。
pengdali 2003-03-27
  • 打赏
  • 举报
回复
建立一int类型标号

插入时:
insert 表 select isnull(max(编号),0)+1,'其他常量',@其他变量 from 表

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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