SQL语句中的ON DUPLICATE KEY UPDATE使用_MsSql

来源:脚本之家  责任编辑:小易  
目录
一:主键索引,唯一索引和普通索引的关系主键索引唯一索引:普通索引:二:ON DUPLICATE KEY UPDATE使用测试(MYSQL下的Innodb引擎)1:ON DUPLICATE KEY UPDATE功能介绍:2:ON DUPLICATE KEY UPDATE测试样例+总结:总结:

一:主键索引,唯一索引和普通索引的关系

主键索引

主键索引是唯一索引的特殊类型。 
数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。 
在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。主键索引不能为空。每个表只能有一个主键

唯一索引:

不允许两行具有相同的索引值。但可以都为NULL,笔者亲试。 
如果现有数据中存在重复的键值,则数据库不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。每个表可以有多个唯一索引

普通索引:

一般的索引结构,可以在条件删选时加快查询效率,索引字段的值可以重复,可以为空值

二:ON DUPLICATE KEY UPDATE使用测试(MYSQL下的Innodb引擎)

上面介绍了索引的知识,是为了介绍这个ON DUPLICATE KEY UPDATE功能做铺垫。

1:ON DUPLICATE KEY UPDATE功能介绍:

有时候由于业务需求,可能需要先去根据某一字段值查询数据库中是否有记录,有则更新,没有则插入。你可能是下面这样写的

if not exists (select node_name from node_status where node_name = target_name)
      insert into node_status(node_name,ip,...) values('target_name','ip',...)
else
      update node_status set ip = 'ip',site = 'site',... where node_name = target_name

这样写在大多数情况下可以满足我们的需求,但是会有两个问题。

①性能带来开销,尤其是系统比较大的时候。

②在高并发的情况下会出现错误,可能需要利用事务保证安全。

有没有一种优雅的写法来实现有则更新,没有则插入的写法呢?ON DUPLICATE KEY UPDATE提供了这样的一个方式。

2:ON DUPLICATE KEY UPDATE测试样例+总结:

首先我们了解下这个简单的表结构id(主键)、code、name。

看下表中现有的数据:

执行以下实验进行分析:

实验一:含有ON DUPLICATE KEY UPDATE的INSERT语句中包含主键:

①插入更新都失败,原因是因为把主键id改成了已经存在的id

 

②执行更新操作。这里的数据还是四条。不过第四条的id由75变化为85

③执行更新操作。数据总量是四条

④insert语句中未包含主键,执行插入操作。数据量变为5条

实验二:含有ON DUPLICATE KEY UPDATE的INSERT语句中包含唯一索引:

表结构中增加code的唯一索引,表中现有的数据:

①插入更新都失败,原因是因为把code改成了已经存在的code值

②执行更新操作。这里的数据总量为5条。不过第五条的code由1000变化为1200

 

③执行更新操作。数据总量五条,没有变化

④insert语句中未包含唯一索引,执行插入操作。数据量变为6条

总结:

1:ON DUPLICATE KEY UPDATE需要有在INSERT语句中有存在主键或者唯一索引的列,并且对应的数据已经在表中才会执行更新操作。而且如果要更新的字段是主键或者唯一索引,不能和表中已有的数据重复,否则插入更新都失败。

2:不管是更新还是增加语句都不允许将主键或者唯一索引的对应字段的数据变成表中已经存在的数据。

最后感谢博主文章:MySQL:插入更新语句ON DUPLICATE KEY UPDATE

到此这篇关于SQL语句中的ON DUPLICATE KEY UPDATE使用的文章就介绍到这了,更多相关SQL ON DUPLICATE KEY UPDATE内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:mysql?ON?DUPLICATE?KEY?UPDATE重复插入时更新方式mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点实例分析MYSQL的REPLACE和ON DUPLICATE KEY UPDATE语句介绍解决问题实例MySQL的Replace into 与Insert into on duplicate key update真正的不同之处mysql ON DUPLICATE KEY UPDATE语句示例深入mysql "ON DUPLICATE KEY UPDATE" 语法的分析Mysql中Insert into xxx on duplicate key update问题mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )

  • 本文相关:
  • sql server 数据库分离与附加(图文教程)
  • 在sql server中查询资料库的table数量与名称的sql语句
  • sql server 2012 备份集中的数据库备份与现有的xxx数据库不同
  • sql?server?数据库基础编程详解
  • sql server误区30日谈 第2天 dbcc checkdb会导致阻塞
  • mysql 多表查询实现分析
  • 在sql中使用convert函数进行日期的查询的代码
  • 远程登陆sql server 2014数据库的方法
  • sql server 定时自动备份数据库的图文方法
  • sql server数据库的作业的脚本及存储过程
  • 帮我翻译一下下面的SQL语句~最后on delete restrict on update
  • sql server 2000安装程序配置服务器失败
  • 1、 举例说明创建外键的SQL语句中的参照表和被参照表各指什...
  • Sql语句中的inner join on,array都是什么意思
  • 解析sql语句中left_join、inner_join中的on与where的区别
  • sql语句中的left join on 中的on是什么意思?on后边必须跟两个表...
  • 解析sql语句中left_join、inner_join中的on与where的区别
  • SQL语句中的join只能与on连用吗?有没有只用join的?举个例子...
  • SQL语句,grent all privileges on *.* to monty@localhot identified...
  • SQL存储过程前面有语句set ANSI_NULLS ON set QUOTED_ID...
  • 一个sql语句中inner join on 可以连接三张或四张表吗,具体怎么连...
  • SQL存储过程前面有语句set ANSI_NULLS ON set QUOTED_ID...
  • 1、 举例说明创建外键的SQL语句中的参照表和被参照表各指什...
  • 浅谈,SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND...
  • 语句中log on是什么意思?
  • 浅谈,SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND...
  • 如何替换sql语句中的“'”单引号,防止程序出错
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mssqlmysql?on?duplicate?key?update重复插入时更新方式mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点实例分析mysql的replace和on duplicate key update语句介绍解决问题实例mysql的replace into 与insert into on duplicate key update真正的不同之处mysql on duplicate key update语句示例深入mysql "on duplicate key update" 语法的分析mysql中insert into xxx on duplicate key update问题mysql insert的几点操作(delayed,ignore,on duplicate key update )sql server 数据库分离与附加(图文教程)在sql server中查询资料库的table数量与名称的sql语句sql server 2012 备份集中的数据库备份与现有的xxx数据库不同sql?server?数据库基础编程详解sql server误区30日谈 第2天 dbcc checkdb会导致阻塞mysql 多表查询实现分析在sql中使用convert函数进行日期的查询的代码远程登陆sql server 2014数据库的方法sql server 定时自动备份数据库的图文方法sql server数据库的作业的脚本及存储过程sql server 2012 安装图解教程(附sql201sql server数据库入门学习总结microsoft sql server 2012 数据库安win7系统安装sqlserver2000的详细步骤(图文)sql重复记录查询的几种方法sqlserver中distinct的用法(不重复的记录)ddl、dml和dcl的区别与理解sql server错误代码大全及解释(留着备用)sql-order by 多字段排序(升序、降序)sql将一个表中的数据插入到另一个表中的方法xp_cmdshell开启与关闭浅析sqlserver中的scanf与printfsql优化技巧指南sql 中stuff用法删除数据库中重复数据的几个方法sqlserver分页查询关于使用top方式和row_number()解析函sqlserver用t-sql命令批量删除数据库中指定表(游标循环删除)sql server 使用join all优化 or 查询速度sql server误区30日谈 第6天 有关null位图的三个误区sqlite之autoincrement关键字(自动递增)
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved