1

スキーマを制御できない不完全なデータベースを修正しようとしています。欠落しているエントリを見つけて挿入する必要があります。

これは私が到達した構文です:

INSERT INTO 
  downloads (product_id, filename)
VALUES 
( 
  products_id = ( SELECT id
         FROM products 
         WHERE id NOT IN
           ( SELECT product_id
             FROM downloads
           )
       ), 
  filename = 'default.zip'
)

サブクエリは単独で正常に機能しますが、上記はエラーをスローします

#1093 - You can't specify target table 'download' for update in FROM clause

このエラーに関連するStackOverflowの質問の多くを確認しました(このように)。サブクエリをネストして、「暗黙の一時テーブルを作成するため、同じテーブルとしてカウントされないようにする方法があることを確認しました。あなたは更新しています」が、私はそれを適応させることができませんでした。

私のアプローチが非効率的で問題ない場合は、構文に近い解決策を見つけたいと思っていますが、どの解決策も役に立ちます。

4

1 に答える 1

2

やる事、

  • 使用INSERT...INTO SELECTステートメント
  • LEFT JOINの代わりに使用NOT IN
  • この列にインデックスを追加することを忘れないでください:products.IDそしてdownloads.product_idより速いパフォーマンスのために

クエリ、

INSERT INTO  downloads (product_id, filename)
SELECT  a.id AS product_id, 'default.zip' AS filename
FROM    products a
        LEFT JOIN downloads b
            ON a.ID = b.product_id
WHERE   b.product_id IS NULL
于 2013-01-17T00:17:01.797 に答える