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

mysql 唯一更新_MySQL 唯一索引和插入重复自动更新

有时我们在往数据库插入数据的时候,需要判断某个字段是否存在,如果存在则执行更新操作,如果不存在则执行插入操作,如果每次首先查询一次判断是否存在,再执行插入或者更新操作,就十分不方便。

ON DUPLICATE KEY UPDATE

这个时候可以给这个字段(或者几个字段)建立唯一索引,同时使用以下 sql 语句进行插入或更新操作:

INSERT INTO table (id, user_id, token) VALUES (NULL, '2479031', '232') ON DUPLICATE KEY UPDATE user_id = VALUES(user_id), token = VALUES(token), online = VALUES(online)

MySQL 给字段添加唯一索引

添加唯一索引 sql:

ALTER TABLE table_name ADD UNIQUE (column_list)

注意:如果没有唯一索引,则无法触发 ON DUPLICATE KEY 这样的事件,DUPLICATE 表示重复的意思,如某个字段没有添加唯一索引,则不认为插入同样的值是重复的,所以对不可重复的字段必须建立唯一索引。

实例说明

如一个需求是提供一个接口给 IOS 端,用于上报用户 id,设备,在线状态等信息,接口以 GET 方式传参,用户每次打开或退出 APP 就请求接口。

接口收到请求,将信息记录到数据库,根据用户 id 进行判断,如果存在则更新,不存在就新增。

这个时候 sql 语句使用上面介绍的 on duplicate key update 语句。

INSERT INTO table (id, user_id, token) VALUES (NULL, '2479031', '232') ON DUPLICATE KEY UPDATE user_id = VALUES(user_id), token = VALUES(token), online = VALUES(online)

以这个 sql 为例,其中 user_id 是唯一索引字段,如果 insert 的时候该 user_id 已经存在,那么就将触发更新而不是插入,此时相当于执行了:

update table set user_id = 2479031 token = 232 where user_id = 2479031

这就是唯一索引和 ON DUPLICATE KEY UPDATE 的用法。

相关文章:

  • linux mysql apache php 安装_Linux下Apache+MySQL+PHP的安装与配置
  • mysql自动判断索引机制_关于mysql 索引自动优化机制: 索引选择性(Cardinality:索引基数)...
  • mysql左表有右表没有_查询左表存在而右表不存在的记录
  • python编程语言轻松入门_Python快速入门
  • c#打开mysql表格_使用C#更新mySQL表
  • arcgis python add in崩溃_arcgis python 异常处理
  • mysql5.7.17 win10_MySQL数据库之mysql 5.7.17 安装配置方法图文教程(windows10)
  • 多态 java_Java的多态(深入版)
  • java循环三角形_java用循环画三角形思路
  • 面试题java的泛型_Java高级面试 —— Java的泛型实现机制是怎么样的?
  • java 内存 新生代_JVM源码分析之堆内存的初始化
  • wsdl soap java_[Java] webservice soap,wsdl 例子
  • 人人网java面试题_人人网Java开发工程师笔试题
  • java国家排序_Java各种排序算法汇总(冒泡,选择,归并,希尔及堆排序等)
  • java json 增删查改_Java基础开发之JDBC操作数据库增删改查,分页查询实例详解
  • C++类的相互关联
  • JAVA_NIO系列——Channel和Buffer详解
  • js对象的深浅拷贝
  • js正则,这点儿就够用了
  • Linux gpio口使用方法
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • ubuntu 下nginx安装 并支持https协议
  • 聊聊redis的数据结构的应用
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 普通函数和构造函数的区别
  • 区块链分支循环
  • ionic异常记录
  • ​ubuntu下安装kvm虚拟机
  • #mysql 8.0 踩坑日记
  • #pragma once与条件编译
  • (02)vite环境变量配置
  • (1)(1.13) SiK无线电高级配置(六)
  • (LeetCode) T14. Longest Common Prefix
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (一)appium-desktop定位元素原理
  • (原)Matlab的svmtrain和svmclassify
  • (转)大型网站架构演变和知识体系
  • (转)四层和七层负载均衡的区别
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET Core WebAPI中封装Swagger配置
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net 发送邮件
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net和php怎么连接,php和apache之间如何连接
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [20190416]完善shared latch测试脚本2.txt
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AX]AX2012 SSRS报表Drill through action
  • [C#][DevPress]事件委托的使用
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [HXPCTF 2021]includer‘s revenge
  • [IE 技巧] 显示/隐藏IE 的菜单/工具栏