详解MySQL alter ignore 语法
今天上班的时候,业务方问了我这样一个问题:我有一个表,需要添加一个唯一的字段,但是目前这个字段存在一些重复值,有没有好的解决办法。
这个问题刚听到的时候,说白了我是不会的,因为没有遇到过这样的需求,要在一个重复字段上设置唯一性,必然有数据丢失啊,因为一个字段不可能及时唯一的,又有重复值。于是我详细询问了一下他的需求,最终得知,这个过程中重复的数据只需要保存一条就可以了,可以容忍一部分数据丢失,而重复的字段恰好是时间字段,这样的话,只需要保证每个时间点都有一条记录即可。
听到这里,我想到了下面几个方法:
1.备份表数据,使用distinct的方法过滤这个字段,然后使用连接查询获得其他的字段;
2.备份表数据,然后使用查询表记录里面有重复值的部分,并进行统计,然后随机保留其中的一条记录。
除了这两种方法,在低版本的mysql中还有一种方法,是使用alter ignore table的方法了,这个语法使用的比较少,我这里进行了一个实验进行测试:
mysql--dba_admin@127.0.0.1:yeyztest 23:30:51>>show create table test\G *************************** 1. row *************************** Table: test Create Table: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `age` int(11) DEFAULT NULL, `score` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) mysql--dba_admin@127.0.0.1:test 23:38:39>>select * from test; +----+------+-------+ | id | age | score | +----+------+-------+ | 1 | 2 | 3 | | 2 | 2 | 3 | | 3 | 3 | 4 | | 4 | 4 | 5 | +----+------+-------+ 4 rows in set (0.00 sec)
创建一个表,然后插入重复记录,然后对age字段进行添加唯一索引的操作,我们可以看看结果:
mysql--dba_admin@127.0.0.1:test 23:38:43>>alter table test add unique key uni_key(age); ERROR 1062 (23000): Duplicate entry '2' for key 'uni_key' mysql--dba_admin@127.0.0.1:test 23:39:04>>alter ignore table test add unique key uni_key(age); ERROR 1062 (23000): Duplicate entry '2' for key 'uni_key' mysql--dba_admin@127.0.0.1:test 23:39:24>>select @@old_alter_table=1; +---------------------+ | @@old_alter_table=1 | +---------------------+ | 0 | +---------------------+ 1 row in set (0.00 sec) mysql--dba_admin@127.0.0.1:test 23:40:22>>set old_alter_table=1; Query OK, 0 rows affected (0.00 sec) mysql--dba_admin@127.0.0.1:test 23:40:36>>alter ignore table test add unique key uni_key(age); Query OK, 4 rows affected (0.04 sec) Records: 4 Duplicates: 1 Warnings: 0 mysql--dba_admin@127.0.0.1:test 23:40:39>>select * from test; +----+------+-------+ | id | age | score | +----+------+-------+ | 1 | 2 | 3 | | 3 | 3 | 4 | | 4 | 4 | 5 | +----+------+-------+ 3 rows in set (0.00 sec)
可以看到,我们首先使用了传统的直接修改的方法。也就是alter table test的方法,发现有冲突的记录,然后我们该用alter ignore的方法,错误依旧保留,经过查询是少了一个参数,old_alter_table,要想成功实现去除重复记录并且添加唯一索引,需要把这个参数设置为1,最终成功实现了结果。
这里需要注意的是,我的这个测试的环境是MySQL5.5.19,在MySQL5.7环境中,这个测试时不成功的,这种语法被标记为错误语法。所以这个方法只能在MySQL5.5版本中使用。有兴趣的同学可以测一测是否可以在5.6版本上使用。
再说明一点,alter ignore table的本质是创建一张新表,然后新表的结构上age字段是唯一的,再通过insert ignore的语法进行插入,碰到重复的记录,则直接删除。所以,在使用这个语法的时候,请一定注意你的表的数据量,如果数据量比较大的情况,需要谨慎使用,因为他的执行时间可能会很长。
今天就到这里吧。
以上就是详解MySQL alter ignore 语法的详细内容,更多关于MySQL alter ignore 语法的资料请关注猪先飞其它相关文章!
相关文章
- 这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
- 新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
- 这篇文章主要介绍了Swagger中@ApiIgnore注解的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-21
深入研究mysql中的varchar和limit(容易被忽略的知识)
为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15- 这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
- 一、先说一下为什么要分表:当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。根据个人经验,mysql执行一个sql的过程如下:1...2014-05-31
- 我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
- 宿主机使用网线的时候,客户机在Bridged Adapter模式下,使用Atheros AR8131 PCI-E Gigabit Ethernet Controller上网没问题。 宿主机使用无线的时候,客户机在Bridged Adapter模式下,使用可选项里唯一一个WIFI选项,Microsoft Virtual Wifi Miniport Adapter也无法上网,故弃之。...2013-09-19
- 这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅Mysql5.5.37安装需要cmake,5.6版本开始都需要cmake来编译,5.5以后的版本应该也要装这个。安装cmake复制代码 代码如下: [root@local ~]# wget http://www.cm...2015-03-15
- 首先要声明一点,大部分情况下,修改MySQL密码是需要有mysql里的root权限的...2013-09-11
- MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:/Program Files/MySQL/MySQL Server 4.1/bin (或者直接将windows的环境变量path中添加该目录) ...2013-09-26
- 一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
- 这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
- Navicat for MySQL注册码用来激活 Navicat for MySQL 软件,只要拥有 Navicat 注册码就能激活相应的 Navicat 产品。这篇文章主要介绍了Navicat for MySQL 11注册码\激活码汇总,需要的朋友可以参考下...2020-11-23
- 这篇文章主要介绍了mysql IS NULL使用索引案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-14
- 这篇文章主要介绍了基于PostgreSQL和mysql数据类型对比兼容,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-25
- 一、准备编译环境,安装所需依赖包yum groupinstall 'Development' -y yum install openssl openssl-devel zlib zlib-devel -y yum install readline-devel pcre-devel ncurses-devel bison-devel cmake -y二、编译安...2015-10-21
Mysql中 show table status 获取表信息的方法
这篇文章主要介绍了Mysql中 show table status 获取表信息的方法的相关资料,需要的朋友可以参考下...2016-03-12- 这篇文章主要为大家分享了20分钟MySQL基础入门教程,快速掌握MySQL基础知识,真正了解MySQL,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-12-02
- 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关...2013-09-11