最初tags_unified
にINSERT INTO ...SELECT
、UNION
. 結果は、両方のテーブルからのすべてのタグの個別のセットになります。
CREATE TABLE tags_unified (
tags_id INT PRIMARY KEY AUTO_INCREMENT,
tag_name VARCHAR(64)
);
/* Load up all the tags with new ids */
INSERT INTO tags_unified (tag_name)
SELECT tag_name FROM article_tags
UNION
SELECT tag_name FROM image_tags
次にUPDATE
、新しい ID を取得するクエリを使用しindividual_image_tags
ますinidividual_article_tags
。JOIN
UPDATE
individual_image_tags
JOIN image_tags ON individual_image_tags.tag_id = image_tags.tag_id
/* LEFT JOIN the old tags to the new tags by tag_name */
LEFT JOIN tags_unified ON image_tags.tag_name = tags_unified.tag_name
SET individual_image_tags.tag_id = tags_unified.tag_id
/* And update those which have a match in the new tags table */
WHERE tags_unified.tag_id IS NOT NULL
UPDATE
individual_article_tags
JOIN article_tags ON individual_article_tags.tag_id = article_tags.tag_id
LEFT JOIN tags_unified ON article_tags.tag_name = tags_unified.tag_name
SET individual_article_tags.tag_id = tags_unified.tag_id
WHERE tags_unified.tag_id IS NOT NULL
ステートメントを実行する前にUPDATE
、それらをステートメントとして再形成しSELECT
て結果を確認します。
SELECT
individual_image_tags.*,
tags_unified.*
FROM
individual_image_tags
JOIN image_tags ON individual_image_tags.tag_id = image_tags.tag_id
LEFT JOIN tags_unified ON image_tags.tag_name = tags_unified.tag_name
WHERE tags_unified.tag_id IS NOT NULL
SELECT
individual_article_tags.*,
tags_unified.*
FROM
individual_article_tags
JOIN article_tags ON individual_article_tags.tag_id = article_tags.tag_id
LEFT JOIN tags_unified ON article_tags.tag_name = tags_unified.tag_name
WHERE tags_unified.tag_id IS NOT NULL
編集:
LEFT JOIN
andWHERE
句は実際には必要ありません。これは、 がテーブル内の既存のすべてのタグに一致する必要があるためです。tags_unified
コメント後の更新:
一意の制約や複合キーを削除して再度追加するよりも、一時テーブルを作成してそこから元のリンク テーブルを再設定する方が簡単な場合があります。を使用しCREATE TEMPORARY TABLE AS SELECT...
ます。次に、元のテーブルからすべての行を削除INSERT INTO ... SELECT
し、一時テーブルから再入力するために使用します。
CREATE TEMPORARY TABLE temp_individual_article_tags AS
SELECT
individual_article_tags.article_id
tags_unified.tag_id
FROM
individual_article_tags
JOIN article_tags ON individual_article_tags.tag_id = article_tags.tag_id
LEFT JOIN tags_unified ON article_tags.tag_name = tags_unified.tag_name
WHERE tags_unified.tag_id IS NOT NULL