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

8

我有一个带有年份列的表格,这个列不应该有重复的值。所以最终我只得到了一个只有一个2007年记录的表格。

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

谢谢。


如果您有三行重复的数据,都是2008年的,您会决定删除哪些行? - Haim Evgi
1
这是 https://dev59.com/dXVD5IYBdhLWcg3wU56H 的副本。那里的答案清晰简明。 - Chadwick
这不是同一个问题。 - Feras Odeh
3个回答

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

请查看MySQL文档中CREATE INDEX的内容。一个常见的陷阱(至少我曾经遇到过的一个)是忘记NULL = NULL不是真的(但是NULL),因此在两个列上创建唯一索引时允许{42,NULL}和{42,NULL}。


谢谢,工作得非常完美。不过能否将其应用于两列? - Feras Odeh

3

被接受的答案完美地解决了问题,但是IGNORE关键字现在已经弃用来源),在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的优点是它也可以处理空值。

-1

'GROUP BY'如果任何选择列不依赖于“group by”列,则无法工作。请参见“ONLY_FULL_GROUP_BY”sql_mode。您可以更改sql_mode,但我无法使用knex(我的ORM)进行此操作。最终我在代码中过滤返回的SQL结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接