注册 登录
编程论坛 VFP论坛

A表和B表结构相同,如何同步数据?

easyppt 发布于 2023-06-07 09:24, 1829 次点击
A表和B表的表结构完全相同,如何通过主键 NID 同步。

规则:
A表是需要被同步的表
B表是动态的,内容每天都会更新,增删改。

要求
1、B表新增的记录 需要同步添加到A表。
2、B表改动的记录,也要同步改动A表。
3、B表删除的记录,不用更新A表。

4、这种情况的表及字段很多,所以最好写个通用的程序。
5、不可以直接删除A表记录,再把B表追加到A表。
6、不希望通过主键NID枚举每条记录的每个字段进行对比,感觉这种效率应该很低吧?

VFP有没有更好的办法判断 相同NID的 记录,各字段内容是否存在不同,如果存在,是哪些字段名,然后同步这些字段

用途:数据同步。

18 回复
#2
xuminxz2023-06-07 10:31
程序代码:
SELECT dbfb
PACK
select dbfA
DELETE FROM dbfA WHERE nid in (select nid FROM dbfB)
PACK
append from dbfB
#3
easyppt2023-06-07 10:39
不可以删除A表的。

追加容易,只要判断 NID是否存在即可,不存在就追加。
关键是 字段内容更改, VFP有没有 整条记录判断的的函数啊? 不想一个一个字段的比较。
#4
吹水佬2023-06-07 11:34
按NID关联
更新数据时一次读出整条记录再一次写入整条记录

[此贴子已经被作者于2023-6-7 11:36编辑过]

#5
csyx2023-06-07 13:09
以下是引用easyppt在2023-6-7 10:39:39的发言:
关键是 字段内容更改, VFP有没有 整条记录判断的的函数啊? 不想一个一个字段的比较。

试试 sys(2017)
#6
csyx2023-06-07 13:34
大概这样
程序代码:
Close Databases
Create Cursor t1 (id I, data1 C(10), data2 C(10))
Insert into t1 (id, data1, data2) Values (1, 'a', 'aaa')
Insert into t1 (id, data1, data2) Values (2, 'b', 'bbb')
Insert into t1 (id, data1, data2) Values (3, 'c', 'ccc')
Insert into t1 (id, data1, data2) Values (4, 'd', 'ddd')
Create Cursor t2 (id I, data1 C(10), data2 C(10))
Insert into t2 (id, data1, data2) Values (1, 'aa', 'aaa')        && data1 不同
Insert into t2 (id, data1, data2) Values (2, 'b', 'bbb')
Insert into t2 (id, data1, data2) Values (3, 'c', 'ccccc')        && data2 不同
Insert into t2 (id, data1, data2) Values (5, 'e', 'eee')        && 新增记录

*-- 提取 t2 中与 t1 不同的记录(不包括 t2 新增的)
Select t2.* from t2 where exists ( ;
    Select a.* from ( ;
        Select id, Cast(Sys(2017,'',-1,1) as C(10)) as crc from t2) a ;
    inner join ( ;
        Select id, Cast(Sys(2017,'',-1,1) as C(10)) as crc from t1) b on a.id = b.id ;
    where a.id = t2.id  and a.crc != b.crc ;
)
#7
easyppt2023-06-07 14:35
谢谢版主啊,这个  sys(2017)  感觉不错,我试试!
#8
吹水佬2023-06-07 15:38
这样使用校验和是否不太严谨
校验和主要是针对单个数据载体而言
对于不同的多个数据载体用校验和来比对是否相等不是一个可行的方法
如:即使两个字符串的校验和相同,它们也有可能不相等的情况
#9
csyx2023-06-07 16:14
以下是引用吹水佬在2023-6-7 15:38:18的发言:
这样使用校验和是否不太严谨
校验和主要是针对单个数据载体而言
对于不同的多个数据载体用校验和来比对是否相等不是一个可行的方法
如:即使两个字符串的校验和相同,它们也有可能不相等的情况

不严谨是肯定的,crc32 是一个最快速的简略算法,唯一性不可能比 md5 等简略算法强。想要兼顾速度和实用性,没其他更好方法;要做到严谨,只能逐字段比较
我仅仅是提出一种兼顾速度和算法复杂性的方案,楼主最好用大量数据测试后,再决定是否接受 crc32 这种比对方案


[此贴子已经被作者于2023-6-7 16:24编辑过]

#10
吹水佬2023-06-07 16:58
不严谨不等于行不通,具体问题要看实际情况。
首先必需对表A与表B有个严格的定义,如果表A与表B的ID是唯一的,且表A与表B在同ID的记录认为是同一数据载体。
个人认为,这样可视为单一数据载体的传送过程。
#11
szwsjx2023-06-07 17:00
每个表多增加一个md5字段,保存时对比一下,字段1+字段2+字段3=MD5,感觉这样对比是最快的,没仔细看主内容,这个不能区分是哪个字段有改变的。

[此贴子已经被作者于2023-6-7 17:04编辑过]

#12
csyx2023-06-07 17:05
楼主已注明他的 nid 是主键,自然不可能不唯一
#13
吹水佬2023-06-07 17:16
如果要求严谨可靠不漏,最好还是在表B有变动就更新表A

#14
csyx2023-06-07 17:19
以下是引用szwsjx在2023-6-7 17:00:47的发言:

每个表多增加一个md5字段,保存时对比一下,字段1+字段2+字段3=MD5,感觉这样对比是最快的,没仔细看主内容,这个不能区分是哪个字段有改变的。

如果允许增加字段,又何必再做 md5 计算和比较,直接加个有修改就会自动变的时间戳不就行了?
#15
wxzd1232023-06-07 20:41
关注
#16
easyppt2023-06-08 17:09
初步测试,sys(2017),已通过,应该具备可行性,后期在实际应用中,我再观察观察。

另外 具体改动的字段,好像只能通过动态获取表结构字段(Afields()),然后逐一判断了吧? 应该没有其他更好的解决办法了吧?

或者索性替换所有字段,代码会简单点(针对校验不一致的记录):
SCATTER
GATHER

[此贴子已经被作者于2023-6-8 17:18编辑过]

#17
吹水佬2023-06-08 20:17
理论上说,两个数据记录的效验和相等,并不能说这两个数据记录一定是相等的。所以,就怕会错漏。
#18
aqyejun2023-06-09 08:41
动态修改动态即时更新最为稳妥。
#19
cjc10102023-06-13 08:31
个人认为,这是个小问题,不就是增、改B表时,多加一句增、改A表的相同语句?
1