За последние 24 часа нас посетили 22859 программистов и 1260 роботов. Сейчас ищут 790 программистов ...

Триггер Mysql

Тема в разделе "MySQL", создана пользователем RainBowDash, 22 апр 2020.

Метки:
  1. RainBowDash

    RainBowDash Активный пользователь

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    Появилась необходимость в создании триггера , но появились сложности в реализации. Путём некоторого гугления был собран вариант того как он по идее должен выглядеть, но phpmyadmin на него ругается. Добавляю через окошко с триггерами , а не полной командой. Тригге добавляется к первой таблице

    Код (Text):
    1. SET @пзначение := '';
    2. SELECT `значение` INTO @пзначение FROM `вторая_таблица` WHERE `идентификатор`= new.идентификатор order by `time` desc limit 1;
    3. IF (@пзначение != new.значение) THEN INSERT into `вторая_таблица` (`идентификатор`, `значение`, `time`) VALUES(new.идентификатор , new.значение , new.time);


    Цель , при обновлении строки в первой таблице , добавлять строку во вторую (типо лога) , но с условием , что значение последней записи во второй таблице для данного идентификатора не совпадает с тем что сейчас находиться в первой таблице для этого идентификатора.

    Честно говоря не совсем понимаю в чем проблема, возможно что то очевидное , но для того что бы понять надо взглянуть свежим взглядом. Да и вообще не гуру синтаксиса mysql, пробывал по разному `` ставить , так как в разных примерах бывают вариации в духе `new`.`название`, new.`название`, new.название.
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    первый вариант канонический, остальные два от лукавого и при определенных стечениях обстоятельств могут не работать.
     
  3. RainBowDash

    RainBowDash Активный пользователь

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    А по логике самого триггера есть претензии? Или тут только со скобочками колдовать надо ?
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @RainBowDash, я вообще не понимаю зачем тут триггер кроме как для понта. Более того, я его даже не вижу у вас .
    Триггер начинается со слов "CREATE TRIGGER ..."
     
  5. RainBowDash

    RainBowDash Активный пользователь

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    я же написал , что через диалоговое окно phpmyadmin его вставляю. Там нужно только тело и выбрать условия.
    2020-04-22_19h11_29.png
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Там NEW. – спец. модификатор, так что походу второй вариант канонический ;)
     
  7. RainBowDash

    RainBowDash Активный пользователь

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    ну вот... И кому верить ? В интернетах вроде даже никто не объясняет этот момент , все просто пишут по своему. В любом случае я думаю тут проблема глубже чем неправильные скобочки. Нужен гуру мускуля в тред.
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @RainBowDash, а чЁ там END IF не нужен? Типа однострочная форма, как в Бейсике что ли? :)

    И чЁ за мания все SELECT'ами проверять? Это же полная фигня в большинстве случаев. Пробуйте INSERT IGNORE, INSERT... ON DUPLICATE KEY UPDATE... (не вникал, что вам конкретно нужно, но уверен, что не SELECT/IF/INSERT).
    --- Добавлено ---
    Оф. документацией пользуйтесь или на крайняк материалами проверенных авторов, а не всякой хнОй ;)
    --- Добавлено ---
    ...вроде советов на этом и тем более др. форумах :D
     
    #8 miketomlin, 22 апр 2020
    Последнее редактирование: 22 апр 2020
  9. RainBowDash

    RainBowDash Активный пользователь

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    Не ну на "правильность" не претендую , нужно что бы работало , а там посмотрим. Что бы работал ON DUPLICATE KEY UPDATE нужен уникальный ключ, коим то значение не может являться. Насчет остального сказать не могу. Но вроде как там варианты у духе либо вставить так либо вот так, а мне нужно никак во втором случае.
    Можно конечно пыхом все это делать , но я зацепился за триггеры, просто подумал что по любому придумали какие то "упрощатели" , что бы база данных сама все делала и оно так и есть.
    Осталось только усложнить жизнь тем что бы понять как эти упрощатели работают :D
     
  10. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Вот тут не понятно. Если мы обновляем значение в первой таблице оно априори не может быть равным ранее записанному значению в другой таблице.
    Лучше уйти от абстракции, показать дампы таблиц и рассказать с примерами настоящих значений, что где обновляется и что где вставлять или не вставлять.
     
  11. RainBowDash

    RainBowDash Активный пользователь

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    Оно ведь на update строки срабатывает. Не факт , что именно это значение в ней было обновлено.