我知道以前曾经问过这个问题,但我不是编码员,也无法从其他类似的帖子中找出来。我花了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的新手)。
提前非常感谢。
答案 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
希望有帮助...