我有一个包含年份列的表,此列不应具有重复值。所以我最终得到的表只有一个2007年的记录。
那么如何删除那些具有重复年份值的行?
由于
答案 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
子句中的列列表(从所有列到一列,或者一些列具有重复值的列)。
在此我还想提一点:
null
作为值,则唯一索引不会在行中进行更改。例如:null,1,"asdsa"
可以存储两次null
值(对于该列)的多个行将保留在表中create table
的加号是,它也可以使用空值。答案 2 :(得分:-1)
'GROUP BY'不起作用。请参阅'ONLY_FULL_GROUP_BY'sql_mode。您可以更改sql_mode,但我无法使用knex(我的ORM)执行此操作。我最终在代码中过滤了返回的sql结果。