表的同步问题 (100分)

  • 主题发起人 主题发起人 dwj_dd
  • 开始时间 开始时间
D

dwj_dd

Unregistered / Unconfirmed
GUEST, unregistred user!
有两个表A和B,A为动态表,每天新增,B表中数据为第二天由A表导入,如果
我想第二天只向B表中增加A表中新增部分的数据(即使A表与B表同步)用SQL
句怎么样实现?十万火急!!!!!!!!!!!!!!!
我写的以下语句运行后结果不对
insert into b (one,two,three) select a.one,a.two,a.three from a
where exists (select a.one,a.two,a.three from a
where a.one<>b.one)
 
写触发器
 
dwj_dd:
你的这种方法简直可以说是最糟糕的方法了。
根据你的数据库种类,你可以使用很多种方法。
增量备份的方式、触发器的方式(实时同步)、在表中增加日期字段,通过日期字段进行
检索......
 
一条SQL很难作到。最好用存贮过程。。。

这种情况我遇到过,触发器的方式不行,因为,A为动态表,它可能没有关键字的。
但B表有关键字。也就是说,A相当于临时表,B表才是正式用的表。
 
你可以这样吗,你使A表只保存一天的记录不就可以了吗,你在把A表中的记录插入到B表中
后然后在执行一条
Delete From a
命令不就可以了吗?
 
这么多办法了,提问者可以试试,然后看还不行的话再讨论呀?!!!
为什么不见提问者出来了???
 
谢谢大家,这个问题我已经解决了!我将SQL语句改为:insert into b (one,two,three)
select a.one,a.two,a.three from a where not exists
(select a.one,a.two,a.three from a where a.one=b.one)
结果正确!
 
你的数据表中的数据量有多少?
如果数据量大的话,你这么做非整出人命来不可。
 
我试过,速度还可以,有五万多条纪录,你有更好的办法吗?
 
好的 办法 就是

给表建好 索引 ,

然后, 用 BatchMove 中的 增加.

每天用一次. 很快. 也很方便 的.
 
insert into b (one,two,three) select a.one,a.two,a.three from a
where a.one not in (select b.one from b)

access下测试通过,sql server下肯定没有问题

u try


 
上面的方法只能满足同步a中新增的数据,不能同步修改。
要做到完全同步,必须设计辅助字段做表示。
 
我用not exeist 写的语句和not in写的语句的区别到底是什么。
 
not exeist 测试是否存在。not in 只能用于有限的几种数据类型,如字符类型。
 
不完全同意wumeng的意见。
exists测试是否存在,in(not in)判断在某个集合范围,
在上述离子中,not in在逻辑上更容易理解--向b中插入a中有b中无的数据,前提是a,b中都有独立列的主键。

to dwj_dd:
你的not exists(exeist有误把)在sql server,access中测试不能通过。
not exists是逻辑比较,而in(not in)是集合比较,我开始就觉得not exists有问题,一侧果然。
如有兴趣可以继续讨论:
mike6912@sina.com
 
MikeZ 说的对,我只是简单地说一下区别,没有细想。谢谢MikeZ。
 
我的触发器为什么按你的来不行,只能按下面的来?
not exists(select table2.ii from table2 where table1.i=table2.ii)这句话不太对,却好使?
谁知道?
CREATE TRIGGER mytri1 ON [TABLE1]
FOR INSERT
AS
insert into table2
(ii,nn,tt)
select table1.i,table1.n,12 from table1
where not exists(select table2.ii from table2 where table1.i=table2.ii)

 
因为触发器是一条纪录变化就发生。
你的写法只能同步一条纪录,在触发器中干好可行!
不过你的触发器写法有误,应为:
CREATE TRIGGER mytri1 ON [TABLE1]
FOR INSERT, UPDATE, DELETE
AS
delete from table2 where ii = deleted.i

insert into table2
(ii,nn,tt)
select i,n,12 from Inserted

可以同步所有的操作!

 
后退
顶部