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

时间:2010-10-05 08:16:18

标签: sql mysql duplicate-removal

我有一个包含年份列的表,此列不应具有重复值。所以我最终得到的表只有一个2007年的记录。

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

由于

3 个答案:

答案 0 :(得分:8)

我认为您可以尝试使用IGNORE添加UNIQUE INDEX:

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`);

检查CREATE INDEX上的MySQL文档。一个常见的问题(至少有一次我遇到过)是忘记NULL = NULL不是真的(但是NULL),因此允许{42,NULL}和{42,NULL}两列的UNIQUE索引。

答案 1 :(得分:3)

已接受的答案效果很好,但IGNORE关键字ID 已弃用现在(Source),在MySQL 5.6(可能)之后无效。

虽然alter table选项非常简单直接但是现在只有选项是通过这样的查询创建新表:

CREATE TABLE <table_name> AS SELECT * FROM <your_table> GROUP BY col1,col2,col3;

之后,您可以删除<your_table>并将<table_name>重命名为您的表格。

在这里,您可以根据需要更改Group By子句中的列列表(从所有列到一列,或者一些列具有重复值的列)。

在此我还想提一点:

  1. 如果任何列(来自索引,如此处为3列)具有null作为值,则唯一索引不会在行中进行更改。例如:null,1,"asdsa"可以存储两次
  2. 如果您在唯一索引中有单个列,那么具有null值(对于该列)的多个行将保留在表中
  3. create table的加号是,它也可以使用空值。

答案 2 :(得分:-1)

如果任何选择列不依赖于“分组依据”列,则

'GROUP BY'不起作用。请参阅'ONLY_FULL_GROUP_BY'sql_mode。您可以更改sql_mode,但我无法使用knex(我的ORM)执行此操作。我最终在代码中过滤了返回的sql结果。