首页 > 数据库 >第39篇 sqlserver同步两张表,保持数据一致

第39篇 sqlserver同步两张表,保持数据一致

时间:2024-10-21 23:33:16浏览次数:7  
标签:39 Target dbo Source Data sqlserver SOURCE NULL 保持数据

MERGE同步两个表, 根据与源表的JOIN 条件,来通过插入、更新和删除目标表行,达到2张表数据一致。

MERGE 语法:

MERGE TOP (value) <target_table> 
USING <table_source>   
ON <merge_search_condition>  
	[ WHEN MATCHED [ AND <clause_search_condition> ]  
		THEN <merge_matched> ] 
	[ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]  
		THEN <merge_not_matched> ]  
	[ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]  
		THEN <merge_matched> ] 
	[ <output_clause> ]  
	[ OPTION ( <query_hint> ) ]      
;

在SQL中,创建2张表,[dbo].[Target_Data]和[dbo].[Source_Data],也就是将来你Merge的2张表。

IF OBJECT_ID('Target_Data') IS NOT NULL
		DROP TABLE [dbo].[Target_Data]
	CREATE TABLE [dbo].[Target_Data]
	(
		[ID] INT PRIMARY KEY NOT NULL,
		[Column1] NVARCHAR(10) NULL,
		[Column2] NVARCHAR(10) NULL,
		[Column3] NVARCHAR(10) NULL,
		[Column4] NVARCHAR(10) NULL,
		[Column5] NVARCHAR(10) NULL,
		[Column6] NVARCHAR(10) NULL,
		[Column7] NVARCHAR(10) NULL,
		[Column8] NVARCHAR(10) NULL
	)
GO

 IF OBJECT_ID('Source_Data') IS NOT NULL
		DROP TABLE [dbo].[Source_Data]
	CREATE TABLE [dbo].[Source_Data]
	(
		[ID] INT PRIMARY KEY NOT NULL,
		[Column1] NVARCHAR(10) NULL,
		[Column2] NVARCHAR(10) NULL,
		[Column3] NVARCHAR(10) NULL,
		[Column4] NVARCHAR(10) NULL,
		[Column5] NVARCHAR(10) NULL,
		[Column6] NVARCHAR(10) NULL,
		[Column7] NVARCHAR(10) NULL,
		[Column8] NVARCHAR(10) NULL
	)
GO

此时,在[dbo].[Source_Data]表中,准备一些临时数据:

IF NOT EXISTS(  --这个判断,是为了不想添加重复数据。
	SELECT TOP 1 1 FROM [dbo].[Source_Data]
	WHERE 
		[ID] = [ID] AND
		[Column1] = [Column1] AND
		[Column2] = [Column2] AND
		[Column3] = [Column3] AND
		[Column4] = [Column4] AND
		[Column5] = [Column5] AND
		[Column6] = [Column6] AND
		[Column7] = [Column7] AND
		[Column8] = [Column8]
)
INSERT INTO [dbo].[Source_Data]
	([ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8])
VALUES
(1,N'A000',N'a000',N'B000',N'b000',N'C000',N'c000',N'D000',N'd000'),
(2,N'A001',N'a001',N'B001',N'b001',N'C001',N'c001',N'D001',N'd001'),
(3,N'A002',N'a002',N'B002',N'b002',N'C002',N'c002',N'D002',N'd002'),
(4,N'A003',N'a003',N'B003',N'b003',N'C003',N'c003',N'D003',N'd003'),
(5,N'A004',N'a004',N'B004',N'b004',N'C004',N'c004',N'D004',N'd004'),
(6,N'A005',N'a005',N'B005',N'b005',N'C005',N'c005',N'D005',N'd005'),
(7,N'A006',N'a006',N'B006',N'b006',N'C006',N'c006',N'D006',N'd006'),
(8,N'A007',N'a007',N'B007',N'b007',N'C007',N'c007',N'D007',N'd007')
GO

查看[dbo].[Source_Data]和[dbo].[Target_Data]2张表数据:
image

接下来,我们把[dbo].[Source_Data]数据同步至Target_Data表中,方法可有2种方案,

