数据库 INSERT OR UPDATE 问题总结

我们在数据库相关的开发中经常遇到这样一个问题:向数据库表中插入某条记录,若是存在就对其进行更新。例如,有如下数据表user(id为主键):

id name passwd
1 usr1 pswd1
... ... ...

向其插入id=1,name=usr1,passwd=pswd2的记录,若存在id=1的记录,则对其进行更新操作。

这个问题在单连接访问的条件下下很简单,可以先对记录执行UPDATE操作,若影响的条数为0,说明没有此记录,然后可以放心大胆的进行INSERT操作。

但是在多并发访问的条件下,上述做法则存在同步问题。若是引入事务则又显得有些小题大做,若是能有一条语句以原子操作的方式完成上述功能那便是极好的。现将MySQL与Oracle的处理办法总结如下。

1、MySQL

MySQL有两种处理方式:REPLACE 和 ON DUPLICATE KEY

    (1)REPLACE

REPLACE与INSERT的语法相仿,形式如下:

replace into table(col1,col2,...) values(val1,val2,...);

例如:

replace into user(id,name,passwd) values(1,‘usr1‘,‘pawd2‘);

如果插入的记录与表中原有的记录不重复,则执行INSERT操作,影响的记录数为1;如果插入的记录与表中原有的记录重复,则先DELETE原有记录,再执行INSERT,影响的记录数为2。

(2)ON DUPLICATE KEY

ON DUPLICATE KEY语句则是把要执行的INSERT语句和UPDATE语句连接在一起。其形式如下:

insert_statement on duplicate key update_statement

例如:

insert into user(id,name,passwd) values(1,‘usr1‘,‘pswd2‘) 
on duplicate key update name=‘usr1‘,passwd=‘pswd2‘;

如果插入的记录与表中原有的记录不重复,则执行前半部分的INSERT操作,影响的记录数为1;如果插入的记录与表中原有的记录重复,则执行后半部分的UPDATE操作,影响的记录数为2。

2、Oracle

Oracle则主要使用merge语句进行处理。例如:

merge into user using(select 1 id,‘usr1‘,‘pswd2‘ from dual) t on (t.id=user.id)
when matched then
    update set user.name=‘usr1‘,user.passwd=‘pswd2‘
when not matched then
    insert (user.id,user.name,user.passwd) values(1,‘usr1‘,‘pswd2‘);
时间: 2024-10-19 05:37:44

数据库 INSERT OR UPDATE 问题总结的相关文章

MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解

本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍,需要的朋友参考下 MySQL数据库insert和update语句引:用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE. 用 于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SEL

MySQL数据库insert和update语句

MySQL数据库insert和update语句 引:用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE. 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就 是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.U

SQL Server下ADO.NET 怎么获取数据库SQL语句INSERT,UPDATE,DELETE了多少行数据

ADO.NET 在发送SQL语句到SQL Server数据库后,怎么知道真正INSERT,UPDATE,DELETE了多少行数据呢? 使用SQL Server内置的全局变量@@ROWCOUNT即可,@@ROWCOUNT可以返回在当前数据库连接(SqlConnection)中,执行的上一条SQL语句影响了多少行数据,使用示例如下所示: INSERT INTO [dbo].[Person]([PersonCode],[Name],[Age],[City]) VALUES (N'P8000',N'He

oracle数据库高级应用之《自动生成指定表的insert,update,delete语句》

1 /* 2 * 多条记录连接成一条 3 * tableName 表名 4 * type 类型:可以是insert/update/select之一 5 */ 6 create or replace function my_concat(tableName varchar2,type varchar2) 7 return varchar2 8 is 9 type typ_cursor is ref cursor; 10 v_cursor typ_cursor; 11 v_temp varchar2

深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete[转]

上篇文章<深入浅出Mybatis系列(六)---objectFactory.plugins.mappers简介与配置>简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介绍mapper映射文件的配置, 这是mybatis的核心之一,一定要学好.在mapper文件中,以mapper作为根节点,其下面可以配置的元素节点有: select, insert, update, delete, cache, cache-ref, resultMap, sql . 本篇文章将简单介绍 in

利用insert,update和delete注入获取数据

0x00 简介 利用SQL注入获取数据库数据,利用的方法可以大致分为联合查询.报错.布尔盲注以及延时注入,通常这些方法都是基于select查询语句中的SQL注射点来实现的.那么,当我们发现了一个基于insert.update.delete语句的注射点时(比如有的网站会记录用户浏览记录,包括referer.client_ip.user-agent等,还有类似于用户注册.密码修改.信息删除等功能),还可以用如上方法获取我们需要的数据吗?在这里,我们以MYSQL的显错为例,看一下如何在insert.u

sqlite中的replace、insert、update之前的区别

本文转自http://www.ithao123.cn/content-933827.html,在此感谢作者 android数据库操作,有两种方式,一种用android提供给我们的数据库操作函数insert.update.replace,我用到的就是这三种.另外一种方式就是利用数据库语言进行操作,也就是利用execSQL这个函数后面带sqlite数据库操作语言进行操作,sqlite中的sql语言和标准的sql语言大同小异,但是你如果是想有针对性的了解,建议你买一本书<SQLite权威指南>,这本

Mysql Insert Or Update语法例子

Mysql Insert Or Update语法例子 有的时候会需要写一段insert的sql,如果主键存在,则update:如果主键不存在,则insert.Mysql中提供了这样的用法:ON DUPLICATE KEY UPDATE.下面就看看它是如何使用的吧! 首先数据库的原始数据如下: a b c 1 b1 c1 2 b2 c2 3 b3 c3 此时如果执行下面的sql就会报错 INSERT INTO test VALUES(1,'b4','c4'); 报错信息如下,提示无法重复插入: 1

操作数据(insert、update、delete)

插入数据 使用Insert Into 插入 if(exists(select * from sys.databases where name = 'webDB')) drop database webDB go --创建数据库 create database webDB on primary ( name = 'webDB', filename='d:\webDB.mdf', size = 5mb, maxsize=unlimited, filegrowth=10% ) log on ( nam