bugfix> mysql > 投稿

だから、私はSQL操作を実行しようとしています:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT a.post_id, '_attached_image', b.ID
FROM wp4t_postmeta a 
INNER JOIN wp4t_posts b ON a.meta_value WHERE a.meta_key="_content_field_42" 
= b.guid

基本的に、投稿ID、メタキー(attached_image)、およびmeta_valueで更新されたwp4t_postmetaテーブルが必要です。

wp4t_postmetaのmeta_key _content_field_42のmeta_valueがwp4t_postsのguidと一致する場合、wp4t_posts IDから取得するmeta_valueが必要です。

私はそれを実行しようとするたびに、最初はtmpディレクトリのサイズが不足していたので、テストするための制限を追加しました:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT a.post_id, '_attached_image', b.ID
FROM wp4t_postmeta a 
INNER JOIN wp4t_posts b ON a.meta_value WHERE a.meta_key="_content_field_42" 
= b.guid LIMIT 10;

「#1062-キー「PRIMARY」のエントリ「0」が重複しています」というエラーが表示されるようになりました

これはwp4t_postmetaからのmeta_id自動インクリメントテーブルであると理解していますが、含めなかった場合は自動インクリメントされると思いましたか?

ここで何が間違っていますか?

また、このクエリを記述するより良い方法はありますか?

更新...進行中:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT postmeta.post_id, '_attached_image', posts.ID
FROM wp4t_postmeta AS postmeta 
INNER JOIN wp4t_posts AS posts ON postmeta.meta_value = posts.guid  
WHERE postmeta.meta_key="_content_field_42"
AND posts.post_type="attachment"

編集....まだ発展中:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT postmeta.post_id, '_attached_image', posts.ID 
FROM wp4t_postmeta AS postmeta 
INNER JOIN wp4t_posts AS posts ON postmeta.meta_value = posts.guid 
AND postmeta.meta_key = '_content_field_42' 
WHERE posts.post_type="attachment"

回答 2 件
  • 私はこれに答えるために熱い秒を取るつもりです。

    私のクエリは正しかった。

    無効なID 0があったため、AutoIncrementをオンにしていませんでした。削除しました。

    編集:最終的な正しいクエリ

    -----------------------------------------------------------------
    INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
    SELECT postmeta.post_id, '_attached_image', posts.ID 
    FROM wp4t_postmeta AS postmeta 
    INNER JOIN wp4t_posts AS posts ON postmeta.meta_value = posts.guid 
    WHERE postmeta.meta_key = '_content_field_42' 
    AND posts.post_type="attachment"
    -----------------------------------------------------------------
    
    

    wp_postmetaに1MM以上のテーブルがあるVPSサーバーで作業しました-少し時間がかかりましたが、実行されました。

  • ON a.meta_value   a.meta_value の場合は常に「true」  空ではありません。それはおそらくあなたが望んだことではないでしょう。おそらくこれ:

    ON b.id = a.post_id
    
    

    これで十分でない場合は、両方の a の関連する行をいくつか見てみましょう  および b

    詳細説明: ON  句は常に「true」であり、次のような一時テーブルを作成しています。すべて  a の組み合わせ  および b 。それぞれに1万行ある場合、1億行の一時テーブルになります。 tmpディレクトリのスペースがオーバーフローする可能性があります。

    しかし、それを超えると、同じ a.post_id で1万行になる可能性があります

    しかし、それでもすべてを説明しているわけではありません。私が間違っていなければ、 post_id  は AUTO_INCREMENT です 、通常は 0 を含まない 。 0 を取得する唯一の可能性のある方法   0 を明示的に挿入することです 。

    しかし、それはあなたがしていることです。

    OK、元の 0 がどこにあるのか推測できません  から来ましたが、それは別の問題の手がかりになる可能性があります。

あなたの答え