MySql:是否根据列重复值删除表行?

MySql:是否根据列重复值删除表行?,sql,mysql,duplicate-removal,Sql,Mysql,Duplicate Removal,我有一个带有year列的表,该列不应该有重复的值。因此,我最终得到了一个只有一个2007年记录的表 那么,我如何删除那些具有重复年份值的行呢 谢谢我想您可以简单地尝试使用IGNORE添加一个唯一的索引: ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`column`); MySQL应该做出如下响应: Query OK, 4524 rows affected (1.09 sec) Records: 4524 Duplicates: 934

我有一个带有year列的表,该列不应该有重复的值。因此,我最终得到了一个只有一个2007年记录的表

那么,我如何删除那些具有重复年份值的行呢


谢谢

我想您可以简单地尝试使用IGNORE添加一个唯一的索引:

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`column`);
MySQL应该做出如下响应:

Query OK, 4524 rows affected (1.09 sec)
Records: 4524 Duplicates: 9342 Warnings: 0
当然,您将由MySQL决定删除哪些行

编辑:

这适用于任意数量的列:

ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`col1`, `col2`, `col3`);

在上查看MySQL的文档。一个常见的问题(我至少遇到过一次)是忘记了
NULL=NULL
不是真的(但是
NULL
),因此两列上的唯一索引允许使用{42,NULL}和{42,NULL}

接受的答案非常有效,但是
IGNORE
keywords iddeferrednow(),在MySQL 5.6(可能是)之后就不起作用了

虽然
altertable
选项非常简单直接,但现在唯一的选项是通过如下查询创建新表:

CREATE TABLE <table_name> AS SELECT * FROM <your_table> GROUP BY col1,col2,col3;
按col1、col2、col3从分组中选择*创建表格;
之后,您可以删除
并将
重命名到您的表中

在这里,您可以根据需要更改
Group By
子句中的列列表(从所有列更改为一列,或将几个具有重复值的列合并在一起)

这里我还想提一点:

  • 如果任何列(来自索引,如这里的3列)的值为
    null
    ,则唯一索引不会在行中进行更改。例如:
    null,1,“asdsa”
    可以存储两次
  • 同样,若在唯一索引中只有一列,那个么表中将保留多个值为
    null
    的行(对于该列)
  • create table
    的优点是,它也可以处理空值

  • 如果任何select列不依赖于“分组依据”列,则“分组依据”不起作用。请参阅sql模式下的“仅完整组”。您可以更改sql_模式,但我无法使用knex(我的ORM)来执行此操作。最后,我在代码中过滤返回的sql结果

    例如,如果2008年有3行重复,那么您决定删除哪些行?答案的重复部分清晰简洁。这不是同一个问题。谢谢您的工作非常完美,但是否可以将其应用于两列?