在SQL中 如何实现不同数据库的两张表的同步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SQL中 如何实现不同数据库的两张表的同步相关的知识,希望对你有一定的参考价值。

有一台服务器,SQL中有DB_01 和DB_02两个数据库,其中的表 PA,结构完全一样,用什么方法能实现两张表的同步?比如我在DB_01.PA中录入数据,在DB_02.PA中也能看到?

请高手详述! 谢谢
我查过 也知道用触发器,但具体语句不知道怎么写。

已测试了大家提供的语句 同步增加的触发器 按大家的语句输入后都出现一个

错误 311:不能在'inserted'表和'deleted'表中使用text、ntext或image列。

请问该如何解决啊?

你可以分三个来写,分别用来监视insert\delete\update三个(这样写容易完成),我下面写一个,你其它有可以参照下面这个来写
--插入行的情况
CREATE TRIGGER [填入触发器名] ON [dbo].[表名]
FOR INSERT
AS

insert [另外一个数据库名].[dbo].[表名] select * from inserted

你也可以参照料我下面这段,写在一起,但比较麻烦,我就不具体按你要求的写了罗.
CREATE trigger [数据库A.tr_user] on [user]
/* 触发器 在数据库A的user表建立一个名字tr_user的触发器 */
for update,insert,delete
/*监视 修改 插入 删除*/
as
if not exists (select * from deleted)
/* 如果deleted表为空,那么 */
insert 数据库B..[user](username,userpass,landtime) select username,password,lastlogin from inserted
/* 将inserted表(就是对于触发器来说刚刚被插入的集合)插入到B.user */
else if not exists (select * from inserted)--删除
/* 否则 如果 inserted集合为空 */
delete 数据库B..[user] where id in (select userid from deleted)
/* 那么删除B.user下id是deleted集合中出现的id 这里用了in */
else--更新
update [user]
set
[user].username=i.username,
[user].userpass=i.password
from 数据库B..[user] as [user],
inserted as i
where [user].id=i.userid
/* update就很明显了,凡是updated的都来更新,保持一样就可以了 */
alter table 数据库B..[user] ENABLE TRIGGER [数据库B.tr_user]
参考技术A 首先你要考虑应用的是什么SQL,虽说ORACLE, SQLSERVER等都不同, 但都是大同小异而已,还有就是你所需的处理是输入,更新,还是删除。我这里以SQL SERVER的触发器作为例子

同时输入:

CREATE TRIGGER TRIGGERNAME ON DB_01.PA
AFTER INSERT AS INSERT INTO DB_02.PA(FIELD1,FIELD2, FIELD3...) SELECT * FROM INSERTED

同时删除:
CREATE TRIGGER TRIGGERNAME ON DB_01.PA
AFTER DELETE AS DELETE FROM DB_02.PA WHERE DB_02.PA. FIELD1 = (SELECT FIELD1 FROM DELETED )

同时更新:

CREATE TRIGGER TRIGGERNAME ON DB_01.PA AFTER UPDATE AS
UPDATE DB_02.PA SET DB_02.PA.FIELD2 =
(SELECT FIELD2 FROM DB_01.PA WHERE DB_02.PA.FIELD1 = DB_01.PA.FIELD1)

这里假定要更新的数据为FIELD2,而参照用的
为FIELD1 当然你可以自己任意决定

TRIGGERNAME 为触发器的名字,任意输入本回答被提问者采纳
参考技术B 直接可以用了,不过这里我假设主键是id

CREATE TRIGGER tr1
ON DB_01.dbo.PA
FOR INSERT
AS
BEGIN
insert into DB_02.dbo.PA select * from Inserted i
END

CREATE TRIGGER tr2
ON DB_01.dbo.PA
FOR delete
AS
BEGIN
delete DB_02.dbo.PA
from DB_02.dbo.PA,deleted
where DB_02.dbo.PA.id=deleted.id
END

CREATE TRIGGER tr3
ON DB_01.dbo.PA
FOR update
AS
BEGIN
delete DB_02.dbo.PA
from DB_02.dbo.PA,deleted
where DB_02.dbo.PA.id=deleted.id
insert into DB_02.dbo.PA select i.* from inserted i
END

CREATE TRIGGER tr4
ON DB_02.dbo.PA
FOR INSERT
AS
BEGIN
insert into DB_01.dbo.PA select * from Inserted i
END

CREATE TRIGGER tr5
ON DB_02.dbo.PA
FOR delete
AS
BEGIN
delete DB_01.dbo.PA
from DB_01.dbo.PA,deleted
where DB_01.dbo.PA.id=deleted.id
END

CREATE TRIGGER tr6
ON DB_02.dbo.PA
FOR update
AS
BEGIN
delete DB_01.dbo.PA
from DB_01.dbo.PA,deleted
where DB_01.dbo.PA.id=deleted.id
insert into DB_01.dbo.PA select i.* from inserted i
END
参考技术C 建一个触发器,发现A表有任何操作,B表也执行同样的操作

MySQL如何同时删除主外键关联的两张表中的数据

1. 编写目的

介绍一种方法,解决如下问题:如何同时删除两张相关联的表的记录。
比如说表a的外键fk依赖于表a的id,现在我们需要删除id=5的两条数据。

2. 主要方法

为了简单,推荐更改表a的外键设置,设置删除时策略为CASCADE
如下图:(使用工具navicat)

创建这张表的sql语句如下:

DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
  `openid` char(50) NOT NULL DEFAULT '',
  `pk_userid` bigint(20) unsigned DEFAULT NULL,
  `nickname` char(60) DEFAULT NULL,
  `gender` char(10) DEFAULT NULL,
  `city` char(60) DEFAULT NULL,
  `province` char(60) DEFAULT NULL,
  `country` char(60) DEFAULT NULL,
  `avatar_url` char(150) DEFAULT NULL,
  `gmt_create` datetime NOT NULL,
  `gmt_modified` datetime NOT NULL,
  PRIMARY KEY (`openid`),
  KEY `user_info_ibfk_1` (`pk_userid`),
  CONSTRAINT `user_info_ibfk_1` FOREIGN KEY (`pk_userid`) 
  REFERENCES `user` (`pk_userid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

重点关注FOREIGN KEY (pk_userid)
REFERENCES user (pk_userid) ON DELETE CASCADE ON UPDATE CASCADE

这个时候我们需要联合删除时只要删除被依赖的表就可以了,mysql会根据外键依赖关系把两张表的记录都删除。

delete from user where pk_userid = 27;

3. 总结

总而言之是通过更改外键删除时的处理策略来实现的,相对来说比较简单,但是同时也可能会带来某些其他问题。
当然,两个相互关联的表,某张表更新时,另外一张表跟着更新的也应该使用CASCADE策略。

Smileyan 2019年4月20日

以上是关于在SQL中 如何实现不同数据库的两张表的同步的主要内容,如果未能解决你的问题,请参考以下文章

两张表关联如何实现同时插入数据 sql具体语句

MySQL如何同时删除主外键关联的两张表中的数据

在SQL语句中,如何把两张表的数据按时间排序查询?

sql查询:使用内连接查询两张表的时候,如果左边表的一条记录对应了右边表的两条记录,结果显示排列问题

如何用sql将两张表的字段名和列值进行匹配?

怎样用Sql语句判断一张表中的两条数据相同