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.IDdownloads.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 回答