mixC++ 技術開発者の日記
C言語交流フォーラム ~ mixC++ ~ の技術管理者を務めている、御津凪(みつなぎ)の日誌。
自分のHPは既に持っているので、ここの内容は mixC++ 中心の日誌です。
こっちの作業に注力して中々自HPに手をつけれていないものの、訪れてくれると嬉しいです。
HP : http://mitsunagistudio.net/

とりあえずメモ(SQL文の)

アバター
御津凪
管理人
記事: 200
登録日時: 15年前
住所: 道内
連絡を取る:

とりあえずメモ(SQL文の)

投稿記事 by 御津凪 » 14年前

もう使うこともないだろうと思ったけど、メモとしてここに置いておきます。

前掲示板の過去ログからの記事の移行処理で、重複したトピックが出てしまった(移行コードのバグ)ので、
全部手作業でやるのも終わりが未知数、かといって今更実行し直すのもサーバーの負担的にも酷だったので、 SQL 文による解決法を行いました。

CODE:

--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 の部分は実際に入力しているものではなく、下記で得られたリストを入力しています。

CODE:

--topic_ids
SELECT topic_id FROM _temp_dup_topic_id
--post_ids
SELECT post_id FROM _temp_dup_post_id
手間をかけず、直接 SQL 文を指定して(下記のように)実行しても同様の結果が得られるのですが、

CODE:

--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 );
これだと、異常に処理(負担)がかかり、しかも扱う対象の一番多いテーブル(検索テーブル)のレコード数は350万を超えている為、
使えませんでした。
実際にローカルで試しても、1時間経っても終わらなかった為、MySQLサーバーを再起動して諦めたほど。
手作業で入力した場合はというと、数秒で終わりました。

といった感じで、昨日(書いている時点では一昨日)報告された重複記事の問題をこれで解決させました。

確認はしてないけど、実質的な数の記事・トピックを削除しているので問題ないと踏んでます。
何かあったら戻せるように削除分のレコードを保持してますし。(上記SQL文を見たら分かるよね)


そんなこんなで、移行完了後初の日記でした。
► スポイラーを表示
最後に編集したユーザー 御津凪 on 2010年11月30日(火) 09:08 [ 編集 1 回目 ]

コメントはまだありません。