Триггер не позволяет мне обновлять - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть следующий триггер:

  delimiter |
CREATE TRIGGER DES1actualizarConsultaR_update
AFTER UPDATE ON ranking
FOR EACH ROW
BEGIN
UPDATE player P,
    (SELECT 
        J.player_id AS jugador_id,
            SUM(ranking_points) AS PuntosTotales
    FROM
        player J
    INNER JOIN ranking R ON R.player_id = NEW.player_id
    GROUP BY J.player_id) AS TD 
SET 
    P.totalPuntos = TD.PuntosTotales
WHERE
    P.player_id = TD.jugador_id;

UPDATE player P,
    (SELECT 
        J.player_id AS JnumUno, COUNT(*) AS NumVeces1
    FROM
        player J
    INNER JOIN ranking R ON R.player_id = NEW.player_id
    WHERE
        R.ranking = '1'
    GROUP BY J.player_id) AS TD 
SET 
    P.vecesNum1 = TD.NumVeces1
WHERE
    P.player_id = TD.JnumUno;

END |

Я пытаюсь выполнить это обновление:

UPDATE ranking 
SET 
    ranking_points = (ranking_points + 10)
WHERE
    player_id IN (SELECT 
            P.player_id
        FROM
            player P,
            tourney T,
            tmatch M
        WHERE
            T.tourney_name LIKE 'Madrid%'
                AND T.tourney_date BETWEEN '2017-01-01' AND '2018-12-31'
                AND (M.round = 'F' OR M.round = 'SF')
                AND P.player_id = M.winner_id
                AND M.tourney_id = T.tourney_id);

Но у меня есть эта ошибка:

Код ошибки: 1442. Невозможно обновить таблицу 'player' в сохраненной функция / триггер, потому что он уже используется оператором, который вызвал эта сохраненная функция / триггер.

Как мне сделать запрос на обновление?

Я использую MYSQL.

1 Ответ

0 голосов
/ 30 апреля 2018

Это происходит потому, что у вас есть присоединение к таблице ranking в операторе UPDATE TRIGGER.

Даже если вы не обновляете саму таблицу ranking, MySQL это не понравится.

Чтобы обойти это, нужно сначала выполнить отдельный запрос SELECT, чтобы вычислить очки игрока, сохранить эти точки в переменной, а затем использовать их в ОБНОВЛЕНИИ таблицы player, не ссылаясь на * 1008. * стол

Вот идея:

 delimiter |
CREATE TRIGGER DES1actualizarConsultaR_update
AFTER UPDATE ON ranking
FOR EACH ROW
BEGIN

    DECLARE vPuntosTotales INT;
    DECLARE vNumVeces1 INT;

    SELECT SUM(ranking_points) AS PuntosTotales INTO vPuntosTotales 
    FROM ranking  
    WHERE player_id = NEW.player_id;


    UPDATE player SET totalPuntos = vPuntosTotales WHERE player_id = NEW.player_id;


    -- NOT SURE IF THIS ONE IS CORRECT
    SELECT COUNT(*) AS NumVeces1 INTO vNumVeces1 
    FROM ranking R 
    WHERE R.ranking = '1' AND R.player_id = NEW.player_id;  


    UPDATE player SET vecesNum1 = vNumVeces1 WHERE player_id = NEW.player_id;

END |

вам следует просмотреть мои запросы, потому что я не знаю точно вашу структуру таблиц, и я могу ошибаться в своих SELECT, особенно во втором

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...