Я в первом классе баз данных, и я пытаюсь написать условный блок для процедуры 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.

2
David Ackerman 11 Мар 2018 в 23:22

1 ответ

Лучший ответ

К вашему сведению, вы можете рассмотреть возможность использования UPSERT вместо "select / if /вставлять". Например, mySQL предлагает ВСТАВИТЬ ПРИ ДВОЙНОМ ОБНОВЛЕНИИ КЛЮЧА.

Здесь я предлагаю:

  1. присваивая параметрам другое имя, чем имя столбца, например iCid и iPid, тогда

  2. Набрав SELECT COUNT(cid) INTO count_ascents FROM ascents WHERE cid=iCid AND pid=iPid и проверяю результат.

1
paulsm4 11 Мар 2018 в 23:34