登陆

极彩在线下载安装-Mysql的奇技淫巧 - 避免重复插入数据

admin 2019-09-07 266人围观 ,发现0个评论

Mysql的奇技淫巧 - 防止重复刺进数据

MySql

防止重复刺进数据

一般那我们刺进一条带有仅有性字段数据的时分,我们先去查一下数据库有没有相同数极彩在线下载安装-Mysql的奇技淫巧 - 避免重复插入数据据,需求操作2次数据库,总感觉这样做特别的low,那么我们来看下怎样操作一次数据库完成来这样的需求,当然这个仅有性数据要给他设置上叶青主键索引或许仅有索引

1、初始演示表:

(1) 测试表结构

字段类型是否null默许阐明idintno主键 自增namevarchar(200)no仅有索引urlvarchar(200)no..

(2)具有数据

mysql> select *from test;
+----+------+------+
| id | name | url |
+----+------+------+
| 1 | 1 | 1 |
+----+------+------+
1 row in set (0.00 sec)

2、运用ignore关键词

mysql> INSERT IGNORE INTO `test` ( `name`, `url`) VALUES ( 'sqc', '6666'),('1','3333');
Query OK, 1 row affected (0.03 sec)
Records: 2 Duplicates: 1 Warnings: 0
受影响的行: 1
时刻: 0.029s
[正常SQL]INSERT INTO `test` ( `name`, `url`) VALUES ( 'sqc11', '6666'),('111','3333');
受影响的行: 2
时刻: 0.042s
能够看到ignore功率仍是可观的

成果:

mysql> select *from test
+----+------+------+
| id | name | url |
+----+------+------+
| 1 | 1 | 1 |
| 4 | sqc | 6666 |
+----+------+------+
2 rows in set (0.00 sec)

能够看到当有重复记载就会疏忽,不进行刺进操作,履行后回来数字0 其他还有类型用法如:(仿制表,而且防止重复记载)

 INSERT IGNORE INTO `table_1` (`name`) SELECT `name` FROM `table_2`;

3、运用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很相像,可是假如旧记载与新记载有相同的值,则在新记载被刺进极彩在线下载安装-Mysql的奇技淫巧 - 避免重复插入数据之前,发现主键或仅有索引呈现数据重复而形成刺进失利时,旧记载先被删去,再次测验把新行刺进到表中
旧记载与新记载有相同的值的判别规范便是:
表有一个PRIMARY KEY或UNIQUE索引,不然,运用一个REPLACE句子没有意义。该句子会与INSERT相同,由于没有索引被用于确认是否新行仿制了其它的行。
回来值:
REPLACE句子会回来一个数,来指示受影响的行的数目。该数是被删去和被刺进的行数的和
受影响的行数能够容易地确认是否REPLACE只增加了极彩在线下载安装-Mysql的奇技淫巧 - 避免重复插入数据一行,或许是否REPLACE也替换了其它行:查看该数是否为1(增加)或2(替换)。替换进程影响行数会翻倍
[SQL]REPLACE INTO `test` ( `name`, `url`) VALUES ( 'sqc', '6666'),('1','3333');
受影响的行: 4
时刻: 0.025s
发生了2次替换!
[SQL]REPLACE INTO `test` ( `name`, `url`) VALUES ( 'sqc', '6666'),('2','3333');
受影响的行: 3
时刻: 0.025s
发生了1次替换!

4、ON DUPLICATE KEY UPDATE 办法

仅有键有重复的履行更新

留意:
1、应尽量防止对带有多个仅有关键字的表运用ON DUPLICATE KEY子句。
2、当您运用ON DUPLICATE KEY UPDATE时,DELAYED选项被疏忽。
3、ON DUPLICATE KEY UPDATE仅仅MySQL的特有语法,并不是SQL规范语法!
4、特别阐明:在MYSQL中UNIQUE索引将会对null字段失效

例如,将上面的test表结构更改下 删去name(仅有索引)字段 ,列id 为 主键 (或 具有UNIQUE索引),而且包括值1,则以下两个句子具有相同的作用:

INSERT INTO test (id,url) VALUES (1,3) ON DUPLICATE KEY UPDATE url=url+1;
UPDATE test SET url=url+1 WHERE id=1;
假如行作为新记载被刺进,则受影响行的值显现1;假如原有的记载被更新,则受影响行的值显现2。
[SQL]INSERT INTO test (id,url) VALUES (1,3) ON DUPLICATE KEY UPDATE url=url+1;
受影响的行: 2
时刻: 0.030s

这个语法还能够这样用:

履行前url = 1
INSERT INTO test (id,url) VALUES (1,3),(1,444) ON 极彩在线下载安装-Mysql的奇技淫巧 - 避免重复插入数据DUPLICATE KEY UPDATE url=url+1;
[SQL]INSERT INTO test (id,url) VALUES (1,3),(1,444) ON DUPLICATE KEY UPDATE url=url+1;
受影响的行: 4
时刻: 0.030s
履行后url = 3 (第二条与第一条重复, url在原值上又+1).

我们能够看到上面并没有用到我们刺进是传给url的值,如 (id,url) VALUES (1,3),(1,444),引证被刺进的col的值运用VALUES函数 如:

INSERT INTO test (id,url) VALUES (1,55) ON DUPLICATE KEY UPDATE url=VALUES(url);
履行后url的值等于55

总结

  • 这三种办法都能防止主键或许仅有索引重复导致的刺进失利问题。
  • insert ignore能疏忽重复数据,只刺进不重复的数据。
  • replace into和insert ... on duplicate key update,都是替换原有的重复数据, 差异在于replace into是删去原有的行后,在刺进新行,如有自增id,这个会形成自增id的改动; insert ... on duplicate key update在遇到重复行时,会直接更新原有的行,详细更新哪些字段怎样更新,取决于update后的句子。

附:

有人对ON DUPLICATE KEY UPDATE 办法和 运用Replace在功率上的体现进行过研讨,这儿我直接给我们总结下结论吧:

  • 在数据库数据量很少的时分, 这两种方法都很快,无论是直接的刺进仍是有抵触时的更新,都不错
  • 假如仅仅刺进操作,比方直接向表里刺进1000条数据(百万级的表(innodb引擎)),二者都差不多需求5,6乃至十几秒;可见刺进功率也是不相上下
  • 更新表的时分replace的操作要比insert on duplicate的功率低许多,由于replace会先履行删去后履行刺进,刺进的主键id是自增的(不复用旧的),insert on duplicate 更新对主键索引没有极彩在线下载安装-Mysql的奇技淫巧 - 避免重复插入数据影响.因而对索引的保护成本就低了一些(假如更新的字段不包括主键,那就要另说了)
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP