• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > Mysql 原生语句中save or update 的写法汇总

Mysql 原生语句中save or update 的写法汇总

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了mysql savepoint,mysql save,cascade save update,save update,spend or save等相关知识,希望本文的分享对您有所帮助

背景

  在平常的开发中,经常碰到这种更新数据的场景:先判断某一数据在库表中是否存在,存在则update,不存在则insert。
如果使用Hibernate,它自带saverOrUpdate方法,用起来很方便,但如使用原生sql语句呢?
  新手最常见的写法是,先通过select语句查询记录是否存在,存在则使用update语句更新,不存在则使用insert语句插入。
但是这样做明显不够优雅,存在几个问题:
•为了执行一次更新操作,却在程序中使用了两次sql查询语句,在系统负载比较大的情况下,性能还是会有影响的。
•代码中存在if else语句,明明干了一件事,代码却很长。码农都是懒人,能把事情简单做的为啥要复杂做呢:)。
 
那么问题来了,如何优雅的用sql语句实现saverOrUpdate?

  最近工作上也碰到类似更新数据的问题,写多了也开始觉得烦。记得Oracle下有Merge的写法,就google一下mysql的类似实现,整理如下:
 
数据不存在则插入,存在则无操作

   在insert语句中使用ignore关键字实现数据不存在则插入,存在则无操作。它的实现逻辑是,当插入语句出现主键冲突,或者唯一键冲突时,不抛出错误,直接忽略这条插入语句。官网上的相关介绍如下:

“
If you use the IGNORE keyword, errors that occur while executing the INSERT statement are ignored. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row is discarded and no error occurs. Ignored errors may generate warnings instead, although duplicate-key errors do not.
”
Mysql官方文档中提供标准的语法:

INSERT  IGNORE
    INTO tbl_name
    [PARTITION (partition_name,...)]
    [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
</div>

或者

INSERT IGNORE
    [INTO] tbl_name
    [PARTITION (partition_name,...)]
    [(col_name,...)]
    SELECT ...
</div>

可见除了多了个IGNORE关键字以外,跟一般INSERT语句并无区别。

举个栗子:

1.建一张测试用的表

CREATE TABLE `test_tab` (
  `name` varchar(64) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
</div>

2.插入一条数据

insert into `test_tab` (`name`,`age`) values ('zhangsan',24)
</div>

当前test_tab表的数据为:

name|age
:—-|:—
zhangsan|24
</div>

3.再执行一次步骤2的插入语句,则会报异常:

[Err] 1062 - Duplicate entry 'zhangsan' for key 'PRIMARY'
</div>

4.对步骤2的insert语句增加ignore关键字,则不会报异常,已存在的数据也不会被更新。

insert IGNORE into `test_tab` (`name`,`age`) values ('zhangsan',24) ;
</div>
------
语句执行情况:
受影响的行: 0
时间: 0.000s


当前test_tab表的数据为:

name|age
:—-|:—
zhangsan|24
</div>

不存在则插入,存在则更新,其一(使用DUPLICATE KEY UPDATE关键字)

   在insert语句中使用ON DUPLICATE KEY UPDATE关键字实现数据不存在则插入,存在则更新的操作。判断数据重复的逻辑依然是主键冲突或者唯一键冲突。
官网上的相关介绍如下:

“
if you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed. The affected-rows value per row is 1 if the row is inserted as a new row, 2 if an existing row is updated, and 0 if an existing row is set to its current values.
”
Mysql官方文档中提供标准的语法:

INSERT
    [INTO] tbl_name
    [PARTITION (partition_name,...)]
    [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]
</div>

或者:

INSERT
    [INTO] tbl_name
    [PARTITION (partition_name,...)]
    SET col_name={expr | DEFAULT}, ...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]
</div>

或者:

INSERT
    [INTO] tbl_name
    [PARTITION (partition_name,...)]
    [(col_name,...)]
    SELECT ...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]
</div>

可见,还是原来insert语句的写法。
 
举个栗子:

1.使用刚才新建的test_tab表,此时表中的数据如下:

name|age
:—-|:—
zhangsan|24

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于MySQL中savepoint语句使用时所出现的错误
  • Mysql 原生语句中save or update 的写法汇总

相关文章

  • 2017-05-11几个缩减MySQL以节省磁盘空间的建议
  • 2018-12-05MySQL安装配置jdbc和基础学习
  • 2018-12-05CentOS6.5 yum安装mysql5.7.18的实例教程
  • 2017-05-11MySQL获取所有分类的前N条记录
  • 2017-05-11mysql load data infile 的用法(40w数据 用了3-5秒导进mysql)
  • 2018-12-05Mysql分析-profile详解
  • 2018-12-05ORACLE 常用的SQL语法和数据对象
  • 2018-12-05[DB][MyBatis]利用mybatis-paginator实现分页
  • 2018-12-05mysql 分页优化解析
  • 2018-12-05关于MySQL5.6.27在Linux下的安装教程分享(图)

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MySQL服务器时间同步问题
    • 深入解析mysql.sock不见的问题
    • 详解mysql5.7.17最新稳定版本在linux下安装教程
    • MySQL 管理
    • php运行提示Can''t connect to MySQL server on ''localhost
    • Mysql5.7.19在Linux下卸载的方法介绍
    • MySQL之-主从server-id不生效的示例代码(图)
    • mysql服务无法启动报错误1067解决方法(mysql启动错误1067 )
    • 从其他电脑访问本机的Mysql的设置方法
    • 关于日志设置的详细介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有