PHP / MySQL将来删除DUPLICATE行和PREVENT重复项

时间:2014-12-15 17:50:21

标签: php mysql sql

我知道以前曾经问过这个问题,但我不是编码员,也无法从其他类似的帖子中找出来。我花了5个多小时试图解决这个问题,并取得了很大的成功:(所以我请求你的帮助。

1)防止重复

我有一个写入DB的PHP脚本。这是代码:

$sql = "INSERT INTO results (total, size, persq, strip, material, region) 
VALUES ('$total', '$size', '$persq', '$strip', '$material', '$region')";

我想防止基于TOTAL和SIZE列的重复行。因此,如果新条目与TOTAL和SIZE中的值匹配,请不要输入新行。

2)删除重复项

我想从DB中删除所有现有的douplicate行,也是基于TOTAL和SIZE列。

如果行在TOTAL和SIZE中都包含重复项,请删除整行。

我该怎么做?

PS - 我已经读过我可以使用SQL IGNORE命令来防止副本重复 - 例子(我已经尝试将其结构化以适应我的情况:

INSERT IGNORE INTO results ...;

会是这样的吗?如果是这样,请帮我构建它(我是PHP和MySQL的新手)。

提前非常感谢。

2 个答案:

答案 0 :(得分:2)

我认为删除重复项的最简单方法是使用CTAS(Create Table As Select)语句为数据创建临时表。使用group by,您可以删除重复项。 MySQL非常“智能”,可以从与该组匹配的行中选择其他字段的任何值。

/* De-duplicate and copy all the data to a temporary table. */
CREATE TABLE Temp AS
  SELECT * FROM results
  GROUP BY total, size;

/* Delete all data from your current table. Truncate is faster but more dangerous. */
DELETE FROM results; /* TRUNCATE results; */

/* Insert the de-duplicated data back into your table. */
INSERT INTO results
SELECT * FROM Temp;

/* Drop the temporary table. */
DROP TABLE Temp;

之后,您可以为total,size添加唯一约束,以防止出现新的重复项。

ALTER TABLE results 
  ADD UNIQUE results_uni_total_size (total, size);

答案 1 :(得分:0)

如果您有重复的行,其中每个列都有重复值,最简单的方法是创建一个新表并使用group by在每列上导入所有行。首先创建一个新表,每列设置为唯一键:

CREATE TABLE newresults total INT NOT NULL, size ...
UNIQUE KEY (total, size, presq, strip, material, region)

然后将清洁值推入新表:

INSERT INTO newresults (total, size, persq, strip, material, region) SELECT total, size, persq, strip, material, region FROM RESULTS GROUP BY total, size, persq, strip, material, region

这将为您提供干净的数据集。你要做的最后一件事是删除旧表并将newresults重命名为结果:

DROP TABLE results;
RENAME TABLE mydatabase.newresults TO mydatabase.results

希望有帮助...