我有一个带有年份列的表格,这个列不应该有重复的值。所以最终我只得到了一个只有一个2007年记录的表格。
那么我该如何删除那些具有重复年份值的行呢?
谢谢。
我有一个带有年份列的表格,这个列不应该有重复的值。所以最终我只得到了一个只有一个2007年记录的表格。
那么我该如何删除那些具有重复年份值的行呢?
谢谢。
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`column`);
MySQL应该返回类似以下的内容:
Query OK, 4524 rows affected (1.09 sec)
Records: 4524 Duplicates: 9342 Warnings: 0
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`col1`, `col2`, `col3`);
请查看MySQL文档中CREATE INDEX的内容。一个常见的陷阱(至少我曾经遇到过的一个)是忘记NULL = NULL
不是真的(但是NULL
),因此在两个列上创建唯一索引时允许{42,NULL}和{42,NULL}。
被接受的答案完美地解决了问题,但是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
子句中的列列表(从所有列到一个列或几个具有重复值的列)。
在这里我还想提一点:
null
值时更改行。例如:null,1,“asdsa”
可能会被存储两次null
值(对于该列)的多个行create table
的优点是它也可以处理空值。'GROUP BY'如果任何选择列不依赖于“group by”列,则无法工作。请参见“ONLY_FULL_GROUP_BY”sql_mode。您可以更改sql_mode,但我无法使用knex(我的ORM)进行此操作。最终我在代码中过滤返回的SQL结果。