【问题标题】:SQL Error (1093) You can't specify target table for update in FROM clause with subqueriesSQL 错误 (1093) 您不能在 FROM 子句中指定要更新的目标表和子查询
【发布时间】:2021-08-15 11:05:04
【问题描述】:

有一个存储过程很好用!

DELIMITER //
CREATE PROCEDURE temp
(
IN `valcat` INT,
IN `valsubcat` INT
)

BEGIN

DECLARE tcount INT;

SELECT COUNT(*) INTO tcount
FROM subcat sz
WHERE sz.cat_id = valcat;
CASE
    WHEN tcount > 1 THEN
        DELETE sy
        FROM subcat sy
        WHERE sy.sub_id = valsubcat;
    ELSE
        DELETE sx, c
        FROM subcat sx, cat_name c
        WHERE sx.sub_id = valsubcat AND c.cat_id = valcat;
END CASE;

END //

DELIMITER ;

CALL temp(7, 14);

现在我想去掉 'valcat' 参数并用另一个表的子查询替换它。我以这种方式重写了我的存储过程:

DELIMITER //
CREATE PROCEDURE temp
(
IN `valsubcat` INT
)

BEGIN

DECLARE tcount INT;

SELECT COUNT(*) INTO tcount
FROM subcat sz
WHERE sz.cat_id = (SELECT sw.cat_id
                    FROM subcat sw
                    WHERE sw.sub_id = valsubcat);
CASE
    WHEN tcount > 1 THEN
        DELETE sy
        FROM subcat sy
        WHERE sy.sub_id = valsubcat;
    ELSE
        DELETE sx, c
        FROM subcat sx, cat_name c
        WHERE sx.sub_id = valsubcat AND c.cat_id = (SELECT sv.cat_id
                                                    FROM subcat sv
                                                    WHERE sv.sub_id = valsubcat);
END CASE;

END //

DELIMITER ;

CALL temp(14);

...但现在我得到了消息:

''SQL 错误 (1093) in statement #3: You can't specify target table 'sx' 用于更新 FORM 子句''

附:我还有一个问题:使用过程的第二种变体时性能会下降吗?

【问题讨论】:

  • 这看起来是试图从表中删除它们之间没有 FOREIGN KEY 引用的相关行。建议 - 使用 ON DELETE CASCADE 操作创建正确的 FOREIGN 键并仅从“父”表中删除行 - 将自动从“从”表中删除相关行。

标签: mysql sql stored-procedures


【解决方案1】:
DELETE sx, c
FROM subcat sx, cat_name c
WHERE sx.sub_id = valsubcat AND c.cat_id = (SELECT sv.cat_id
                                            FROM subcat sv
                                            WHERE sv.sub_id = valsubcat);

是错误的,必须用类似的东西替换

DELETE sx, c
FROM subcat sx
JOIN cat_name c ON sx.sub_id = valsubcat
JOIN subcat sv ON c.cat_id = sv.cat_id AND sv.sub_id = valsubcat;

【讨论】:

  • 谢谢,它工作得很好!您如何看待这种情况下的性能?
  • @Gurgen 事实上你有笛卡尔,所以性能不会很好。请参阅对问题的评论。
猜你喜欢
  • 1970-01-01
  • 2014-07-31
  • 2012-07-29
  • 2013-04-09
  • 2018-11-15
  • 2016-05-19
  • 2015-06-08
  • 2015-07-11
相关资源
最近更新 更多