详解MySQL alter ignore 语法

 更新时间:2020年11月10日 17:11:56   作者:AsiaYe  
这篇文章主要介绍了MySQL alter ignore 语法的相关资料,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下

    今天上班的时候,业务方问了我这样一个问题:我有一个表,需要添加一个唯一的字段,但是目前这个字段存在一些重复值,有没有好的解决办法。

    这个问题刚听到的时候,说白了我是不会的,因为没有遇到过这样的需求,要在一个重复字段上设置唯一性,必然有数据丢失啊,因为一个字段不可能及时唯一的,又有重复值。于是我详细询问了一下他的需求,最终得知,这个过程中重复的数据只需要保存一条就可以了,可以容忍一部分数据丢失,而重复的字段恰好是时间字段,这样的话,只需要保证每个时间点都有一条记录即可。

    听到这里,我想到了下面几个方法:

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 语法的资料请关注脚本之家其它相关文章!

相关文章

  • IDEA连接mysql又报错!Server returns invalid timezone. Go to tab and set serverTimezone  prope的问题

    IDEA连接mysql又报错!Server returns invalid timezone. Go to tab an

    这篇文章主要介绍了IDEA连接mysql又报错!Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' prope问题,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2020-05-05
  • MySQL数据库多表联合查询代码示例

    MySQL数据库多表联合查询代码示例

    所谓联合就是把多个表的记录往一起合并,一起进行查询,也叫多表查询,这篇文章主要给大家介绍了关于MySQL数据库多表联合查询的相关资料,需要的朋友可以参考下
    2024-01-01
  • SQL函数实现Group_concat用法

    SQL函数实现Group_concat用法

    GROUP_CONCAT用于将每个分组内的值连接成一个字符串,并通过指定的分隔符进行分隔,本文主要介绍了SQL函数实现Group_concat用法,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • MYSQL 根据唯一索引键更新死锁问题解析

    MYSQL 根据唯一索引键更新死锁问题解析

    这篇文章主要介绍了MYSQL 根据唯一索引键更新死锁问题解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-10-10
  • SQL实现LeetCode(197.上升温度)

    SQL实现LeetCode(197.上升温度)

    这篇文章主要介绍了SQL实现LeetCode(197.上升温度),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • MySQL 数据库优化的具体方法说明

    MySQL 数据库优化的具体方法说明

    以下的文章主要讲述的是实现MySQL数据库简单实用优化的具体方法,以及在实际操作中有哪些具体操作步骤是值得我们大家注意的。
    2010-05-05
  • MYSQL导入导出sql文件简析

    MYSQL导入导出sql文件简析

    这篇文章主要介绍了MYSQL导入导出.sql文件的相关资料,内容包括MYSQL的命令行模式的设置、命令行进入MYSQL的方法、数据库导出数据库文件、从外部文件导入数据到数据库,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 解决mysql 组合AND和OR带来的问题

    解决mysql 组合AND和OR带来的问题

    这篇文章主要介绍了解决mysql 组合AND和OR带来的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 利用MySQL空间函数实现位置打卡的完整步骤

    利用MySQL空间函数实现位置打卡的完整步骤

    这篇文章主要给大家介绍了关于如何利用MySQL空间函数实现位置打卡的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • MySQL数据库线上修改表结构的方法

    MySQL数据库线上修改表结构的方法

    MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式使用,这篇文章主要介绍了MySQL数据库线上修改表结构的方法,需要的朋友可以参考下
    2022-09-09

最新评论