如何自动生成无重复的'编号'?(50分)

  • 主题发起人 主题发起人 dptt
  • 开始时间 开始时间
D

dptt

Unregistered / Unconfirmed
GUEST, unregistred user!

我用sqlserver7数据库系统,
有一表A,其中有一字段'职员编号',
要求:在录入数据时,只需单击一按钮即可自动生成'职员编号',
该编号值在'职员字段'中是唯一的.
 
1.你可以使用SQL SERVER 的自动生成编号,此字段应为主键。
2.通过自编程序产生编号。如:
Select count(id)+1 from teablename 产生数据库中当前ID大1的编号。
 
改善kevinfu的第2点:
如用kevinfu的做法,那数据库将无法删除,因为一旦删除那么就会引起编号的错乱了。
我的做法是建一系统参数(xtcs)库,在其中记录每次增加记录后的"编号+1",而每次要增加
记录都从该数据库中取编号值。
 
用自增量,并定义为主键
 
用id=max(id)+1可解决
 
你职员编号除了唯一性这条限制外,再没有其他规定吗?
比方说:前两位表示部门编号,后几位表示部门内部编号。
对不起我把简单的问题复杂话了。
 
另建一表(table2),只有一个字段,放编号!(不要设为主键!!!)
该表第一个数据放当前最大编号+1。(如果你需用删过的编号,继续看)
从第二数据开始放删过的编号!

当需新增数据时:
table1.insert;
table2.last;
table1.filedbyname("bianhao").asint:=table2bianhao.asint;
if table2.reccounter=1 then table2biaohao.asint:=table2biaohao.asint+1
else table2.delete;
table1.post;

当删数据时:
table2.append;
table2bianhao.asint:=tabl1bianhao.asint;
table2.post;
table1.delete;
 
query1.close;
query1.sql.clear;
query1.sql.add(select max(id)+1 from mytable);
query1.open;
edit1.text:=inttostr(queru1.fields[0].asinteger);
 
用 SEQUENCE 可以吗? 我知道ORACLE 8是可以的。
不然可以自己编函数,查找当前记录最大编号,返回值自动加1。
 
kevinfu,wind2000,hwk2000,孟雯 的方法都没我的好(有点自夸的味道)
主要就是删过的纪录的编号能否从用的问题!
 
没一个好的. 都没考虑冲突可能(和唯一性的要求不符合).
唯一符合要求的是面条的回答. 不过你如果采用的话, 做好以后10天去用户那里头疼
一次(数据库乱掉了)的准备.
而且用了那玩意就别再考虑什么备份或者备份后的数据重新访问的要求了.
 
都没考虑冲突可能(和唯一性的要求不符合)????
请eyes解释一下!!!
 
我已前也有过这样的问题,不过不是人员编号,而且整个记录的编号。我的解决办法是
用当天的日期+时间。如2000090920:20:20不过这样的编号对记录的编号还可以,对人员
编号好样有点...希望对你有点帮助!!
 
考虑一下如何得到"该表当前最大编号", 然后再考虑一下两个用户<strong>同时</strong>去获得"该表
当前最大编号", 然后再考虑+1吧.
就拿您的例子来说吧.
如果两个用户的程序同时执行到Table1.FieldByname(.....) := <strong>Table2.FieldByname(...)</strong>
连小学生都知道他们两个会得到一样的编号
 
可以去当前的时间,可以吗?
 
处理此类问题有三种方法:
1.增加Identity字段。优点:最简单,也没并发性问题。缺点:只能是数字型字段。而且对数据的转移支持不够。
2.Select Max(ID)+1。优点:简单。也可不限于数字型。缺点:有并发性问题。如几台Client同时操作。
3.在某一设置表中,增加一记录保存当前值。自己管理。简写如下:
BEGIN TRANSACTION
update Settings set Value =Value+1 where Entry ='WorkerID'
Select Value from Settings where Entry ='WorkerID'
COMMIT TRANSACTION
注意:为排除并发性,1。一定要加事务。2。先Update,后Select .使用Update锁住此条记录。
 
我觉得这不是一个方法的问题,而是一个想法的问题!
什么样的编号不会重复!我想不仅仅是最大编号+1的问题吧!
也许是胡说!
 
从通用性考虑,sunkai的建议可以接受。以上都讨论c/s模式,
如果采用了缓存更新或者MIDAS技术,则zyy04的建议比较好。如果只对SQL Server( Access),
则可采用面条的办法。
 
我有一个一直在使用的比较成熟的办法:
在我做的系统中,存在大量的表需要生成唯一性标识值,所以,有一个专门生成标识字段值
的函数CreateDataID,其基本原理还是3hsoft所说的id=Max(id)+1,但同时也(基本上)解
决了Another_eYes所提的问题,即并发访问的冲突问题。
如果你能够保证任何时候最都只有一个用户进程能够进行向表中增加记录的操作,那么你
不用考虑这个问题,否则,可以考虑采用我的解决办法:
我有一个IDBuf表,用来保存目前已经生成但尚未保存(提交)到数据库中的ID,CreateDataID
首先在IDBuf中查找最大ID值(select max(id) where 表名=:TableName and 字段=:FieldName),
如果没有找到,再从目标表中查找最大ID值,然后在这个最大值的基础上取下一个值(我的
实际应用是使用十六进制串,所以不是简单地加1),并把这个值加入IDBuf。最后,在记录
实际写入表后,从IDBuf删除对应的ID值。
 
同意龙!
 
后退
顶部