平时我们在设计数据库表的时候总会设计 unique  或者 给表加上 primary key 的限制条件.

此时 插入数据的时候 ,经常会有这样的情况:

我们想向数据库插入一条记录:

若数据表中存在以相同主键的记录,我们就更新该条记录。

否则就插入一条新的记录。

逻辑上我们需要怎么写:

$result = mysql_query('select * from xxx where id = 1');

$row = mysql_fetch_assoc($result);

if($row){

mysql_query('update ...');

}else{

mysql_query('insert ...');

}

但是这样写有两个问题

1、效率太差,每次执行都要执行2个sql

2、高并发的情况下数据会出问题,不能保证原子性

还好MySQL 为我们解决了这个问题:我们可以通过 ON DUPLICATE KEY UPDATE  达到以上目的, 且能保证操作的原子性和数据的完整性。

ON DUPLICATE KEY UPDATE 可以达到以下目的:

向数据库中插入一条记录:

若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。

否则插入一条新的记录。

示例:

Step1 . 创建表,插入测试数据

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------

-- Table structure for mRowUpdate

-- ----------------------------

DROP TABLE IF EXISTS `mRowUpdate`;

CREATE TABLE `mRowUpdate` (

`id` int(11) NOT NULL,

`value` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;

-- ----------------------------

-- Records of mRowUpdate

-- ----------------------------

INSERT INTO `mRowUpdate` VALUES ('1', 'sss');

INSERT INTO `mRowUpdate` VALUES ('2', 'szh');

INSERT INTO `mRowUpdate` VALUES ('3', '9999');

SET FOREIGN_KEY_CHECKS=1;

Step2 .测试 ON DUPLICATE KEY UPDATE 的使用方法:

INSERT INTO mRowUpdate(id,`value`) VALUES(3, 'SuperMan') ON DUPLICATE KEY UPDATE `value`='SuperMan';

Step3. 查询数据的变化情况

select * from test.mRowUpdate;

id

value

1

sss

2

szh

3

SuperMan

==========================     话外篇   ===============================

技巧:

技巧 1 :

ON DUPLICATE KEY UPDATE 特别适用于多行插入。如:

INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`);

Tips: VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候会返回NULL。

注意事项:

注意 1:

若多个索引都冲突,则只有一条记录被修改。

create table test(

id int not null primary key,

num int not null UNIQUE key,

tid int not null

)

为了测试两个唯一索引都冲突的情况,然后插入下面的数据

insert into test values(1,1,1), (2,2,2);

然后执行:

insert into test values(1,2,3) on duplicate key update tid = tid + 1;

因为a和b都是唯一索引,插入的数据在两条记录上产生了冲突,然而执行后只有第一条记录被修改

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

mysql不能写重复键_mysql主键重复,不抱错,只更新的骚操作 (如果没有插入,如果有更新)...相关推荐

  1. mysql 备库 hang住_mysql主键的缺少导致备库hang住

    最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...

  2. mysql主键_mysql主键是什么?

    在mysql中,主键全称"主键约束",是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性:主键的作用是确定该数据的唯一性,主要是用于和其他表的外键关联, ...

  3. mysql 把主键当外键_mysql主键和外键那点事

    1.主键: 若某一个属性组(注意是组)能唯一标识一条记录,该属性组就是一个主键.主键不能重复,且只能有一个,也不允许为空.定义主键主要是为了维护关系数据库的完整性. 2.外键: 外键用于与另一张表的关 ...

  4. MySQL里什么是主键_mysql主键是什么?

    本篇文章主要给大家介绍什么是mysql 主键及其作用,希望对需要的朋友有所帮助! mysql 主键是什么? mysql数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表 ...

  5. mysql 把主键当外键_MySQL主键和外键使用及说明

    MySQL主键和外键使用及说明 一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的 ...

  6. mysql 主键引用外键_mysql 主键与外键

    一.主键详解,引用自:https://blog.csdn.net/haiross/article/details/50456154 1.要设置主键自增的话字段必须是整形数字. 二.外键详解:引用自ht ...

  7. mysql 什么是主键_mysql – 主键应该是什么?

    我遇到了一个我似乎无法解决的问题. 比如说我有一张即将发布的视频游戏发布的表格: GAME game_ID | title ----------------------------- 1 | Supe ...

  8. mysql主键外键_MySQL主键和外键使用及说明

    摘自网上一个经典的例子:大哥和小弟 一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以 ...

  9. mysql怎么写主外键_mysql主外键约束怎么写?

    mysql主键约束的写法:"CREATE TABLE 表名(字段名 数据类型 PRIMARY KEY)":mysql外键约束的写法:"CREATE TABLE 表名(FO ...

最新文章

  1. jdbc报Incorrect string value: '\xF0\x9F\xA4\x97' for column
  2. SpringBoot跨域
  3. 导出.txt / .pdf / .xls
  4. JAVA 客户端跳转与服务器端跳转 get与post
  5. go python java_一文助你搞懂参数传递原理解析(java、go、python、c++)
  6. 一文理清Http2.0
  7. python中字符编码使用_python中字符编码是什么?如何转换字符?
  8. python求素数算法_Python程序最多可计算n个质数(使用不同算法)
  9. IntelliJ IDEA 对于generated source的处理
  10. 关于ARCGIS SERVER 9.3的ArcGIS Server Manager出现“/”应用程序中的服务器错误
  11. Echarts定制一个地图
  12. NumPy 简单应用
  13. 一文看懂阿里、京东、滴滴大数据架构变迁
  14. tsql 和 clr 的性能实测比对
  15. wow大芒果mysql,大芒果魔兽世界3.3.5GM命令范例.doc
  16. html日历菜鸟,Calendar(日历)
  17. recoil error Cannot assign to read only property of object ‘#‘
  18. linux kill一个进程杀不掉怎么解决?
  19. 一款在线视频 App,基于 Material Design + MVP + RxJava + Retrofit + Realm + Glide
  20. 未来机器人会有多“可怕”,这些技术已经有所体现

热门文章

  1. jboss7(01)服务器开启和关闭命令
  2. HDFS dfsclient写文件过程 源码分析
  3. 运维与节能:数据中心绿色运维技术研讨会召开
  4. Ural_1030. Titanic
  5. struts框架学习过程中的问题。
  6. 训练日志 2019.1.13
  7. 1 MM配置-企业结构-定义-定义评估级别
  8. 6 只能在公司代码xxxx的期间2020/08和2020/07中记账
  9. 一旦有辞职念头就干不长了吗_年轻人辞职需不需要冷静期?辞职需要冷静,不需要企业给出冷静期...
  10. Windows与Linux(服务器)之间大文件传输