如何解决id号问题(50分)

  • 主题发起人 主题发起人 bryanliu
  • 开始时间 开始时间
B

bryanliu

Unregistered / Unconfirmed
GUEST, unregistred user!
我用dbf文件数据库做了一个多层的数据库小程序(由于原来数据都存在
单机foxpro,现想实现多机器同时输入数据,加快录入速度)
我想给每条记录加一个唯一的ID号,但dbf的数据表不支持自增字段。
在多机同时录入时如何保证每条记录的id号都不重复?
另,程序中使用了事务处理。
 
加一个表来保存ID号。每次加入新纪录INC(ID)
给每个机器上的该表设置不同的起始值即可。
 
把当前数据库的记录数做id号。
 
让你换数据库你要骂我,呵呵,不说了
 
要保证ID号不重复,确实是个很麻烦的事情,我也碰到过类似的问题,你看这样可不可以,
每次在生成ID号的时候,先执行一句SQL语句:Select max(id) from table,取得当前最大
的ID号,然后ID号加1写入数据库。
 
FoxPro 本来就是单机数据库,不提供这些机制,强要上多用户,当然不好办。
Select Max(ID) From Table 也不行,如果两个人恰好同时 Select ,会是什么结果?
只能定义 ID 为 Primary Key ,配合 Select Max(ID) ,每次写库只能是“试图”去
写,出错了就要重新 Select Max(ID),FoxPro 自增型字段没有,Primary Key 的完成性
维护还是有的。
 
To BaKuKu:
FoxPro 也可以是共享的,只不过机智不如 SQL灵活。本公司目前 9 个工作 站
正使用它,一般不比其他慢。且对于小的数据库也足够。
To bryanliu:
关于唯一字段问题,可以设一个专用的 ID 表,该表只有一个字段,永远只有一行,
每个工作站添加记录,先独占该表,加 1 后释放,从而获取属于本工作站的唯一 ID。
我的程序基本是采用这种方法。
 
FoxPro 当然能“用”。
我的答案应该能解决你的问题,因为 Select Max 有可能出现并发问题,所以再加上 Primary Key
约束和事务机制就可以了。
 
如果用c/s数据库,又是如何解决的呢?
 
C/S 数据库有自己的 Identity 型字段啊,由于数据库引擎管理。是解决你的问题的最佳方案。
 
不用整数id,用字符串id,用windows生成 GUID 做id
 
to pipi:
"不用整数id,用字符串id,用windows生成 GUID 做id"
什么是windows的guid,怎么生成?
 
编写一个产生编号的函数放在服务器端,定义一个全局变量,
每调用一次生成编号的函数,变量加1,并把变量值保存到ini文件中
这样也许可以实现
 
不用存ini文件的
直接增加一张表,保存当前编号就可以 了

 
保存到ini文件和数据表都差不多,
但是这样并不能解决并发问题。怎么使用锁我还没有试过
不知那位兄台可以介绍一下
 
多人接受答案了。
 
后退
顶部