您现在的位置是:首页 > 正文

SQL:不存在则 insert, 存在则 update

2024-02-29 16:38:25阅读 2

方法一:

在MYSQL中有语句 insert into ... on duplicate key update...

INSERT INTO table (id, name, age) values (1, 'yourname', 18) 
ON DUPLICATE KEY UPDATE name='yourname', age=18;

id字段是主键或者UNIQUE索引。上述语句的作用是:

如果id = 1这条记录是不存在的,那么执行INSERT INTO语句。

如果id = 1在数据库中是存在的,那么执行UPDATE命令,此时这条语句相当于:

UPDATE table SET name='yourname', age=18 WHERE id=1; 

再如果 age 字段也是UNIQUE的,相当于

UPDATE table SET name='yourname' WHERE id=1 OR age=18 LIMIT 1; 

执行UPDATE语句的条件是INSERT语句的执行会造成唯一键的重复。

通常,应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

还可以这样写:

INSERT INTO table 
    (SELECT id, 'hisname' as name FROM table WHERE id >= 3)
ON DUPLICATE KEY UPDATE name=VALUES(name);

这种方法还可以用来批量执行UPDATE操作(因为单条UPDATE语句只能执行一种update操作)

方法二:

创建存储过程

CREATE PROCEDURE name()

if exists(select 1 from 表 where ID = @ID)
begin
   UPDATE 表 SET XX= XX WHERE ID = @ID
end
else
begin
   INSERT 表 VALUES(XX...) 
end

方法三:

使用 if not exists或者where not exists

INSERT INTO table 
SELECT id + 10 as id, name 
FROM table 
WHERE NOT EXISTS (
    SELECT * FROM t WHERE id = 10
    ) 
AND id = 27;

WHERE (NOT) EXISTS也是一种根据WHERE条件进行过滤数据的操作,它可以跟一个子查询然后返回查询结果是否为空 。在给定条件下可以返回一个空的子查询,使得插入的INSERT INTO语句接的SELECT子句返回的是一个空的结果 。

详见

https://blog.csdn.net/tashanhongye/article/details/50069363​

blog.csdn.net/tashanhongye/article/details/50069363

https://blog.csdn.net/u012686173/article/details/40352033​

blog.csdn.net/u012686173/article/details/40352033

方法四:

使用REPLACE INTO语句替代INSERT INTO

REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除 !删除 !

所以还需要你有删除数据的权限。


注意,除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

需要注意的问题就是replace into的时候会删除老记录。如果表中有一个自增的主键,那么就要出问题了。

参考:

mysql 【sql语句】replace into用法详细说明​

blog.csdn.net/qq_33862644/article/details/78816653

网站文章

  • ubuntu18.04中文输入问题

    ubuntu18.04中文输入问题

    ubuntu中文输入问题:终端输入:sudo apt-get install ibus-pinyin然后在 settings 的 Region & Language 的 Input Sources设置栏中 点击 Manage Installed Language ,初次进入会安装些字体等相关信息。重启后使之生效。 点击 + 添加 Chinese(Intell...

    2024-02-29 16:37:56
  • 新版chrome浏览器字体编码插件Charset v0.5.5

    新版chrome浏览器字体编码插件Charset v0.5.5

    谷歌浏览器编码 Charset_v0.5.5

    2024-02-29 16:37:48
  • docker常用命令及常见问题整理

    docker常用命令及常见问题整理

    一、Docker核心概念1.Docker镜像类似于虚拟机镜像,理解为面向Docker引擎得只读模板,包含文件系统。2.docker容器类似一个轻量级沙箱,docker利用容器隔离、运行应用。容器是从镜像创建得应用实例,各容器创建、运行、停止,互不影响。镜像本身只是可读得。容器从镜像启动时候,docker会在镜像最上层创建一个可写层,镜像本身保持不变。3.docker仓库,类...

    2024-02-29 16:37:40
  • ajax工具包,使用Ajax工具包的日历

    我正在尝试使用JavaScript中的AJAX工具包在我的ASP.NET网页中实现日历,以便动态创建文本框并使用弹出日历填充它。代码如下:for(var j=1; j<2;j++){BorderStyle="Inset" Width="10px" >}在浏览器中查看后出现以下错误:在DataBind,Init,Load期间无法修改控件集合,PreRender或卸载阶段。描述:未处理的异...

    2024-02-29 16:37:07
  • SpringBoot构建MVC

    1.新建SpringBoot工程,pom.xml配置如下&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;pro...

    2024-02-29 16:37:00
  • POJ 2728 Desert King(最优比例生成树)

    题目大意 有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目是要求一棵最优比率生成树。解法 有带权图G, 对于图中每条边e[i], 都有benefiti和costi, 我们要求的是一棵生成树T, 它使得 ∑(benefit[i]) / ∑(cost

    2024-02-29 16:36:31
  • 23种设计模式之访问者模式(Visitor Pattern)

    23种设计模式之访问者模式(Visitor Pattern)

    本篇文章将23种设计模式中的访问者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

    2024-02-29 16:36:23
  • 初识JAVA---变量、常量、作用域

    修饰符 1、default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。 2、private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰...

    2024-02-29 16:36:17
  • oracle挂卷用裸设备,如何在lvm映射的裸设备上安装Oracle数据库

    本文主要介绍了Oracle 10g在lvm映射的裸设备上的安装过程,包括创建磁盘分区、创建PV、创建VG、创建相关的lv、以及裸设备配置文件的更改等,希望能够对您有所帮助。Oracle 10g在lvm...

    2024-02-29 16:36:08
  • windows和linux下查看dll依赖关系

    windows下,进程查看器(ProcessExplorer)可以用来查看进程(实时运行)依赖的dll文件;DependencyWalker可以用来查看dll或exe依赖的dll文件。linux下,ldd可以用来查看bin文件或dll文件依赖的dll

    2024-02-29 16:35:40