我有一个'命令'这样的表结构包含100,000条记录:
date orderid type productsales other
01-Aug-2014 11 order 118 10.12
01-Aug-2014 11 order 118 10.12
18-Aug-2014 11 order 35 4.21
22-Aug-2014 11 Refund -35 -4.21
09-Sep-2014 12 order 56 7.29
15-Sep-2014 12 refund -56 -7.29
23-Oct-2014 13 order 25 2.32
26-Oct-2014 13 refund -25 -2.32
现在,我想要实现的是从我的表中删除那些重复行,其中orderid,type,productsales和其他列值彼此相同并且只保留一行(查看orderid的前两个记录11)。
但如果' orderids'对于相同'类型的两个记录是相同的'订单,但' productsales'和其他'列值不同,然后不删除这些行。我希望我澄清了我的观点。
我正在寻找一个mysql删除查询来执行此任务。
答案 0 :(得分:1)
您应该添加一个id列。如果你不想使用临时表,你可能会做这样的事情(我没有测试过,所以......):
ALTER TABLE 'orders'
ADD COLUMN 'id' INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY Id(id)
DELETE
FROM orders INNER JOIN
(
SELECT TOP 1 id
FROM orders
WHERE COUNT(DISTINCT date,orderid,type.productsales,other) > 1
) dupes
ON orders.id = dupes.id
答案 1 :(得分:1)
可能是它的重复问题:MySql: remove table rows depending on column duplicate values?
你可以在那里寻找答案。
此处的解决方案指出,使用unique index
关键字在可能的重复列上添加IGNORE
将删除所有重复行。
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`col1`, `col2`, `col3`);
在此我还想提一些观点:
null
作为值,则唯一索引不会在行中进行更改。例如:null,1,"asdsa"
可以存储两次null
值(对于该列)的多个行将保留在表中IGNORE
关键字ID 已弃用现在,它在MySQL 5.6之后无法运行(可能)。现在唯一的选择是通过如下查询创建新表: CREATE TABLE <table_name> AS SELECT * FROM <your_table> GROUP BY col1,col2,col3;
之后,您可以删除<your_table>
并将<table_name>
重命名为您的表格。
在这里,您可以根据需要更改Group By
子句中的列列表(从所有列到一列,或者一些列具有重复值的列)。
加分是,它也可以使用空值。
答案 2 :(得分:0)
一种非常简单的方法是在3列上添加UNIQUE索引。编写ALTER语句时,请包含IGNORE关键字。像这样:
ALTER IGNORE TABLE orders ADD UNIQUE INDEX idx_name (orderid, type, productsales, other);
这将删除所有重复的行。作为一个额外的好处,未来的重复INSERT将会出错。与往常一样,您可能希望在运行此类内容之前进行备份...
我希望这可以帮到你。
答案 3 :(得分:0)
试试这个。 创建temp表,例如temp和存储的唯一数据,
SELECT distinct * into temp FROM Orders
然后将订单表的记录删除为
DELETE FROM orders
删除所有记录后,将记录temp插入记录。
INSER into RECORDS SELECT * FROM TEMP DROP TABLE TEMP
答案 4 :(得分:0)
如果你有完全重复的行,并且你想在SQL中执行此操作,那么最好的方法可能是将所需的行保存在临时表中,截断表,然后将数据插回:
create temporary table temp_orders as
select distinct *
from orders;
truncate table orders;
alter table orders add orderid int not null primary key auto_increment;
insert into orders;
select *
from temp_orders;
哦,看,我还添加了一个自动递增的主键,以便您将来不会遇到此问题。如果每行都有一个唯一的键,这将是一个更简单的过程。