【问题标题】:Using EXISTS with MySQL在 MySQL 中使用 EXISTS
【发布时间】:2009-11-26 18:05:17
【问题描述】:

我有一个适用于所有其他数据库系统的简单查询,但在 MySQL 中失败:

UPDATE points p 
SET p.userid = 5224 
WHERE p.userid = 2532 
AND NOT EXISTS (
    SELECT 1
    FROM points q
    WHERE q.userid = 5224
    AND q.game = p.game
)

我收到以下错误消息:

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

有什么解决办法吗?

【问题讨论】:

    标签: mysql sql mysql-error-1093


    【解决方案1】:

    您不能在 UPDATE 子句中为主表设置别名。这应该有效:

    UPDATE points 
    SET userid = 5224 
    WHERE userid = 2532 
    AND NOT EXISTS (
        SELECT 1
        FROM points q
        WHERE q.userid = 5224
        AND q.game = points.game
    )
    

    【讨论】:

    • AND q.game = p.game 怎么样?
    【解决方案2】:

    用途:

    UPDATE POINTS
       SET userid = 5224 
     WHERE userid = 2532 
       AND game NOT IN (SELECT q.game
                          FROM POINTS q
                         WHERE q.userid = 5224)
    

    【讨论】:

    • 仅供参考:NOT IN 在 MySQL 中比 NOT EXISTS 快:explainextended.com/2009/09/18/…
    • 谢谢。 +1 来自我,但我更喜欢 Mark 的回答,因为 NOT IN 在其他一些数据库系统上速度较慢,而且差异很大(索引与无索引),所以它更便携。
    • @Milan: NOT EXISTS & NOT IN 在 SQL Server 中是等效的:explainextended.com/2009/09/15/…
    • Oracle:NOT EXISTSNOT INLEFT JOIN/IS NULL 等价:explainextended.com/2009/09/17/…
    • 我几乎不认为 SQL Server 是可移植的,但还好 :) Oracle 并不是唯一的 DBMS。有 Firebird、Postgred、SQLite、DB2、Informix 等。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2020-09-03
    • 2012-01-19
    相关资源
    最近更新 更多