首页 > 数据库 >MySQL 删除后插入 与 插入或更新

MySQL 删除后插入 与 插入或更新

时间:2023-05-22 14:56:05浏览次数:40  
标签:name 删除 age 更新 插入 VALUES MySQL INTO

MySQL 删除后插入 与 插入或更新

一般操作:查询->判断【(存在更新,不存在插入)或(存在删除插入,不存在插入)】

在单条插入/更新的时候这样做是没有问题的,但是在批量导入的环境下由于数据量过大所以这里出现里的严重的性能问题

优化方案 “插入或更新” INSERT FOR UPDATE

INSERT FOR UPDATE语法

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [(col_name [, col_name] ...)]
    {VALUES | VALUE} (value_list) [, (value_list)] ...
    [ON DUPLICATE KEY UPDATE assignment_list]

带有 ON DUPLICATE KEY UPDATEINSERT语句允许当插入一行时由于唯一索引或者主键索引而产生的重复值情况时则对已经存在的行执行更新操作。

-- 演示数据
DROP TABLE IF EXISTS test;
CREATE TABLE test (
id INT PRIMARY KEY auto_increment,
name VARCHAR ( 30 ) UNIQUE NOT NULL COMMENT '姓名',
age INT COMMENT '年龄',
address VARCHAR ( 100 ) COMMENT '地址',
version int(11) not null default 1 COMMENT '版本',
update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) COMMENT '测试表';


-- 单条插入或更新的 SQL 可以这样写
-- 注意这样实现的方式不支持批量,否则就有批量记录的所有 name 都更新成了张三,age 更新成了 22
INSERT INTO test ( name, age, address ) VALUE ( '李四', 20, '上海' ) ON DUPLICATE KEY UPDATE name = "张三", age = 22;


-- 在批量插入或更新时我们的 UPDATE 可以通过 VALUES(field) 获取我们插入的对应记录的值
-- 如 name = VALUES(name) 则表示将 name 更新成为我们输入的值
-- 通过 VALUES() 函数获取在(VALUE|VALUES) 中映射的对应的值
INSERT INTO test ( NAME, age, address )
VALUES
	( '张三', 199, '北京市' ),
	( '王五', 221, '天津市' )
ON DUPLICATE KEY UPDATE 
	name = VALUES ( name ),
	age = VALUES ( age );
-- 这里的插入逻辑表示当存在id为1 的记录时则更新 name 为输入的name,age为输入的age


-- 这里当我们的记录发生重复的时候我们只更新 age 字段,同时将我们的 version 字段加1
INSERT INTO test ( id, NAME, age, address ) 
VALUE
	( 1, '李四', 20, '上海' ) 
	ON DUPLICATE KEY UPDATE 
	age = VALUES ( age ),
	version = version + 1,
	update_time = date_add( now(), INTERVAL 1 DAY );

on duplicate key update 使用总结

  • on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。

  • 记录已存在时,只会更新on duplicate key update之后指定的字段。

  • 如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。

  • on dupdate key update之后没有用values的情况

    • name = "abc",则会一直更新为"abc".
    • name = name ,则name会保持数据库中的值
  • 对values使用判断name = ifnull(values(name),name)达到的效果是,如果传入的name值为null,则不更新。不为null则更新

优化方案 “删除后插入” REPLACE INTO

REPLACE INTO 语法

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    {VALUES | VALUE} (value_list) [, (value_list)] ...

REPLACE INTO 的语法其实和 INSERT INTO 的语法已经很像了,不同的是REPLACE INTO 在遇到由于主键或唯一键导致的重复记录时,它会首先删除已经存在的记录,然后再插入新的记录

-- 当 id=1 的记录存在时,会删除原有记录,然后插入我们给出的记录
REPLACE INTO test ( id, NAME, age, address )
VALUES
	( 1, '张三', 199, '北京市' );

总结:使用过程中,主要看主键唯一键

标签:name,删除,age,更新,插入,VALUES,MySQL,INTO
From: https://www.cnblogs.com/fuqian/p/17420609.html

