| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1295 人关注过本帖
标题:A表和B表结构相同,如何同步数据?
只看楼主 加入收藏
easyppt
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:295
专家分:649
注 册:2021-11-24
结帖率:100%
收藏
 问题点数:0 回复次数:18 
A表和B表结构相同,如何同步数据?
A表和B表的表结构完全相同,如何通过主键 NID 同步。

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

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

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

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

用途:数据同步。

搜索更多相关主题的帖子: 记录 相同 字段 结构 同步 
2023-06-07 09:24
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:41
帖 子:766
专家分:2517
注 册:2011-5-8
收藏
得分:0 
程序代码:
SELECT dbfb
PACK
select dbfA
DELETE FROM dbfA WHERE nid in (select nid FROM dbfB)
PACK
append from dbfB

dBase有人接盘了。
2023-06-07 10:31
easyppt
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:295
专家分:649
注 册:2021-11-24
收藏
得分:0 
不可以删除A表的。

追加容易,只要判断 NID是否存在即可,不存在就追加。
关键是 字段内容更改, VFP有没有 整条记录判断的的函数啊? 不想一个一个字段的比较。
2023-06-07 10:39
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
按NID关联
更新数据时一次读出整条记录再一次写入整条记录

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

2023-06-07 11:34
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:703
专家分:2760
注 册:2018-3-13
收藏
得分:0 
以下是引用easyppt在2023-6-7 10:39:39的发言:
关键是 字段内容更改, VFP有没有 整条记录判断的的函数啊? 不想一个一个字段的比较。

试试 sys(2017)

这家伙很懒,啥也没留下
2023-06-07 13:09
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:703
专家分:2760
注 册:2018-3-13
收藏
得分:0 
大概这样
程序代码:
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 ;
)

这家伙很懒,啥也没留下
2023-06-07 13:34
easyppt
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:295
专家分:649
注 册:2021-11-24
收藏
得分:0 
谢谢版主啊,这个  sys(2017)  感觉不错,我试试!
2023-06-07 14:35
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
这样使用校验和是否不太严谨
校验和主要是针对单个数据载体而言
对于不同的多个数据载体用校验和来比对是否相等不是一个可行的方法
如:即使两个字符串的校验和相同,它们也有可能不相等的情况
2023-06-07 15:38
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:703
专家分:2760
注 册:2018-3-13
收藏
得分:0 
以下是引用吹水佬在2023-6-7 15:38:18的发言:
这样使用校验和是否不太严谨
校验和主要是针对单个数据载体而言
对于不同的多个数据载体用校验和来比对是否相等不是一个可行的方法
如:即使两个字符串的校验和相同,它们也有可能不相等的情况

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


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


这家伙很懒,啥也没留下
2023-06-07 16:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
不严谨不等于行不通,具体问题要看实际情况。
首先必需对表A与表B有个严格的定义,如果表A与表B的ID是唯一的,且表A与表B在同ID的记录认为是同一数据载体。
个人认为,这样可视为单一数据载体的传送过程。
2023-06-07 16:58
快速回复:A表和B表结构相同,如何同步数据?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019117 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved