【问题标题】:MySql: remove table rows depending on column duplicate values?MySql:根据列重复值删除表行?
【发布时间】:2011-04-21 04:29:55
【问题描述】:

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

那么我怎样才能删除那些具有重复年份值的行呢?

谢谢

【问题讨论】:

  • 如果您有 3 个重复行到 2008 年,您决定删除哪些行?
  • 重复stackoverflow.com/q/18932/80714 那里的答案简洁明了。
  • 这不是同一个问题

标签: sql mysql duplicate-removal


【解决方案1】:

我认为您可以简单地尝试使用 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} 允许两个上的唯一索引列。

【讨论】:

  • 感谢工作完美,但是否可以将其应用于两列?
【解决方案2】:

已接受的答案完美运行,但 IGNORE 关键字 id depreciated 现在(Source),在 MySQL 5.6 之后将无法使用(可能)。

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

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

之后,您可以删除 &lt;your_table&gt; 并将 &lt;table_name&gt; 重命名为您的表。

您可以在此处根据需要更改Group By 子句中的列列表(从所有列更改为一列,或少数列一起具有重复值)。

这里我还要提一点:

  1. 如果任何列(来自索引,比如这里的 3 列)具有 null 作为值,则唯一索引不会在行中进行更改。例如:null,1,"asdsa" 可以存储两次
  2. 同样的方法,如果您在唯一索引中有单列,那么具有null 值(对于该列)的多行​​将保留在表中
  3. create table 的优点是,它也适用于空值。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      相关资源
      最近更新 更多