一. insert ignore into

当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。例如:

INSERT IGNORE INTO books (name) VALUES ('张三')

这种方法很简便,但是有一种可能,就是加入不是因为重复数据报错,而是因为其他原因报错的,也同样被忽略了~

比如:某个字段被设置了 not null 并没有设置默认值,是为了防止插入时漏掉这个字段,但是使用INSERT IGNORE后,如果没有设置这个字段默认值,将不会报错,会自动设置一个没有用的默认值,如int,则自动默认值变为0,varchar则自动变为''(空字符串)。

二. on duplicate key update

当primary或者unique重复时,则执行update语句,如update后为无用语句,如id=id,则同1功能相同,但错误不会被忽略掉。例如,为了实现name重复的数据插入不报错,可使用一下语句:

INSERT INTO books (name) VALUES ('张三') ON duplicate KEY UPDATE id = id

这种方法有个前提条件,就是,需要插入的约束,需要是主键或者唯一约束。

三. insert … select … where not exist

根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件。例如:

INSERT INTO content (

detail,

status,

beginTime,

endTime)

SELECT

@detail,

1,

NULL,

NULL

FROM DUAL

WHERE NOT EXISTS(

SELECT contentId

FROM content

WHERE detail=@detail);

通用例子:

INSERT INTO table(column1,column2,column3 ...columnN)

SELECT value1,value2,value3 ...valueN

FROM dual

WHERE NOT EXISTS(

SELECT *

FROM table

WHERE value = ?

);

四. replace into

replace into 插入数据时,首先会根据主键(Primary Key )或者唯一索引(Unique)判断是否存在重复数据。

有重复数据,先删除此行数据,然后插入新的数据

无重复数据,直接插入新数据

REPLACE语句返回受影响的行数。这个行数是删除和插入的行的总和。如果计数为1,说明 REPLACE则插入一行并且不删除任何行。如果计数大于1,则在插入新行之前删除一个或多个旧行。

弊端:

把旧记录删除之后,插入的新记录只是插入了那些指定的字段,原本不想更新的字段,直接为默认值了,会导致数据丢失。

replace中执行delete时, 在有外键的情况下会很麻烦,更新后新记录会产生新的id,导致这种关联丢失。

replace每次要重新分配自增id,很容易导致id值范围不够用。

若是数据库存在主从关系,在主机器上进行了replace into操作之后,从机器上对应表的AUTO_INCREMENT是不会更新的,导致从机器转为主机器时,新插入数据会出现异常,直到AUTO_INCREMENT增加到原来主机器的值为止。

replace into 匹配到条件以后会先delete然后insert,而不是执行update,效率较update低很多。

如果delete时定义的有触发器, 则会被执行;

副作用也会被传播到replica slave.

对于某些场景,比如三个字段(A, B, C), A为唯一索引, 重复的情况下你不想改动B, 则:

insert into table1(A, B, C) values(1,2,3) on duplicate key update C=3;

效率上来说, INSERT ... ON DUPLICATE KEY UPDATE 比replace 要好, 毕竟replace如果重复则 先删除再插入.

mysql防止预约重号_mysql 防止重复插入唯一限制的数据相关推荐

  1. MySQL防止重复插入唯一限制的数据 4种方法

    MySQL防止重复插入唯一限制的数据,下面我们逐一分析 : 1.insert ignore into  当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回.所以使用ignore请确 ...

  2. mysql重复写入_MYSQL避免重复插入记录的三种方法

    方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: insert ignore into table_name(email ...

  3. mysql解决不可重复读_mysql怎么解决不可重复读

    mysql解决不可重复读的方法:采用了mvcc多版本并发控制,mvcc是利用在每条数据后面加了隐藏的两列,即创建版本号和删除版本号,每个事务在开始的时候都会有一个递增的版本号. [相关学习推荐:mys ...

  4. mysql防止不可重复读_mysql怎么解决不可重复读

    mysql解决不可重复读的方法:采用了mvcc多版本并发控制,mvcc是利用在每条数据后面加了隐藏的两列,即创建版本号和删除版本号,每个事务在开始的时候都会有一个递增的版本号. [相关学习推荐: my ...

  5. mysql数据库快速传输方案_MySQL数据库迁移快速导出导入大量数据

    数据库迁移是我们经常可遇到的问题,对于少量的数据,迁移基本上不会有什么问题.生产环境中,有以下情况需要做迁移工作: 磁盘空间不够.比如一些老项目,选用的机型并不一定适用于数据库.随着时间的推移,硬盘很 ...

  6. mysql给用户重命名_MySQL如何修改用户名?(代码实例)

    如果MySQL管理员希望在不更改用户帐户特权的情况下更改现有MySQL用户帐户的用户名或主机,可以在MySQL中使用RENAME USER语句. RENAME USER语句语法 :RENAME USE ...

  7. mysql批量添加卡号_mysql数据库卡号卡密批量生成写入验证附易辅助模块

    SQL = "select * from dianka where kahao='" + 编辑框2.内容 + "' and mima='" + 编辑框3.内容 ...

  8. mysql给数据库重命令_mysql 重命令数据库

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. mysql输入中文出现 号_MySQL插入中文数据出现?号

    运行环境:win10 mysql版本:Mysql5.6 做一个项目的时候,向数据库插入中文数据,一直都是? 问过度娘之后,她提供的以下办法: 1.在连接数据库的url后加:?useUnicode=tr ...

最新文章

  1. php读取mysql分页查询
  2. php 接口数组排序,php 数组排序
  3. 电脑有回声_专递课堂互动教室现场有回声怎么办?
  4. rust(26)-单元类型与never
  5. mysql 不支持 select into
  6. mongodb哪些情况适用内嵌,哪些情况适用引用
  7. 使用 Flex 开发 Web 服务客户端
  8. 孤独的个人在社会中生存应掌握的基本健康技能(个人分析)
  9. 安装VCSA6.7(vCenter Server Appliance 6.7) 2019.7.9
  10. AJPFX关于JDK,JRE,JVM的区别与联系
  11. 机器学习之K-近邻算法
  12. 001.Spark的日志配置
  13. 服务器mstsc远程桌面,远程桌面工具,详细教您如何使用远程桌面工具mstsc连接远程桌面...
  14. android下载工具 磁力,【安卓+iOS】磁力搜索+下载工具
  15. InstallShield Limited Edition Project下载及进行打包发布汇总
  16. 改led背光有光斑_为什么把车灯改成LED,效果还不如卤素?
  17. JetBrain系列软件的学生授权认证及认证到期重新申请授权
  18. 雨听 | 英语学习笔记(五)~作文范文:学生退学
  19. 微信公众号自定义分享IOS失效
  20. python复利代码_使用Python进行复利

热门文章

  1. [crypto][ipsec] 简述ESP协议的sequence number机制
  2. (网页)java数组去重总结(转)
  3. 在Ubuntu1404的64bit版本下安装caffe
  4. 关于@SuppressWarnings(unchecked)注解
  5. 数据结构的java实现
  6. Linux 命令整理 —— 基本操作
  7. Fast-SCNN:多分支结构共享低级特征的语义分割网络
  8. 官方文档太辣鸡?TensorFlow 2.0开源工具书,30天「无痛」上手
  9. 只看影子就能还原视频,MIT新算法让摄像头无死角
  10. 社招 | 腾讯天天P图 定义视频新科技~base上海