我有一个带有年份列的表,该列不应该有重复的值。所以我最终得到了一张只有一个 2007 年记录的表格。
那么如何删除那些具有重复年份值的行呢?
谢谢
我有一个带有年份列的表,该列不应该有重复的值。所以我最终得到了一张只有一个 2007 年记录的表格。
那么如何删除那些具有重复年份值的行呢?
谢谢
我认为您可以简单地尝试使用 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 索引。
接受的答案完美无缺,但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
(从所有列到一列,或少数列一起具有重复值)。
这里我还要提一点:
null
。例如:null,1,"asdsa"
可以存储两次null
值的多行(对于该列)将保留在表中create table
是,它也适用于空值。如果任何选择列不依赖于“分组依据”列,则“分组依据”不起作用。请参阅“ONLY_FULL_GROUP_BY”sql_mode。您可以更改 sql_mode 但我无法使用 knex(我的 ORM)来做到这一点。我最终在代码中对返回的 sql 结果进行了过滤。