方案1,INSERT INTO [dbo].[Target_Data] SELECT ... FROM [dbo].[Source_Data]
方案2,使用Merge。

其中方案1,一次性确保成功,数据量小,整个过程中,服务器正常运行,网络正常,Target_Data没有Source_Data数据无任何故障突发生。

IF NOT EXISTS(  --这个判断,是为了不想数据被重复添加。
	SELECT TOP 1 1 FROM [dbo].[Target_Data]
	WHERE 
		[ID] = [ID]
		--AND
		--[Column1] = [Column1] AND
		--[Column2] = [Column2] AND
		--[Column3] = [Column3] AND
		--[Column4] = [Column4] AND
		--[Column5] = [Column5] AND
		--[Column6] = [Column6] AND
		--[Column7] = [Column7] AND
		--[Column8] = [Column8]
)
INSERT INTO [dbo].[Target_Data]([ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8])
SELECT [ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8]
FROM [dbo].[Source_Data]
GO

执行SQL代码后,可以看看2张表的数据情况:

image

根据Select结果来看,说明方案1执行成功。

而方案2,它可以更加实用与灵活,插入、更新和删除操作。可重复执行,可以单独某一个字段。

为了练习方案2,得先做一个动作,执行下面SQL代码,清除清除[dbo].[Target_Data]数据。

TRUNCATE TABLE [dbo].[Target_Data]
GO

image

编写Microsoft sql server MERGE:

MERGE INTO [dbo].[Target_Data] AS TARGET
USING [dbo].[Source_Data] AS SOURCE
ON TARGET.[ID] = SOURCE.[ID] --基本条件,即是相同。当然在这里还可以添加其他条件 AND ...
WHEN MATCHED THEN
	UPDATE SET 
		TARGET.[Column1] = SOURCE.[Column1],
		TARGET.[Column2] = SOURCE.[Column2],
		TARGET.[Column3] = SOURCE.[Column3],
		TARGET.[Column4] = SOURCE.[Column4],
		TARGET.[Column5] = SOURCE.[Column5],
		TARGET.[Column6] = SOURCE.[Column6],
		TARGET.[Column7] = SOURCE.[Column7],
		TARGET.[Column8] = SOURCE.[Column8]
WHEN NOT MATCHED BY TARGET THEN 
	INSERT (
		[ID],
		[Column1],
		[Column2],
		[Column3],
		[Column4],
		[Column5],
		[Column6],
		[Column7],
		[Column8]
	)
	VALUES (
		SOURCE.[ID],
		SOURCE.[Column1],
		SOURCE.[Column2],
		SOURCE.[Column3],
		SOURCE.[Column4],
		SOURCE.[Column5],
		SOURCE.[Column6],
		SOURCE.[Column7],
		SOURCE.[Column8]
		)
--WHEN NOT MATCHED BY SOURCE THEN --将TARGE表数据删除 (注意,这步!把数据删除了。)
--    DELETE
;
Go

根据ON条件,如果[dbo].[Target_Data]没存在,而[dbo].[Source_Data]存在,它会把数据INSERT。

还有,就是更新,它把[dbo].[Source_Data]其它字段数据更新至[dbo].[Target_Data]表中。此要看你写的更新语句的写法了。

运行上面Merge代码,2张表数据结果一样。select 2张表的结果就不帖出来,略过。

现在练习上面代码行149和150代码,把它由注释改为正常代码,这里的删除,它是删除[dbo].[Target_Data]的数据,是[dbo].[Source_Data]中没有的数据。

练习,先在[dbo].[Target_Data]添加2笔数据。让步2张表的数据产生差异。

INSERT INTO [dbo].[Target_Data]
	([ID],[Column1],[Column2],[Column3],[Column4],[Column5],[Column6],[Column7],[Column8])
VALUES
(888,N'A888',N'a888',N'B888',N'b888',N'C888',N'c888',N'D888',N'd888'),
(999,N'A999',N'a999',N'B999',N'b999',N'C999',N'c999',N'D999',N'd999')
GO

运行代码之后,此时,看看2张表的结果
image

