如何在MySQL中删除重复的行

在这几种情况下,您可能会在MySQL数据库中遇到重复的行。本指南将引导您完成如何在MySQL中删除重复的行值的过程。

先决条件

安装了MySQL的系统 MySQL root用户帐户 访问终端窗口/命令行(Ctrl-Alt-T,“搜索”>“终端”) 设置测试数据库

如果您已经可以使用MySQL数据库,请跳至下一部分。

否则,请打开终端窗口并输入以下内容:

mysql –u root –p

出现提示时,输入MySQL安装的根密码。如果您具有特定的用户帐户,请使用这些凭据而不是root用户。

系统提示应更改为:

mysql>

注意:如果您无法连接到MySQL服务器,则可能会收到一条消息,提示访问已被拒绝。如果需要帮助,请参考我们的文章,该文章关于如何解决此MySQL错误。

创建测试数据库

您可以在现有数据库中创建一个新表。为此,通过列出所有现有实例并找到合适的数据库:

SHOW DATABASES;

或者,您可以通过输入以下命令来创建新数据库:

CREATE DATABASE IF NOT EXISTS testdata;

要开始testdata使用新数据库,请使用:

USE testdata; 添加表和数据

进入数据库后,使用以下命令添加包含以下数据的表:

CREATE TABLE dates ( id INT PRIMARY KEY AUTO_INCREMENT, day VARCHAR(2) NOT NULL, month VARCHAR(10) NOT NULL, year VARCHAR(4) NOT NULL ); INSERT INTO dates (day,month,year) VALUES (’29’,’January’,’2011’), (’30’,’January’,’2011’), (’30’,’January’,’2011’), (’14’,’February,’2017’), (’14’,’February,’2018’), (‘23’,’March’,’2018’), (‘23’,’March’,’2018’), (‘23’,’March’,’2019’), (‘29’,’October’,’2019’), (‘29’,’November’,’2019’), (‘12’,’November’,’2017’), (‘17’,’August’,’2018’), (‘05’,’June’,’2016’); 显示日期表的内容

要查看按日期排序的所有输入日期的显示,请键入:

SELECT * FROM dates ORDER BY year;

输出应以适当的顺序显示日期列表。

显示重复的行

要查找测试数据库中是否存在重复的行,请使用以下命令:

SELECT day, COUNT(day), month, COUNT(month), year, COUNT(year) FROM dates GROUP BY day, month, year HAVING COUNT(day) > 1 AND COUNT(month) > 1 AND COUNT(year) > 1;

系统将显示所有重复的值。在这种情况下,您应该看到:

此格式可以选择多个列。如果您有一列具有唯一标识符的列,例如联系人列表中的电子邮件地址或单个日期列,则只需从该列中进行选择。

注意:了解在MySQL中查找重复行的其他方法。

删除重复的行

在使用下面提到的任何方法之前,请记住您需要在现有数据库中工作。我们将使用示例数据库:

USE testdata; 选项1:使用INNER JOIN删除重复的行

要在我们的测试MySQL表中删除重复的行,请输入以下内容:

delete t1 FROM dates t1 INNER JOIN dates t2 WHERE t1.id < t2.id AND t1.day = t2.day AND t1.month = t2.month AND t1.year = t2.year;

您也可以使用“ 显示重复 行”中的命令来验证删除。

注意:如果您具有唯一的列标识符,则可以将其替换为  月,日和年  列标识符,而无需使用  AND运算符。旨在帮助您删除具有多个相同列的行。

选项2:使用中间表删除重复的行

您可以创建一个中间表并将其用于删除重复的行。通过仅将唯一的行传输到新创建的表并删除原始表(剩下的重复行)来完成此操作。

为此,请按照以下说明进行操作。

1.创建一个与源表具有相同结构的中间表,并传输在源表中找到的唯一行:

CREATE TABLE [copy_of_source] SELECT DISTINCT [columns] FROM [source_table];

例如,要创建样本表结构的副本,dates 命令为:

CREATE TABLE copy_of_dates SELECT DISTINCT id, day, month, year FROM dates;

2.完成后,您可以删除源表并重命名新表:

DROP TABLE [source_table]; ALTER TABLE [copy_of_source] RENAME TO [source_table];

例如:

DROP TABLE dates; ALTER TABLE copy_of_dates RENAME TO dates; 选项3:使用ROW_NUMBER()删除重复的行

重要说明:此方法仅适用于MySQL 8.02及更高版本。尝试此方法之前,请检查MySQL版本。

删除重复行的另一种方法是使用ROW_NUMBER()函数。

SELECT *. ROW_NUMBER () Over (PARTITION BY [column] ORDER BY [column]) as [row_number_name];

因此,示例表的命令为:

SELECT *. ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number;

结果包括一个row_number 列。数据按ID 划分,并且在每个分区中都有唯一的行号。唯一值被标以行号1,而重复是2,3,依此类推。

因此,要删除重复的行,您需要删除除标有1的行以外的所有内容。这是通过运行以作为过滤器的DELETE查询来完成的row_number。

要删除重复的行,请运行:

DELETE FROM [table_name] WHERE row_number > 1;

在我们的示例日期表中,命令为:

DELETE FROM dates WHERE row_number > 1;

输出将告诉您有多少行受到影响,即删除了多少重复的行。

您可以通过运行以下命令来验证没有重复的行:

SELECT * FROM [table_name];

例如:

SELECT * FROM dates;

总结

现在,您应该能够在MySQL中删除重复的行并提高数据库性能。请记住,MySQL严格模式的新实现限制了所需功能的功能。

       

版权申明:本站文章均来自网络,如有侵权,请联系01056159998 邮箱:itboby@foxmail.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

猜你还会喜欢下面的内容

    无相关信息

中国领先的互联网域名及云服务提供商

为您提供域名,比特币,P2P,大数据,云计算,虚拟主机,域名交易最新资讯报道

域名注册云服务器