【问题标题】:Error 1093 when trying to perform delete in MySQL尝试在 MySQL 中执行删除时出现错误 1093
【发布时间】:2018-03-23 15:36:25
【问题描述】:

请对这个查询提供一点帮助。尝试在 MySQL 中执行删除时,它返回错误:“MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表”。否则 select 语句可以正常工作。这是脚本:

DELETE
  FROM redcap_data
WHERE record IN (SELECT DISTINCT
  redcap_data.record,
  redcap_data.field_name,
  redcap_data.value
FROM redcap_metadata
  INNER JOIN redcap_data
    ON redcap_metadata.project_id = redcap_data.project_id
  INNER JOIN redcap_events_metadata
    ON redcap_data.event_id = redcap_events_metadata.event_id
  INNER JOIN redcap_events_arms
    ON redcap_events_metadata.arm_id = redcap_events_arms.arm_id
WHERE (redcap_data.project_id = '50'
AND redcap_events_arms.arm_num = '6'
AND redcap_data.record IN ('record_ids go here')
))

【问题讨论】:

    标签: mysql


    【解决方案1】:

    尝试在您作为 IN 子句而不是 IN 子句使用的子选择上使用内连接

        DELETE r.*
          FROM redcap_data r
        INNER JOIN  (
          SELECT DISTINCT
          redcap_data.record,
          redcap_data.field_name,
          redcap_data.value
        FROM redcap_metadata
          INNER JOIN redcap_data
            ON redcap_metadata.project_id = redcap_data.project_id
          INNER JOIN redcap_events_metadata
            ON redcap_data.event_id = redcap_events_metadata.event_id
          INNER JOIN redcap_events_arms
            ON redcap_events_metadata.arm_id = redcap_events_arms.arm_id
        WHERE (redcap_data.project_id = '50'
        AND redcap_events_arms.arm_num = '6'
        AND redcap_data.record IN ('record_ids go here')
        )) t ON r.record = t.record
    

    【讨论】:

    • 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 'r INNER JOIN ( SELECT DISTINCT redcap_data.record, re' 附近使用正确的语法
    • 意外符号 'r' 意外符号 't'
    • 最后一条评论是什么意思..是错误信息的一部分?
    • 是的。我重新格式化了脚本,这就是我收到的错误。
    • 无论如何.. r 已删除
    【解决方案2】:

    这是 MySQL 中记录的限制。

    一种解决方法是使用内联视图(派生表),并在 JOIN 操作中引用它。

    先写成SELECT

    SELECT t.*
      FROM target_table t
      JOIN ( SELECT q.id
               FROM target_table q 
               JOIN ... r
                 ON ...
              WHERE ... 
              GROUP BY ... 
             HAVING ...
           ) s
        ON s.id = t.id 
    

    然后我们可以将其转换为 DELETE 语句。根据我的经验,内联视图在外部查询中提供了足够的 target_table 分离,它不会引发 MySQL 错误。

    在外部查询运行时,实现派生表s 的查询已经执行。 MySQL 执行的操作与此类似(不完全是这样,但这说明了模式,我们如何考虑派生表...

    CREATE TEMPORARY TABLE _s_ ... ;
    INSERT INTO _s_ (...) SELECT ... FROM target_table q ... ;
    
    DELETE t.*
      FROM target_table t
      JOIN _s_ 
        ON ... 
    ;
    
    DROP TEMPORARY TABLE _s_ ... ;
    

    在 DELETE 语句运行时,在前面的 SELECT 中引用 target_table 并不重要。实现临时表s的工作已经完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-23
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多