replace函数sql用法

2022-11-30 投稿:连俊达 分享

在涉及到DataBase的开发的过程,经常遇到如下的场景:

业务逻辑需要向数据库插入一条新数据,但是需要做如下的判断:

1. 判断数据库里是否已经存在这样一条记录(有特定的判断依据);

2.1 如果数据库里没有这条记录,那么全新创建这条记录;

2.2 如果数据库里已有这条记录,那么更新这条记录;

一般情况下,会想到的处理方式如下:

编程代码级控制数据的插入和更新:

synchronized void insertNewRecord(Object data){

Object data = “select * from table where clientId = ‘abc’”;

if(data == null) {

// insert into table;

} else {

// update table;

}

}

这时候考虑到线程安全的问题,给整个方法加上了synchronized关键字,从而保证整个方法的多个步骤形成一个原子操作。 这时候所带的问题也显而易见:

1. 需要通过细心的编程来保证这个操作在多线程下的正确性;

2. 通过synchronize关键字对整个方法进行同步,对系统性能无疑会产生影响;

3. 能数据的操作是通过两次操作的完成的。

那么有没什么方法可以解决上面的问题,将对数据库的两次操作变成一次呢?

在MySql里可以通过以下两种SQL语句来完成:

1. INSERT ON DUPLICATE KEY UPDATE

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)

->ON DUPLICATE KEY UPDATE c=c 1;

mysql>UPDATE table SET c=c 1 WHERE a=1;

如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。

注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:

mysql>UPDATE table SET c=c 1 WHERE a=1 OR b=2 LIMIT 1;

如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。

2. REPLACE INTO VALUES

使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。

在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。

在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。如果返回的值大于2,那说明有多个唯一索引,有多条记录被删除和插入。

REPLACE的语法和INSERT非常的相似,如下面的REPLACE语句是插入或更新一条记录。

REPLACE INTO users (id,name,age) VALUES(123, '赵本山', 50);

注: REPLACE和INSERT ON DUPLICATE的区别,在于REPLACE会影响多条结果。比如在表中有超过一个的唯一索引。在这种情况下,REPLACE将考虑每一个唯一索引,并对每一个索引对应的重复记录都删除,然后插入这条新记录。假设有一个table1表,有3个字段a, b, c。它们都有一个唯一索引。

CREATE TABLE table1(a INT NOT NULL UNIQUE,b INT NOT NULL UNIQUE,c INT NOT NULL UNIQUE);

假设table1中已经有了3条记录

a b c

1 1 1

2 2 2

3 3 3

下面我们使用REPLACE语句向table1中插入一条记录。

REPLACE INTO table1(a, b, c) VALUES(1,2,3);

返回的结果如下

Query OK, 4 rows affected (0.00 sec)

在table1中的记录如下

a b c

1 2 3

我们可以看到,REPLACE将原先的3条记录都删除了,然后将(1, 2, 3)插入。

最后: 上述两种方法都作用在唯一性索引上,如果你判断重复的列不是唯一性索引,那么这两种方法必然是不适用的,那么这时候还想作为一次操作就必须作用SQL的组合语句了:

INSERT INTO table VALUES (*, * , *, …) WHERE * NOT IN (SELECT * FROM WHERE *=*);

好文要顶 关注我 收藏该文

#replace函数sql用法#相关文章

sql把时间转换成纯数字

这种问题网上一搜一堆,我只说一下一种方案,建立链接服务器直接把一个表插入目标服务器的表,至于时间字段mysql可以用UNIX_TIMESTAMP转化为数字。sqlserver方法就更多了比如dated

0.2万人浏览 SQLsql 时间

sql数据库密码忘了怎么办

相信很多人都跟小编一样不管是什么账号,如果很久不用就会忘记登录密码,像数据库SQLServer2008也一样有用户名和登录密码,下面小编就分享一下如何找回或修改SQLServer2008密码步骤阅读工

0.2万人浏览 SQLsqlsql数据库

经典SQL查询语句大全

select * from table1 where 工资>2500 and 工资<3000 //同上select 姓名 from table1 where 性别='0'

0.2万人浏览 sqlsql语句查询语句

SQL难学吗?

比较好学的一种数据库了,相对于sqlserver和oracle绝对是容易的,而且相关的问题求解也相当的多,所以作为数据库学习的起步,mysql做为第一个挺好的,之后,也要学点sqlserver和ora

0.2万人浏览 sqlSQL难学?

sql语句大全实例教程

oracle分oracle实例和oracle数据库文件1、实例是指内存结构,包括SGA和Sga和后台进程,所有这些统一一个名字叫实例名。2、数据文件就是存数据的文件。关闭状态下,数据库文件存在磁盘上,

0.2万人浏览 SQLsql语句SQL语句

sql语句大全审计实例教程

二、审计可以分为3类。或者说,可以从3种角度去启用审计。1、语句审计(Statement Auditing)。 对预先指定的某些SQL语句进行审计。这里从SQL语句的角度出发,进行指定。审计只关心执行

0.2万人浏览 SQLsql语句

sqlserver怎么卸载干净

方法/步骤 删除SQLServer2005步骤:1,先把SRVINSTW.EXE解压出来,然后双击运行,打开程序主界面,选择“移除服务”,然后按“下一步”。2,在打开的另一个窗口中选择“本地机器”,然

0.2万人浏览 SQLServerSERVER

SQL数据库入门

在sql软件是可以用sql语句创建一个数据库的,所以今天就由小编来为大家介绍sql软件怎么使用sql语句创建一个数据库。第一步:首先在电脑上打开sql数据库软件。然后右键点击新建查询。第二步:然后用c

0.2万人浏览 SQLsqlSQL数据库