SQL:不存在则 insert, 存在则 update
Posted GE12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL:不存在则 insert, 存在则 update相关的知识,希望对你有一定的参考价值。
目录
方法一: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的主要内容,如果未能解决你的问题,请参考以下文章