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

Posted GE12

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL:不存在则 insert, 存在则 update相关的知识,希望对你有一定的参考价值。

目录

方法一:duplicate key update

方法二:存储过程

方法三:update + insert

方法四:REPLACE INTO


方法一:duplicate key update

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

方法三:update + insert

使用 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子句返回的是一个空的结果 。

方法四:REPLACE INTO

使用REPLACE INTO语句替代INSERT INTO 。

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

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


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

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

以上是关于SQL:不存在则 insert, 存在则 update的主要内容,如果未能解决你的问题,请参考以下文章

SQLserver DTS 中怎么更新资料(就是不存在则insert存在则update)?

用一条sql语句实现:存在则啥都不干,不存在,则插入

MySQL INSERT插入条件判断:如果不存在则插入

MySQL INSERT插入条件判断:如果不存在则插入

mysql批量更新,数据存在则更新,不存在则插入

PostgreSql INSERT 插入数据判断数据是否存在,存在则更新,不存在则插入