主题:  为什么数据库中ID字段的自动编号显示的总是不正确呢!!

我哭了

职务:普通成员
等级:1
金币:0.0
发贴:148
#12004/9/3 14:32:22
留完言以后再一看ID字段,显示的数字倒是从小到大排列了,但为什么数字不是挨着的呢?比如,5完了6,6完了就变成10了???



沉默是金

职务:普通成员
等级:6
金币:11.2
发贴:4357
#22004/9/3 16:48:35
自动编号如果中间有数据删是不会在最后的ID数值后面递加的,只会一个劲的自动增长哟。


难人一个……

我哭了

职务:普通成员
等级:1
金币:0.0
发贴:148
#32004/9/3 22:20:50
谢谢这位朋友的帮助!但是您说的意思我还是不太明白,汗~~~~~~~~~~~~~~~~~~~ 那究竟应该怎么办呢?怎样解决这一问题?还望您不吝赐教!谢谢!期待ing。。。。



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#42004/9/3 22:54:49
ID号是唯一标识,象发票,作废了,但这张发票号是不能再出现了。


非常大鱼

我哭了

职务:普通成员
等级:1
金币:0.0
发贴:148
#52004/9/4 11:33:16
明白这位朋友的意思了!
但是,据您所说那应该怎么办呢?有什么办法能解决这一问题吗?或者说一般的别人都是怎么弄的呢?
因为假如要管理留言板的话,不可能删除记录时都是从最新的记录到旧记录挨着删除啊,肯定会有跳着删除的!那。。。那样的话像您所说,ID号岂不是永远都不是连着的。但是,我在别人的留言板看到的就是这样的:假如A的留言是在第70楼,B的留言是在第71楼,C在第72楼,当把B的留言删除后,C的留言就变成了第71楼了! ....



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#62004/9/5 2:55:24
如果一定按序排的话,就应该增加一个数字字段,比如Site字段,如果有50层的话,中间删除第15层,那么就用UPDATE,把所Site大于15的记录 Site = Site - 1。如果中间增加一层比如20层后增加一层,那么21层就得变成22层了,依次类推。


非常大鱼

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#72004/9/5 3:04:17
ID号的唯一性,也就是不修改性的好处是,ID号常用用作关系数据库的关系链接,如果ID号是可以改变的,那么与之相关的数据库都要改变。在一复杂的数据库中,这种修改常是比较困难的。所以这种唯一不变性保证了关系的可靠性。


非常大鱼

janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
#82004/9/5 8:00:49
icry5在上个帖子中说
引用:
明白这位朋友的意思了!
但是,据您所说那应该怎么办呢?有什么办法能解决这一问题吗?或者说一般的别人都是怎么弄的呢?
因为假如要管理留言板的话,不可能删除记录时都是从最新的记录到旧记录挨着删除啊,肯定会有跳着删除的!那。。。那样的话像您所说,ID号岂不是永远都不是连着的。但是,我在别人的留言板看到的就是这样的:假如A的留言是在第70楼,B的留言是在第71楼,C在第72楼,当把B的留言删除后,C的留言就变成了第71楼了! ....
这里所说的“楼层”只不过是记录的顺序号,访问recordset对象的AbsolutePosition属性可以达到这个目的(最佳的操作方式是将cursorlocation设置为adUseClient),或者在循环输出时通过自加计数器得到(要计算当前记录在页的位置)



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#92004/9/6 0:48:10
ID号作为主键,与其它表外键联接,在设计时的原则,也就是一种好的设计方法,要求主键必须是唯一性,无实际意义,不能人为修改。
唯一性很容易理解;
无实际意义,也就是主键不含有任何实际需要的数据,比如名称,卡号。也有用身份证号等作主键的,但这不是好的设计方法。
不能人为修改,前面说的身份证号也许是唯一的,但作为主键不是最好的方法,因为身份证号可能通过人为因数,或没有经验的操作的修改,使数据库不能正常运行,而要在一个大型数据库中查出某一主键的修改是很困难的。这也就是主键要求不能人为修改。


非常大鱼

我哭了

职务:普通成员
等级:1
金币:0.0
发贴:148
#102004/9/6 14:13:10
明白了!明白了!哈哈,这回是彻彻底底的明白了!谢谢“蓝鲸”兄三翻五次的帮助!

原来ID字段只是用于各种数据操作(就像回复、删除等)的一个唯一的识别参照,不起任何实际作用的。而且ID字段基本上也是不允许修改的,正因为它的这种唯一不变性才保证了关系的可靠性。对吧!哈哈

原来别人留言板上显示的“楼层”其实是绑定到了一个“数字字段”!我一直还以为是绑定到了ID字段,呵呵,怪不得删除了xx记录后,那个数值就不会再出现了,因此才会出现数字有时不是挨着的!

谢谢“蓝鲸”兄,谢谢各位的帮助!不过再建一个数字字段倒是没什么,只是不知道怎样才能让它Site = Site - 1或Site = Site + 1,没弄过。我自己再试试,有问题再发上来!



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#112004/9/6 19:31:39
这是序号排位问题,一般论坛和留言板以时间为序,所以这个字段可以省。但有时为了特定排序,需要中间插入等操作,就设这个字段。学过数据结构的会想到有点类似循序结构的操作,涉及插入及删除操作。

比如1 - 30的数据,在中间10的位置插入新行,先把10 - 30的Site增加 1
UPDATE Table1 SET Site = Site +1 WHERE ParentID = 10 AND Site >=10
然后用INSERT语句,插入新行,设Site = 10。

删除也类似,先删除
DELETE FROM Table1 WHERE ParentID = 25 AND Site = 10
然后
UPDATE Table1 SET Site = Site - 1 WHERE ParentID = 25 AND Site >10


非常大鱼

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#122004/9/6 19:59:31
不过ID的自动编号还是有问题,主要是在数据合并,或更新到其它数据库中去。主键会重新编号,如果不改变链接表的字段的数值,关系就会中断。

这个确实很头疼,我也很想知道有什么好的方法。如果谁有这方面经验,想请教一下。
一种方法是先更新主键的表,得到新的ID号,再更新链接表中的字段。这种方法只能一条条的更新,数据大的话可能较慢。
可能用SQL语句可以很好实现,很想请教一下。

SQL SERVER有Guid值,就比较方便,虽然效率比标识列低了些,但GUID值是全局唯一的,也就是任何一台机器上不会出现重复的两个值。但只能在SQL SERVER上,ACCESS上没有。有时选择ACCESS并不是为了编程方便,而是考虑使用者很多在电脑上并不是高手,不要奢望他们使用SQL SERVER。


非常大鱼