本文講述的是 WordPress 通過SQL批量刪除指定目錄文章的方法。起因是夜火的一個采集站,因為時間久了,數據量過大,總數據量有4~5W條了,對數據庫有奇怪的操作,頻繁讀寫硬盤,拖累整個VPS的速度,影響同VPS其他站點,故忍痛刪除數據量最龐大的一個分類文章,約3W條數據。
但是問題來了,WordPress 后臺想刪除的話,只能20還是30條的刪,刪多了就超時失敗,而且數據庫臃腫,刪除20~30條也得等半天,導致刪了幾個小時也沒刪掉多少,無奈只能通過phpmyadmin進行 SQL 批量刪除。
進入phpmyadmin之后,找到wp_posts表,發(fā)現(xiàn)根本沒有分類的字段,我就納悶了半天,難道WP那么高級,連分類都不用字段標識?那前臺怎么進行分類顯示的???于是就研究了起來,四處翻表,四處查找。最終還是通過搜索查到了一點資料:WordPress直接訪問數據庫列出指定分類目錄下的所有文章,才知道,原來WP的分類都是寫在wp_term_relationships這個表里,通過文章ID和分類ID或tag的ID對應來進行分類。
知道這些,就好辦多了。通過引用文章里介紹的sql語句進行查詢刪除就行了,但是因為那篇文章寫的比較早,對應的WP版本,數據庫結構可能有所不同,需要進行修改一下,當然,我這里所說的WordPress 通過SQL批量刪除指定目錄文章的方法也是針對目前的wordpress 3.3.1版本。
引用文章提供的SQL語句:
select ID,post_title,post_date,post_name from wp_posts,wp_term_relationships,wp_term_taxonomy where ID=object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and post_type=’post’ and post_status = ‘publish’ and wp_term_relationships.term_taxonomy_id = $CID and taxonomy = ‘category’ order by ID desc
經過我修改之后的語句(這里我要刪除的特定目錄ID就是26):
select ID,post_title,post_date,post_name from wp_posts,wp_term_relationships,wp_term_taxonomy where ID=object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26
稍微精簡的語句(只查詢出要查找的ID):
select ID from wp_posts,wp_term_relationships,wp_term_taxonomy where ID=wp_term_relationships.object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26
中間為了找到刪除的方法變形的3個語句(具體的思路經過1天1夜和酒精的摧殘已經想不起來了):
select * from wp_posts where wp_posts.id in (select wp_posts.id from wp_posts,wp_term_relationships,wp_term_taxonomy where wp_posts.id=wp_term_relationships.object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26)
select * from wp_posts where wp_posts.id in (select wp_posts.id from wp_posts,wp_term_relationships,wp_term_taxonomy where wp_posts.id=wp_term_relationships.object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26)
delete * from wp_posts where wp_posts.id in (select wp_posts.id from wp_posts,wp_term_relationships,wp_term_taxonomy where wp_posts.id=wp_term_relationships.object_id and wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id and wp_term_relationships.term_taxonomy_id = 26)
中間因為delete語句老是報錯,于是搜了下關于mysql delete數據的語法:對MySQL DELETE語法的詳細解析,才知道自己寫的不對,哪里要那么多的select那么多的括號,查那么多的表,直接delete from ... using ... where ....就行了。下面是最終的,WordPress指定特定目錄刪除下面所有文章的語句:
delete
from
wp_posts
using
wp_posts,
wp_term_relationships,
wp_term_taxonomy
where
wp_posts.id=wp_term_relationships.object_id
and
wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
and
wp_term_relationships.term_taxonomy_id = 26
這就是我奮斗到凌晨1點半的結果,希望后來的諸位共勉之,不要像我一樣走那么多彎路,神啊,原諒我這個不懂MySql的人吧~
2012.03.10 update:
(1)wp_posts 進行完上面的刪除操作之后,需要對表進行一下優(yōu)化(phpmyadmin后臺界面操作),不然還是原來好幾百M。
(2)wp_term_relationships 也需要刪除對應的文章分類關系,不然記錄條數和原來的wp_posts 一樣,好幾W條。
查詢看下是不是:
SELECT * FROM `wp_term_relationships` where term_taxonomy_id=26
刪除:
delete FROM `wp_term_relationships` where term_taxonomy_id=26
同樣幾W條記錄消滅掉,最后記得優(yōu)化下表。
(3)最后把wp_term_taxonomy里的分類文章數量計數的幾W count 給歸零,這個可以直接通過phpmyadmin直接界面操作
UPDATE `wp_term_taxonomy` SET `count` = '0' WHERE `wp_term_taxonomy`.`term_taxonomy_id` =26 LIMIT 1 ;
免責聲明:如果你不懂上面的語句,或者沒有修改,直接復制執(zhí)行了,產生的任何后果,夜火我不承擔任何責任,因為這是你的失誤,執(zhí)行前一定要慎重!