|
9#
楼主 |
发表于 2016-1-27 21:11:37
|
只看该作者
已经快13个春秋了,我对这个问题有更进一步的认识。如果不喜欢GUID字段做主键,那么用双主键的办法来解决这个问题。
比如,原来的表设计是:
ID(自动编号)
ID(自编号) --- 产品ID
产品 数量
电脑A,B,C都是这样结构的话,电脑A采集电脑B,C上的数据时,因为ID都是自编号的,不同电脑上的ID都可能有相同的,所以电脑A采集B的数据后,再采集C时,很可能会发生主键冲突。。
解决办法:**************************************************
把ID主键改为双主键:X 数字 ID 自动编号
这两个字段同时设为主键,电脑A,B,C上的表结构如下:
X
X ID(自动编号)
ID(自编号) --- 产品ID
产品 数量
在新增数据时:
电脑A中的X都填1,电脑B中的X都填2,如果有更多的电脑,那么可以把X填为3,4,如此类推。
那么电脑A要采集电脑B的数据时,就不会发生只用ID单主键的冲突问题了。
同样,A电脑要采集其它电脑的数据,因为双主键作用,都不会发生这样的冲突。
因为有了这个特殊的结构,就完全不需要VBA来插入数据了,直接用两个SQL语句就可以采集数据了。
上面是两层的表结构,多层的表结构,也用类似方法解决。
*************************************************************
历史回顾:N年以前,我和一个DELPHI朋友交流时,他说非常不喜欢用自动编号做主键,说是一个数据库采集另一个数据库,发生上述的问题。当时我也找不到很好的解,就认为这个朋友说得有道理。
但ID自编号是非常好用的,没有GUID那么长,又很好解决了多用户增加数据时主键并发冲突的问题。所以为了回避上述问题,不用自动编号做主键,实在有点残忍。一直都是心中大石。
到了今天,我的ACC技术越来越成熟,解法越来越强大,就象是一个象棋手,当年未在高级阶段,会走走棋,算不算是精通象棋?直到N年之后才会有更新的认识,才知道当年的不足。有些东西你一直玩下去,直到有一天,功力会不知不觉大增,所以旧的难题就会不知不觉中解决了。
还是要感谢那位DELPHI朋友,虽然没有做过采集的数据库,但是这算是一道很不错的思考题了。
|
|