可以在[dbo].[Target_Data]表中,高亮的2行数据,即是刚刚添加的。
再去运行Merge代码,它会把上面2笔数据行删除。
最终结果,2张表的数据相同。

image

标签:39,Target,dbo,Source,Data,sqlserver,SOURCE,NULL,保持数据
From: https://www.cnblogs.com/chenshibao/p/18491616

相关文章

  • Windows系统绿色安装MySQL 8.0.39
    下载官方网址:https://dev.mysql.com/downloads/mysql/版本:8.0.39解压到本地磁盘建议解压到固态硬件所在的盘符。配置增加环境变量MYSQL_HOMEMYSQL_HOME=C:\green\mysql-8.0.39-winx64PATH追加%MYSQL_HOME%\bin验证保存上面的配置,新启一个cmd窗口,输入mysql--vers......
  • 代码随想录算法训练营Day39 | 卡玛网-46.携带研究材料、416. 分割等和子集
    目录卡玛网-46.携带研究材料416.分割等和子集卡玛网-46.携带研究材料题目卡玛网46.携带研究材料(第六期模拟笔试)题目描述:小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包......
  • Plain-Det:同时支持多数据集训练的新目标检测 | ECCV'24
    近期在大规模基础模型上的进展引发了对训练高效大型视觉模型的广泛关注。一个普遍的共识是必须聚合大量高质量的带注释数据。然而,鉴于计算机视觉中密集任务(如目标检测和分割)标注的固有挑战,实际的策略是结合并利用所有可用的数据进行训练。论文提出了Plain-Det,提供了灵活性以适应......
  • 08 P3392 涂条纹
    题目:样例输入:45WRWRWBWRWBWRWRWRWBWR样例输出11代码:#include<iostream>usingnamespacestd;#defineM10005intans;charsa[50][50];intmin1=9999;intmain(){intn,m;cin>>n>>m;for(inti=1;i<=n;i++){f......
  • 嵌入式※~CH395Q-UDP
    我自己的原文哦~ https://blog.51cto.com/whaosoft/11683296网络芯片CH395Q-模块使用Socket0作为UDP组播(多播)通信这里演示一下模块使用Socket0作为UDP组播(多播)通信提醒:无论是SPI,USART,并口,程序操作步骤都是一样的!只是不同的接口发指令发给模块,然后用不同的接收......
  • 代码随想录算法训练营 | 739. 每日温度,496.下一个更大元素 I ,503.下一个更大元素II
    739.每日温度题目链接:739.每日温度文档讲解︰代码随想录(programmercarl.com)视频讲解︰每日温度日期:2024-10-20想法:遍历一遍数组,用栈来存数组下标做记录,因为要找更高得温度,当当前遍历的温度大于栈头存储(存的下标)的温度时,就可以知道栈头要过多少天遇到高温,低的时候直接入栈。J......
  • CentOs7.39 安装Docker
    ①先卸载原有的docker如果第一次安装忽略sudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\......
  • Ubuntu系统中,使用matplotlib画图调用times new romain字体报错 findfont: Font family
    画图时报错,缺少字体findfont:Fontfamily['TimesNewRoman']notfound.FallingbacktoDejaVuSans.有两种解决方式:方式一:在线安装msttcorefonts包#安装msttcorefonts包这种方式需要ubuntu能连外网,否则因为访问source-forge失败而告终sudoaptupdatesudoapti......
  • Springboot的洗衣店预约APP的设计与实现-附源码260839
    摘 要随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个洗衣店预约的网站,随之就产生了“洗衣店预约系统”,这样就让用户洗衣店预约系统更加方便简单。对于本洗衣店预约系统的设计来说,它主要是采用后台采用java语言、s......
  • 基于springboot建筑造价师资格考试应试网站-附源码260839
    摘 要如何合理确定和有效控制工程投资,是工程项目建设的一大难题,如何使建筑工程造价管理与社会生产水平相适应,是建筑工程造价管理中需要解决的问题,只有加强建筑工程造价管理工作力度,提高建筑工程造价人员素质,才能使建筑工程造价管理走上国际化的道路。本文根据我国工程造价......