【问题标题】:Using the result of subquery to update a table also referred to in the subquery使用子查询的结果更新子查询中也提到的表
【发布时间】:2013-01-17 00:14:44
【问题描述】:

我正在尝试修复一个我无法控制架构的不完整数据库,我需要找到丢失的条目并插入它们。

这是我得到的语法:

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

我已经查看了许多与此错误 (like this) 相关的 StackOverflow 问题,并且我认为有一种方法可以嵌套子查询,使其“creates an implicit temporary table, so it doesn't count as the same table you're updating”但我无法适应它。

如果我的方法效率低下也没关系,我很想看到一个接近我的语法的解决方案,但任何解决方案都会有所帮助。

【问题讨论】:

    标签: mysql sql sql-insert mysql-error-1093


    【解决方案1】:

    要做的事情,

    • 使用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
    

    【讨论】:

    • 工作就像一个魅力。我对IS NULL 的含义缺乏了解,导致我使用了嵌套子查询解决方案。
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多