当前位置: 首页 > news >正文

Mysql特殊用法分享

不存在则插入,存在则更新的2种写法

前置使用条件,必须有唯一索引

-- 1 REPLACE INTO
REPLACE INTO typora.ip_view_times_record (ip, view_times, url) VALUES('10.25.130.64', 1, 'https://10.25.168.80/fhh/index.html?url=index.md543');-- 2 ON DUPLICATE key update
-- 当更新的是索引时,容易发生死锁。注意全面测试,这种方式适合数据大批量操作
INSERT INTO typora.ip_view_times_record (ip, url) VALUES('10.25.130.64', 'https://10.25.168.80/fhh/index.html?url=index.md11111')
ON DUPLICATE key update view_times = if(view_times, 0) + 1 ;-- 3 先更新,更新为0,则插入。分段sql中间存在较低的时差,分析其影响后再使用
if(updateRow > 1){insert();
}

前2种的差异:

REPLACE INTO 每次会把这条数据先清除,在重新插入values中的值,所以除了一次会更新1条数据,后面会更新2条数据;INSERT INTO ON DUPLICATE key update 原理是先查,如果没有再插入,否则更新;

批量更新策略

-- 1. 适用于不同更新条件更新不同内容,性能取决于查询性能,大多数情况性能表现较好,一般用作数据更新、插入
INSERT INTO table (ip, url) VALUES('10.25.130.64', 'https://10.25.168.80/fhh/index.html?url=index.md11111')
ON DUPLICATE key update xxx;-- 2. 适用于不同更新条件更新不同内容,性能取决于查询性能,大多数情况性能表现较好(小表在右)
with tmp as (select name, stat_date from  user1 where stat_date >= '2024-05-21'
)
, tmp1 as (select a.name, b.stat_date from user a inner join tmp b on a.name = b.name
)
update user a INNER JOIN tmp1 b on a.name = b.name set a.stat_date = b.stat_date;-- 2.1
update test a INNER JOIN test1 b on a.account = b.account set a.account1 = b.account1;-- 3. 性能一般,适用于不同条件 更新同一内容
update a set a.col1 = xxx where a.col2 in (....)-- 4. 性能较好,exists 适用于判断存在性。
update user b set stat_date = '2024-05-21' where exists (select 1 from user1 a where a.name = b.name and stat_date >= '2024-05-21');

可重复执行DDL

drop table if exists crr_policy_index;

建索引

set @v_count = 0;
select count(*) into @v_count from information_schema.statistics where TABLE_SCHEMA='fhh' and TABLE_NAME='fhh_test' and INDEX_NAME = 'fhh_test_account_idx';
set @sql = if(@v_count = 0, "CREATE INDEX fhh_test_account_idx USING BTREE ON fhh.fhh_test (account, account1)", "select 'fhh_test.fhh_test_account_idx is OK.'");
prepare stmt from @sql;
execute stmt;

其他使用if exists关键字,或参考建索引(当不支持 if exists 关键字时)

相关文章:

  • platformio烧写STC8H1K08单片机程序失败:Serial port error: read timeout
  • 探索设计模式——单例模式详解
  • matplotlib 创建多个子图
  • TWM论文阅读笔记
  • ChatTTS 推荐及使用说明
  • Spring框架的最新进展:2023年Spring Boot和Spring Cloud功能更新
  • 数据分析的Excel基础操作
  • 节能减排如何替电子行业巨头降低成本
  • [程序员] 表达的能力
  • 在公司的一些笔记
  • 【ARM 安全系列介绍 3.7 -- SM4 对称加密算】
  • Java中的图形用户界面开发
  • 【MySQL进阶之路 | 高级篇】SQL执行过程
  • 用Vite基于Vue3+ts+DataV+ECharts开发数据可视化大屏,即能快速开发又能保证屏幕适配
  • PCB行业迈入数字化新时代,智能工厂引领未来制造
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 2017届校招提前批面试回顾
  • Angular数据绑定机制
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Java 最常见的 200+ 面试题:面试必备
  • Javascript设计模式学习之Observer(观察者)模式
  • Node 版本管理
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Redis在Web项目中的应用与实践
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue官网教程学习过程中值得记录的一些事情
  • 前端攻城师
  • 深入浏览器事件循环的本质
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 数据可视化之 Sankey 桑基图的实现
  • 微信小程序:实现悬浮返回和分享按钮
  • 硬币翻转问题,区间操作
  • gunicorn工作原理
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​ubuntu下安装kvm虚拟机
  • #LLM入门|Prompt#3.3_存储_Memory
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (离散数学)逻辑连接词
  • (生成器)yield与(迭代器)generator
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)u-boot-nand.bin的下载
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET : 在VS2008中计算代码度量值
  • .Net Memory Profiler的使用举例
  • .NET 给NuGet包添加Readme
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • @Value读取properties中文乱码解决方案
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [100天算法】-x 的平方根(day 61)
  • [100天算法】-不同路径 III(day 73)
  • [AX]AX2012 R2 出差申请和支出报告