【MySQL】下发功能SQL
SQL参考文章:
https://www.jb51.net/article/15627.htm
下发,就是从别的表中同步数据到此表中,也可能是来自不同库的表,或者不同实例的表
下发的逻辑要求:如果没有则是做插入,存在冲突的记录,则需要覆写更新,同时下发表要做出标记,不能重复下发,下发过的记录要做标记
案例:
A表:
CREATE TABLE `a` (
`ID` int NOT NULL AUTO_INCREMENT,
`A` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL,
`B` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL,
`C` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
B表:
CREATE TABLE `b` (
`ID` int NOT NULL AUTO_INCREMENT,
`D` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL,
`E` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL,
`F` varchar(36) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
首先A插入数据,然后下发给B表:
INSERT INTO `my-info`.`a` (`ID`, `A`, `B`, `C`) VALUES (1, '1', '1', '1');
INSERT INTO `my-info`.`a` (`ID`, `A`, `B`, `C`) VALUES (2, '2', '2', '2');
INSERT INTO `my-info`.`a` (`ID`, `A`, `B`, `C`) VALUES (3, '3', '3', '3');
INSERT INTO `my-info`.`a` (`ID`, `A`, `B`, `C`) VALUES (4, '4', '4', '4');
INSERT INTO `my-info`.`a` (`ID`, `A`, `B`, `C`) VALUES (5, '5', '5', '5');
INSERT INTO `my-info`.`a` (`ID`, `A`, `B`, `C`) VALUES (6, '6', '6', '6');
INSERT INTO `my-info`.`a` (`ID`, `A`, `B`, `C`) VALUES (7, '7', '7', '7');
INSERT INTO `my-info`.`a` (`ID`, `A`, `B`, `C`) VALUES (8, '8', '8', '8');
INSERT INTO `my-info`.`a` (`ID`, `A`, `B`, `C`) VALUES (9, '9', '9', '9');
B表为空,则可以直接向里面插入即可:(把A的全部数据向B表写入,主键为自增,不需要加入)
INSERT INTO `my-info`.`b` (`D`, `E`, `F`) SELECT `A`, `B`, `C` FROM `my-info`.`a`
现在A和B表一样的数据, 更新一条A表的数据:
UPDATE `my-info`.`a` SET `A` = '100', `B` = '100', `C` = '100' WHERE `ID` = 5;
A表 5ID的记录是100
+----+-----+-----+-----+
| ID | A | B | C |
+----+-----+-----+-----+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 3 | 3 | 3 | 3 |
| 4 | 4 | 4 | 4 |
| 5 | 100 | 100 | 100 |
| 6 | 6 | 6 | 6 |
| 7 | 7 | 7 | 7 |
| 8 | 8 | 8 | 8 |
| 9 | 9 | 9 | 9 |
+----+-----+-----+-----+
9 rows in set (0.04 sec)
把A的表记录下发到B表,操作:(全选A表的记录,包括主键或者约束键字段,写入到B表中,在主键发生冲突时,更新字段)
INSERT INTO `my-info`.`b` (`ID`, `D`, `E`, `F`)
SELECT `ID`, `A`, `B`, `C` FROM `my-info`.`a`
ON DUPLICATE KEY UPDATE `D` = `A`, `E` = `B`, `F` = `C`
SQL语法是支持的
> Affected rows: 2
> 时间: 0.17s
查看B表,结果是修改了五ID的记录
mysql> SELECT * FROM `my-info`.`B`;
+----+-----+-----+-----+
| ID | D | E | F |
+----+-----+-----+-----+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 3 | 3 | 3 | 3 |
| 4 | 4 | 4 | 4 |
| 5 | 100 | 100 | 100 |
| 6 | 6 | 6 | 6 |
| 7 | 7 | 7 | 7 |
| 8 | 8 | 8 | 8 |
| 9 | 9 | 9 | 9 |
+----+-----+-----+-----+
9 rows in set (0.07 sec)
-- 实现不重复下发的逻辑问题:
A表再追加一个下发标记字段,在执行下发SQL的时候,筛选这个下发条件
INSERT INTO `my-info`.`b` (`ID`, `D`, `E`, `F`)
SELECT `ID`, `A`, `B`, `C` FROM `my-info`.`a` WHERE `下发标记字段` = '未下发的状态值'
ON DUPLICATE KEY UPDATE `D` = `A`, `E` = `B`, `F` = `C`
执行下发之后,要更新A表的下发状态:
把标记为未下发的记录,更新为已下发
UPDATE `my-info`.`a` SET `下发标记字段` = '已下发的状态值' WHERE `下发标记字段` = '未下发的状态值';
以避免重复进行下发,或者是业务逻辑指定的区分方式来实现
另一种情况:
ON DUPLICATE KEY UPDATE
更新操作是依据这个SQL组合实现,即重复的Key
Key可以是主键,或者是索引。
主表的单列主键不需要下发到下发表,但是需要其他其他关键字段触发DUPLICATE KEY
可以对字段添加唯一索引实现(唯一索引允许字段NULL值,需要字段设置NOT NULL限制)
ALTER TABLE `table_name` ADD UNIQUE unq_col1_col2 (`column1`, `column1`);
通过UNIQUE索引触发 DUPLICATE实现更新操作
删除索引:
drop index index_name on table_name ; alter table table_name drop index index_name ;
【MySQL】下发功能SQL的更多相关文章
- MySQL与NoSQL——SQL与NoSQL的融合
来源:http://www.cnblogs.com/sunli/archive/2011/05/11/mysql-nosql.html 写这一篇内容的原因是MySQL5.6.2突然推出了memcach ...
- MySQL打包执行SQL
当一次业务处理计算服务和数据库交互较多时,将可能有大量时间浪费在数据传输上,尤其对于计算服务和数据库跨机房或跨地区部署时,浪费的时间会极其可观.为了减少时间浪费可以使用MySQL提供的SQL打包功能. ...
- MySQL日志功能详解
MySQL日志功能详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询日志 它是用来保存所有跟查询相关的日志,这种日志类型默认是关闭状态的,因为MySQL的用户有很多,如果 ...
- HandlerSocket ---MySQL与NoSQL ---SQL与NoSQL的融合(转)
项目地址:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL 写这一篇内容的原因是MySQL5.6.2突然推出了memcached的功能 ...
- 【原创】6. 在MYSQL++中实现SQL语法中的NULL
这次要说明的是在MYSQL++中为了实现SQL中的NULL而做出的一系列的举措.我的感觉是Null<T, B>类型通常出现在SSQLS和template Query中比较多. 1. 什么是 ...
- mysql(数据库,sql语句,普通查询)
第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...
- MySQL数据导入sql文件过程中出错
错误类型: ERROR 1231 (42000): Variable 'time_zone' can't be set to the value of 'NULL' ERROR 1231 (42000 ...
- mysql分区功能(三个文件储存一张表)(分区作用)(分区方式)
mysql分区功能(三个文件储存一张表)(分区作用)(分区方式) 一.总结 1.mysql数据表的存储方式(三个文件储存一张表): 一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放 ...
- MySQL入门——MySQL数据库和SQL语言
MySQL入门——MySQL数据库和SQL语言 摘要:本文主要了解了MySQL关系型数据库和SQL语言的基本知识. MySQL数据库 简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB ...
- (2)MySQL进阶篇SQL优化(show status、explain分析)
1.概述 在应用系统开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产环境的影响也 ...
随机推荐
- 代码审计——基础(JAVAWEB)
JAVAWEB 目录 JAVAWEB Servlet技术 JavaWeb概述 Servelt与Servlet容器 Servlet概念 Tomcat Web程序结构 Servlet容器响应客户请求的过程 ...
- memoization(计算属性-记忆组件)
连续两次相同传参,第二次会直接返回上次的结果,每次传参不一样,就直接调用函数返回新的结果,会丢失之前的记录,并不是完全记忆,可以在它的参数中传入state数据从而实现了类似Vue中的计算属性功能 # ...
- 执行nodejs 内置fs模块
执行方式1: 在 cmd 中 任意文件夹路径下输入 node 回车 C:\Users\32991>node ...
- 2 分钟,了解 4 个极为有用的 MetricsQL 函数
夜莺社区的朋友如果问时序库的选型,我一般都会推荐 VictoriaMetrics,除了其性能.稳定性.集群扩展能力之外,VictoriaMetrics 还扩展了 PromQL,提供了 MetricsQ ...
- BigDecimal的小数位
在使用BigDecimal的divide方法进行除法运算时,需要传入两个参数:被除数和除数.如果要对除法结果进行保留小数位数的处理,可以使用该方法的重载形式,传入一个指定小数位数和舍入规则的MathC ...
- 使用spark-sql处理Doris大表关联
背景 最近项目上有一个需求,需要将两张表(A表和B表)的数据进行关联并回写入其中一张表(A表),两张表都是分区表,但是关联条件不包括分区字段. 分析过程 方案一 最朴素的想法,直接关联执行,全表关联, ...
- 引入feign注入报错 org.springframework.beans.factory.NoSuchBeanDefinitionException解决
引入feign注入报错 org.springframework.beans.factory.NoSuchBeanDefinitionException解决 [172.16.22.215] out: C ...
- C# 设置PDF表单不可编辑、或提取PDF表单数据
PDF表单是PDF中的可编辑区域,允许用户填写指定信息.当表单填写完成后,有时候我们可能需要将其设置为不可编辑,以保护表单内容的完整性和可靠性.或者需要从PDF表单中提取数据以便后续处理或分析. 之前 ...
- python allure将生成报告和打开报告写到命令文件,并默认使用谷歌打开
背景: 使用python + pytest +allure,执行测试用例,并生成测试报告: allure报告要从收集的xml.json等文件,生成报告,不能直接点击报告的index.html,打开的报 ...
- java基础-匿名类/对象
最近有同事问我,以下这个语句是什么意思? MqMessge<MqMessgeThink> mm= JSON.parseObject(message.toString(),new TypeR ...