2 liberty chen liberty_chen 于 2015.06.04 10:45 提问

SQL 同步tableA和tableB两张表的信息

tableA(no,name1,status,time)和tableB(no,name1)
no为主键
A表要同步B表的数据,status记录改信息是“新增”或者“修改”或者“删除”
time为新增或修改或删除的时间

这个SQL要怎么写 ?求具体的语句啊谢谢!

7个回答

tongyi55555
tongyi55555   2015.06.05 15:47
已采纳

这是我写的一个sql文件,你保存成sql文件可以试试。

DELIMITER $$ 
INSERT INTO tablea (SELECT tableb.no,tableb.`name`,'Add',tableb.time from tableb WHERE no NOT IN (SELECT no from tablea));

UPDATE tablea INNER JOIN tableb SET status = 'Update', tablea.name=tableb.name, tablea.time = tableb.time WHERE tablea.no = tableb.no AND tablea.name != tableb.name;

UPDATE tablea INNER JOIN tableb SET status = 'DEL', tablea.time = NOW() WHERE tablea.no NOT IN (SELECT no FROM tableb);

$$  
DELIMITER ; 
bdmh
bdmh   Ds   Rxr 2015.06.04 10:46
liberty_chen
liberty_chen 这个可以用来做修改,那么如果是新增和删除的状态的话,在这个句子里要怎么来判断呢?
2 年多之前 回复
bdmh
bdmh   Ds   Rxr 2015.06.04 10:48
 update A set A.status='xxx' from A inner join B on A.no=B.no
baidu_26423741
baidu_26423741 update A set A.status='xxx' from A inner join B on A.no=B.no
2 年多之前 回复
liberty_chen
liberty_chen 这个是否支持相同的信息不作修改
2 年多之前 回复
tongyi55555
tongyi55555   2015.06.04 11:03

建议楼主再把需求明确一些,既然你这个涉及了增加、删除、更新三个操作的时间,应该设计一个触发器,在你对B表进行增删改操作时触发,并将这些信息存储到A表中,这是我的理解,不知道是不是你的需求,是的话我再给你触发器的代码

liberty_chen
liberty_chen 需求是要求把B表的数据同步到A表,但是如果A表已经有的就不用同步,没有的就新增,然后状态是新增,删除和修改也一样
2 年多之前 回复
nblover
nblover   2015.06.04 11:07
  1. tableB有存在的必要吗? 完全是冗余的。 使用view也好啊。
  2. 实在想要tableB的话,更新tableA时,同事更新tableB,不就可以了吗? 干嘛给自己找麻烦。
liberty_chen
liberty_chen 回复nblover: 反正这个B表的数据除了查询其他都是不能动的,它会定时更新数据但是是全删全导类型的,但是客户端不可能大批量的全删全导,于是我就自己新建了个表用来同步B的数据,然后有修改删除新增的记录用status字段来记录,然后根据时间差同步给客户端,这个问题你有没有更好的设计 ?
2 年多之前 回复
nblover
nblover 回复liberty_chen: 感觉你的设计肯定有问题。
2 年多之前 回复
liberty_chen
liberty_chen = = 我是要从B表里面拿数据到自己的表里面,没有B表哪里来的数据
2 年多之前 回复
tongyi55555
tongyi55555   2015.06.04 13:58

我写了一下,是通过在B表加触发器的方式实现的。请参考:

创建增加的触发器:

CREATE TRIGGER tableb_add 
AFTER INSERT ON tableb
FOR EACH ROW
BEGIN
     insert into tablea values(new.no,new.name,'Add',NOW());
END;

//测试代码

insert into tableb values(1,'sss');

创建更新的触发器:

CREATE TRIGGER tableb_update 
AFTER UPDATE ON tableb
FOR EACH ROW
BEGIN
     UPDATE tablea set name=new.name, status='Update', time=NOW() where no = new.no;
END;

//测试代码

update tableb set name='new' where no=1;

创建删除的触发器:

CREATE TRIGGER tableb_delete
AFTER DELETE ON tableb
FOR EACH ROW
BEGIN
     UPDATE tablea set status='Delete', time=NOW() where no = old.no;
END;

//测试代码

delete from tableb where no =1;
liberty_chen
liberty_chen 这个是要用触发器么,B表是同一时间全删全导的,我想是应该用表A的数据去跟表B更新之后的数据作对比这样的吧
2 年多之前 回复
feng1790291543
feng1790291543   Ds   Rxr 2015.06.05 11:10

1、使用sql 脚本写触发器,一般都是 增删改查 那几个操作 用 触发器trigger的;
2、多表 级联 一样可以 使得多表 的 同步 更新变化;
3、在代码中使用 多线程 信号 也可以

feng1790291543
feng1790291543 回复liberty_chen: 如果是更新的话,有级联关系,就不用判断了,是自动变化的
2 年多之前 回复
liberty_chen
liberty_chen 我需要一个对比的操作,就是如果B表有的no A表没有,那么就新增,状态就ADD,如果B表没有的no A表有,那么就删除,状态就DEL,如果相同的no然后其他数据不同的,那么修改,状态UPDATE 这样的判断语句该怎么去写
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片