相关文章

  • mysql事务
    (目录)事务的特性原子性(Atomicity):语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的。实现主要基于undolog日志。持久性(Durability):保证事务提交后不会因为宕机等原因导致数据丢失。实现主要基于redolog日志。隔离性(Isolation):保证事务执行尽......
  • MySQL数据库的一些常见问题
    博主介绍:–我是了凡微信公众号【了凡银河系】期待你的关注。未来大家一起加油啊~前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。下面记录一些关于MySQL一些常见的问题文章目录前言1.数据库三大范式2.MySQL存储引擎Mylsam和InnoDB有哪些......
  • 安装mysql服务遇到的问题
    找不到MSVCR120.dll,无继续法执行代码”官方链接MicrosoftVisualC++可再发行的最新下载mysqld:Can'tcreate/writetofile'Drowerdownload\mysql-5.7.19-winx64\mysql-5.7.19-winx64\data\is_writable'(Errcode:2-Nosuchfileordirectory)把my.ini移动到bin目录下......
  • rhel 7.3安装mysql 5.7.21
    文档课题:rhel7.3安装mysql5.7.21安装包:mysql-5.7.21-1.el7.x86_64.rpm-bundle.tar1、上传安装包[root@leo-mysql5721~]#mkdir-p/u01/setup/dbsftp>lcdF:\installmedium\mysql\MySQL-5.7.21sftp>cd/u01/setup/dbsftp>putmysql-5.7.21-1.el7.x86_64.rpm-bundle......
  • Linux MySQL 修改数据和binlog文件目录
    概述系统:CentOS7.6MySQL数据库安装,默认数据库文件和binlog文件都在/var/lib/mysql目录下,若Linux系统安装时,未为根目录分配较大硬盘空间,很容易导致系统根目录硬盘空间不够用,从而导致MySQL服务或系统卡死或挂掉。故需要修改MySQL数据库文件和binlog文件目录。步骤1、停止MySQL服务roo......
  • 电脑文件删除时如何不显示“是否放入回收站”的二次确认窗口?
      本文介绍Windows电脑删除文件时,开启或取消显示确认删除这一提示弹窗的方法。  在Windows电脑中,我们删除任何一个文件时,无论是用鼠标右键选择“删除”选项,还是用快捷键Ctrl与D,默认情况下都会有一个名为“删除文件”的提示框,询问你是否确认要将该文件放入回收站。  在部分......
  • MySQL 查询数据库表的数量
    MySQL查询数据库表的数量 1.获取指定数据库的表的数量SELECTCOUNT(*)TABLES,table_schemaFROMinformation_schema.TABLESGROUPBYtable_schema; 2.获取mysql下所有数据库表的数量SELECTCOUNT(*)TABLES,table_schemaFROMinformation_schema.TABLESWHEREtable_......
  • MySQL注入点写入WebShell的几种方式
    在工具化日益成熟的今天,手工注入的能力越来越被忽视了。当你掌握了一款工具的使用时,应更深入的去了解工具帮你做了什么,把工具所产生的影响控制在自己可控的范围内。比如:当面对一个MySQL注入点,通过使用SQLmap的--os-shell命令选项,便可轻松一键获取Webshell,但是非正常退出时,便会在网......
  • 为什么MySQL单表不能超过2000万行?
    摘要:MySQL一张表最多能存多少数据?本文分享自华为云社区《为什么MySQL单表不能超过2000万行?》,作者:GaussDB数据库。最近看到一篇《我说MySQL每张表最好不要超过2000万数据,面试官让我回去等通知》的文章,非常有趣。文中提到,他朋友在面试的过程中说,自己的工作就是把用户操作信息......
  • 批量执行mysql文件
    mysqldumpMysql数据备份恢复目录mysqldumpMysql数据备份恢复一、需求二、Java实现Mysql备份与恢复pom.xmlmainMysqlBackupsMysqlReductionConfPropresources执行一、需求实现Mysql数据库备份与恢复/***mysqldump命令*备份库*备份所有数据库:mysqldump-h主机IP......