【发布时间】: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