mysql重复写入_MYSQL避免重复插入记录的三种方法
方案一:使用ignore关键字
如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:
insert ignore into table_name(email,phone,user_id) values('test9@163.com','99999','9999'),
这样当有重复记录就会忽略,执行后返回数字0,还有个应用就是复制表,避免重复记录:
insert ignore into table(name) select name from table2
方案二:使用Replace
replace的语法格式为:
replace into table_name(col_name, ...) values(...)
replace into table_name(col_name, ...) select ...
replace into table_name set col_name=value, ...
算法说明:
REPLACE的运行与INSERT很相像,但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即:
尝试把新行插入到表中
当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:
从表中删除含有重复关键字值的冲突行
再次尝试把新行插入到表中
旧记录与新记录有相同的值的判断标准就是:表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。
返回值:
REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。
受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。
示例:
eg:(phone字段为唯一索引)
replace into table_name(email,phone,user_id)
values('test569','99999','123')
另外:在 SQL Server 中可以这样处理:
if not exists (select phone from t where phone= '1')
insert into t(phone, update_time) values('1', getdate())
else
update t set update_time = getdate() where phone= '1'
方案三:ON DUPLICATE KEY UPDATE
如上所写,你也可以在INSERT INTO.....后面加上 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子句。
您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT…UPDATE语句的INSERT部分引用列值。
换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的
col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候
会返回NULL。
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
本语句与以下两个语句作用相同:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
-> ON DUPLICATE KEY UPDATE c=9;
当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。
示例: 这个例子是我在实际项目中用到的:是将一个表的数据导入到另外一个表中,数据的重复性就得考虑(如下)。
唯一索引为:email
INSERT INTO table_name1(title,first_name,last_name,email,phone,user_id,role_id,status,campaign_id)
SELECT '','','',table_name2.email,table_name2.phone,
NULL,NULL,'pending',29
FROM table_name2 WHERE table_name2.status = 1
ON DUPLICATE KEY UPDATE table_name1.status = 'pending'
语句的关键地方,都已高亮出来~
再贴一个例子:
insert into class select * from class1
ON DUPLICATE KEY UPDATE class.course = class1.course
其它关键:DELAYED 做为快速插入,并不是很关心失效性,提高插入性能。
IGNORE 只关注主键对应记录是不存在,无则添加,有则忽略。
特别说明:在MYSQL中UNIQUE 索引将会对null字段失效,也就是说(a字段上建立唯一索引):
insert into test(a) values(null)
insert into test(a) values(null)
是可以重复插入的(联合唯一索引也一样)。
mysql重复写入_MYSQL避免重复插入记录的三种方法相关推荐
- mysql计算年龄_MySQL根据出生日期计算年龄的三种方法比较
方法一 SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age 方法一,当日期为未来日期时结果为0 ...
- mysql数据库包含_MySQL数据库判断字符串包含的三种方法
方法一:SELECT * FROM users WHERE emails like "%b@email.com%"; 方法二: 利用 mysql 字符串函数 find_in_set ...
- mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法
新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...
- mysql 禁止插入重复数据_防止MySQL重复插入数据的三种方法
新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...
- mysql 安全删除_mysql的binlog安全删除的一种方法
指定过期天数(expire_logs_days) ---适用于单机版mysql! 该参数为全局可动态调整参数,默认值为0,即关闭,取值范围0-99. 1.3.1 参数的查看: mysql> sh ...
- mysql数据库最后一步卡住了_[数据库]解决MySQL安装到最后一步未响应的三种方法...
[数据库]解决MySQL安装到最后一步未响应的三种方法 0 2018-07-13 01:01:27 这种情况一般是你以前安装过MySQL数据库服务项被占用了. 解决方法: 方法一:安装MySQL的时候 ...
- php mysql 表字段_php mysql获取表字段名称和字段信息的三种方法
php mysql获取表字段名称和字段信息的三种方法 先给出本实例中使用的表的信息: 使用desc获取表字段信息 php代码如下: mysql_connect("localhost" ...
- 【在PowerPoint中插入视频的三种方法】
为了能更好地帮助大家合理地在PowerPoint课件中插入和播放视频文件, 在PowerPoint中插入视频的三种方法 ,本文特向大家介绍PowerPoint中插入和处理视频的三种方法. 直接播放视频 ...
- node.js中mysql批量插入更新的三种方法
[背景]在项目中遇到一个批量插入数据的需求,由于之前写过的sql语句都是插入一个对象一条数据,于是去网上搜关键词 "sql批量插入"."mysql批量插入"等, ...
最新文章
- CountDownTimer 实现验证码倒计时
- 数据挖掘-matplotlib、numpy、pandas
- SAP IDoc Post不成功,报错 - Conventional invoice verification no longer maintained as of Release 4.6-
- 李德毅:“反用驾驶脑”测认知能力,谁说酒驾一定违规?
- matlab中tab键怎么用来缩进,MATLAB中的一些小技巧
- LocaleResolver
- jms mdb_MDB!= JMS,反之亦然
- python列表中随机选择_如何在Python中从列表中随机选择一个项目?
- Java反射————Method根据方法名称字符串调用方法
- 在vSphere Client使用模板部署虚拟机 系统硬盘空间扩展
- python语言中、外部模块先导入、再使用_python引入导入自定义模块和外部文件--转载Sumomo的博客...
- selenium+python设置爬虫代理IP的方法
- 基于人脸识别实现课堂抬头率检测
- matlab四宫格画图_Matlab绘图初级教程
- matlab求内切圆,MATLAB求图形的最大内切圆代码
- windows开机启动项(​仅限Win10,Win7)​
- 细胞穿膜肽TAT/血管肽Angiopep/靶向多肽cRGD偶联TIO2二氧化钛纳米粒(TiO2-Angiopep)
- Mac截图很大很怎么变小?
- IVX低代码平台——小程序微信红包的应用的做法
- 技嘉主板大部分型号开启WOL(Wake up-On-LAN)网络唤醒与定时开机
热门文章
- 耐克中国物流中心三期在江苏太仓落成和运营
- Java实现印刷体转手写体—妈妈再也不用担心我被罚抄作业了
- 第二语言教学的5c标准是哪5c,【英语教学论文】5C标准对大学英语教育的启示探讨(共3451字)...
- discuz mysql查询_Discuz!X/数据库 DB:: 函数操作方法
- 【渝粤题库】陕西师范大学200171 西方文论 作业
- ubuntu 卸载pytorch_科学网—Pytorch installation on Ubuntu18.04 - 高琳琳的博文
- 怎么在excel中导入ChemDraw结构图
- kafka 延迟队列
- position详解
- 共享出行的最后一片战场