前掲示板の過去ログからの記事の移行処理で、重複したトピックが出てしまった(移行コードのバグ)ので、
全部手作業でやるのも終わりが未知数、かといって今更実行し直すのもサーバーの負担的にも酷だったので、 SQL 文による解決法を行いました。
--1.新しいテーブルに重複しているトピックをコピー
CREATE TABLE _temp_dup_topic_ids AS
SELECT * FROM `TOPICS_TABLE` WHERE forum_id = 3
GROUP BY topic_time, topic_last_post_time, topic_replies, topic_first_poster_name, topic_last_poster_name, topic_title
HAVING COUNT(*) >1;
--2.新しいテーブルに重複しているトピックに付随していた記事をコピー
CREATE TABLE _temp_dup_post_ids AS
SELECT * FROM `POSTS_TABLE`
WHERE forum_id = 3 AND topic_id IN ( topic_ids );
--3.検索ワードリストで該当する記事IDのレコードをコピーする
CREATE TABLE _temp_dup_post_wordmatch AS
SELECT * FROM `SEARCH_WORDMATCH`
WHERE post_id IN ( post_ids );
--4.検索ワードリストで該当する記事IDのレコードを削除する
DELETE FROM `SEARCH_WORDMATCH`
WHERE post_id IN ( post_ids );
--5.記事IDを削除
DELETE FROM `POSTS_TABLE`
WHERE post_id IN ( post_ids );
--6.トピックIDを削除
DELETE FROM `TOPICS_TABLE`
WHERE topic_id IN ( topic_ids );
--7.フォーラムのトピック数・記事数を更新(C言語何でも質問掲示板のフォーラムID = 3)
UPDATE `FORUMS_TABLE`
SET forum_posts = (SELECT COUNT(*) FROM `POSTS_TABLE` WHERE forum_id = 3),
forum_topics_real = (SELECT COUNT(*) FROM `TOPICS_TABLE` WHERE forum_id = 3)
WHERE forum_id = 3;
以上の手順を一つずつ実行していきました。
なお、 topic_ids, post_ids の部分は実際に入力しているものではなく、下記で得られたリストを入力しています。
--topic_ids
SELECT topic_id FROM _temp_dup_topic_id
--post_ids
SELECT post_id FROM _temp_dup_post_id
--2.新しいテーブルに重複しているトピックに付随していた記事をコピー
CREATE TABLE _temp_dup_post_ids AS
SELECT * FROM `POSTS_TABLE`
WHERE forum_id = 3 AND topic_id IN ( SELECT topic_id FROM _temp_dup_topic_id );
使えませんでした。
実際にローカルで試しても、1時間経っても終わらなかった為、MySQLサーバーを再起動して諦めたほど。
手作業で入力した場合はというと、数秒で終わりました。
といった感じで、昨日(書いている時点では一昨日)報告された重複記事の問題をこれで解決させました。
確認はしてないけど、実質的な数の記事・トピックを削除しているので問題ないと踏んでます。
何かあったら戻せるように削除分のレコードを保持してますし。(上記SQL文を見たら分かるよね)
そんなこんなで、移行完了後初の日記でした。
► スポイラーを表示