8

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

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

谢谢

4

3 回答 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} 允许用于两列上的 UNIQUE 索引。

于 2010-10-05T08:27:45.673 回答
3

接受的答案完美无缺,但IGNORE关键字 id现在已贬值来源),它在 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是,它也适用于空值。
于 2015-03-03T07:26:04.363 回答
-1

如果任何选择列不依赖于“分组依据”列,则“分组依据”不起作用。请参阅“ONLY_FULL_GROUP_BY”sql_mode。您可以更改 sql_mode 但我无法使用 knex(我的 ORM)来做到这一点。我最终在代码中对返回的 sql 结果进行了过滤。

于 2017-09-01T00:35:40.043 回答