【问题标题】:mysql procedure with if condition带有if条件的mysql过程
【发布时间】:2018-08-19 20:24:00
【问题描述】:

我在我的第一个数据库课程中,我正在尝试为 mysql 过程编写一个条件块。

这是程序:

delimiter //
CREATE PROCEDURE add_ascent(IN cid INT, IN pid INT)
BEGIN
    DECLARE count_ascents INT;
    SET count_ascents = 0;
    SELECT COUNT(`cid`) INTO count_ascents FROM ascents WHERE `cid`=cid AND `pid`=pid;
    IF count_ascents < 1 THEN
        INSERT INTO ascents (`cid`, `pid`) VALUES (cid, pid);
        UPDATE climbers SET climbers.ascents = climbers.ascents + 1 WHERE climbers.id=cid;
        UPDATE problems SET problems.ascents = problems.ascents + 1 WHERE problems.id=pid;
    END IF;
END;
//
delimiter ;

该过程的目标是仅在 (cid, pid) 对不在 ascents 数据库中时执行插入和更新。经过测试,程序似乎根本没有进入 if 块。

【问题讨论】:

    标签: mysql sql if-statement stored-procedures


    【解决方案1】:

    仅供参考,您可能需要考虑使用UPSERT,而不是“select/if/insert”。例如,mySQL 提供INSERT ON DUPLICATE KEY UPDATE

    在这里,我建议:

    1. 给你的参数一个不同于列名的名字,例如iCidiPid,然后

    2. 输入SELECT COUNT(cid) INTO count_ascents FROM ascents WHERE cid=iCid AND pid=iPid 并检查结果。

    【讨论】:

    • 拍摄。这是一个愚蠢的错误...如果我想将其更改为 UPSERT,那么我将如何有条件地更新其他两个表?如果它不是重复键,我总是更新,但如果是,那么我不更新。如果它是重复键,我会更新它们两次吗?
    • 另外,感谢您查看我的代码 :) 非常感谢。
    • 嗨 - 1) 在回答您的问题时,有人可能会争辩说您不需要任何更新。而不是存储“列上升”,只需“选择(计数)”。在这一点上,“两次更新”的问题是没有实际意义的。 2)我很好奇: 问:你的问题解决了吗?怎么样?
    • 我使用了您对不同参数名称的建议并将其保存在一个过程中。我认为在表中保留独立列以跟踪上升与选择登山者.id = ascents.cid 的计数是一个设计问题。在实践中哪个更好?如果我想添加问题时必须更新 3 个表,似乎更有可能出现问题,但如果你有一个更大的登山者数据库,那么为每个人做一个 select(count) 的成本会更高。
    猜你喜欢
    • 2017-03-04
    • 2011-02-15
    • 2021-10-24
    • 2011-11-25
    • 2012-02-02
    • 2015-01-17
    • 2011-10-08
    • 2016-01-01
    • 2016-01-23
    相关资源
    最近更新 更多