我需要查找和删除数据库中几乎不同的重复条目,这些条目只有一个尾部斜杠不同。换句话说,一行的网址为“http://www.google.com”而另一行的网址为“http://www.google.com/”我posted this problem on here,一位非常有帮助的专家给了我this solution:
DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE TRIM(TRAILING '/' FROM li1.url) =
TRIM(TRAILING '/' FROM li2.url)
AND li1.id<li2.id
代码完全在我需要的时候完成,除了它耗尽了我所有的服务器内存并且每次都杀死了我的VPS。有没有其他选择以较少的资源密集或较慢的方式运行它来保持我的服务器?我在phpmyadmin中运行命令。 THX!
答案 0 :(得分:1)
如果用一个语句修剪尾部斜杠怎么办:
UPDATE Link_Info
SET url=LEFT(url, LENGTH(url)-1) /*everything but the last character, which can only be a slash*/
WHERE url LIKE '%/';
然后运行清理脚本,但没有斜杠处理:
DELETE li1
FROM link_info li1
JOIN link_info li2
WHERE li1.url = li2.url
AND li1.id<li2.id
这样你就可以分开处理了。我对MySql知之甚少,但在连接条件(TRIM(TRAILING '/' FROM li1.url) = TRIM(TRAILING '/' FROM li2.url)
)中使用函数可能意味着查询也无法从任何索引中受益。
哦,当你在它的时候,你可能也想要清理任何空间:
UPDATE Link_Info
SET url=LTRIM(RTRIM(url))
WHERE url LIKE '% %';
所以我要清理空格,然后删除尾部斜线,然后重新删除。