【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语句开始逐渐显露出性能问题,对生产环境的影响也 ...
随机推荐
- k8s——daemonset
daemonset 为每一个匹配的node都部署一个守护进程 # daemonset node:type=logs daemonset 选择节点 - nadeSelector: 只调度到匹配指定的la ...
- RHCSA认证学习_尝试
第一天 一,linux系统的基本概念以及命令终端字段含义介绍 linux系统的基本概念: ·多用户的系统:允许同时执行多个任务 ·多任务的系统:允许同时执行多个任务 ·严格区分大小写:命令,选项,参数 ...
- 太卷了,史上最简单的监控系统 catpaw 简介
指标监控的痛点 当下比较流行的监控系统,比如 Prometheus.Nightingale.VictoriaMetrics,都是基于数值型指标的监控系统,这类监控系统的痛点在于:告警的时候只能拿到异常 ...
- JavaScript 中判断 {}是空对象
Javascript 中判断空对象 简介:在 JavaScript 判断字符串是否是一个空字符串 可以 !"" 返回 true 来判断, 要是判断 {} 是否是空对象,也用 !{} ...
- idea编译报错 sun.misc.BASE64Decoder升级处理
idea编译报错 sun.misc.BASE64Decoder升级处理 警告:17:01:15 /deploy/jenkins/workspace/auto-java-test/utils/Image ...
- 记录一次学习mongodb的20个常用语句
// 查询当前数据库 db // // 查看所有数据库 show dbs// 创建数据库 use db_name// 删除数据库 db.dropDatabase()// 创建集合 db.createC ...
- 【仿真】Carla之Docker 运行 及 渲染相关 [6]
参考与前言 carla官方对于docker 运行的描述: CARLA in Docker Docker的使用:[暂时没贴] 相关已知issue,欢迎补充 https://github.com/carl ...
- LaTeX 编辑协作平台 Overleaf 安装和使用教程
在学术界和科技行业,LaTeX 已成为撰写高质量文档的标准工具.然而,传统的 LaTeX 使用体验常常伴随着以下挑战: 学习曲线陡峭 环境配置复杂 多人协作困难 实时预览不便 当然,市面上不乏很多在线 ...
- Spark3学习【基于Java】1. Spark-Sql入门程序
spark-sql是用来处理结构化数据的模块,是入门spark的首要模块. 技术的学习无非就是去了解它的API,但是Spark有点难,因为它的例子和网上能搜到的基本都是Scala写的.我们这里使用Ja ...
- UNR #7 Day2 T1 火星式选拔题解
放一个比赛链接 先考虑打完暴力后 \(k = 1\) 的特殊性质. 当队列容量为 \(1\) 时,队中的人 \(i\) 会被第一个满足 \(i \leq j\) 且 \(b_i \leq a_j\) ...