За последние 24 часа нас посетили 9296 программистов и 459 роботов. Сейчас ищут 88 программистов ...

триггер на изменение значения в поле mysql

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

  1. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    Приветствую всех. Помогите пожалуйста создать триггер, который будет записывать дату изменения определенного поля. Дана таблица materials с полями (id, name, status, status_date). Нужен триггер который будет записывать дату изменения поля status в поле status_date.
    INSERT INTO materials.status_date VALUES("Updated", NOW()); - вот такой триггер написал в phpmyadmin. Не сработало.
     
    #1 ara05ru, 15 авг 2020
    Последнее редактирование: 15 авг 2020
  2. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.199
    Симпатии:
    377
    а что вам мешает при смене статуса обновлять дату?
     
  3. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    CREATE DEFINER=`user`@`%` TRIGGER `updatestatus` AFTER UPDATE ON `materials` FOR EACH ROW INSERT INTO materials.status_date VALUES(111111) вот так написал и изменил тип status_date на int, чтоб проверить работает триггер или нет. Выдает ошибку
    upload_2020-8-15_10-44-29.png
    --- Добавлено ---
    Как это сделать ? Подскажите пожалуйста. Мне любой вариант подходит.
     
  4. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.199
    Симпатии:
    377
    где код смены статуса?
     
  5. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    через php это делать не хотелось. думал триггером будет легче
    --- Добавлено ---
    Код (Text):
    1. CREATE TRIGGER updatestatus BEFORE UPDATE ON materials
    2. FOR EACH ROW
    3. BEGIN
    4.   IF NEW.status <> OLD.status THEN
    5.     SET NEW.status_data = NOW();
    6.   END IF;
    7. END;
    вот такой триггер написал, ругается на 5-ю строчку
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.795
    Симпатии:
    439
    Поле типа TIMESTAMP?
     
  7. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    Код (Text):
    1. CREATE TRIGGER updatestatus BEFORE UPDATE ON materials
    2. FOR EACH ROW
    3. BEGIN
    4.   IF NEW.status <> OLD.status THEN
    5.     SET NEW.status_data = NOW();
    6.   END IF;
    7. END;
    вот такой триггер написал, ругает
    Нет. DATETIME
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.795
    Симпатии:
    439
    Говорю, если сделаете TIMESTAMP, будет само обновляться.
    --- Добавлено ---
    P.S. Также можно добавить поле типа TIMESTAMP, а status_date сделать «генерируемым» (GENERATED ALWAYS, MySQL ver. 5.7+) на основе добавленного.
    --- Добавлено ---
    status_date?
     
  9. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    upload_2020-8-16_23-52-42.png
    и поле status_date сделал TIMESTAMP. Не сработало.
     
    #9 ara05ru, 16 авг 2020
    Последнее редактирование: 17 авг 2020
  10. Drunkenmunky

    Drunkenmunky Новичок

    С нами с:
    12 авг 2020
    Сообщения:
    220
    Симпатии:
    36
    Попробуйте временно изменить делимитер запросов.
    Пример
    Код (Text):
    1. delimiter //
    2. ваш триггер
    3. //
    4. delimiter ;
     
  11. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    неизвестный оператор около END
     
  12. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    Код (Text):
    1. <select class="color<?= $item['status']; ?>" id="status" data-id="<?= $item['id'] ?>">
    2.                                                 <? foreach ($status as $k => $v) { ?>
    3.                                                     <option value="<?= $k; ?>" <?= $k == $item['status'] ? " selected" : ""; ?>><?= $v; ?></option>
    4.                                                 <? } ?>
    5.                                             </select>
     
  13. Drunkenmunky

    Drunkenmunky Новичок

    С нами с:
    12 авг 2020
    Сообщения:
    220
    Симпатии:
    36
    Код.
     
  14. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    код большой там. PHP , ajax , js
    --- Добавлено ---
    связанных файлов много. Вообщем решил сделать через PHP все таки. Триггер не буду делать. Спасибо всем кто пытался помочь.
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.795
    Симпатии:
    439
    Говорю, у вас опечатка в названии поля в коде триггера ;)
    --- Добавлено ---
    Как оказалось, можно даже не менять тип. Раз не умеете пользоваться поисковиком, вот вкуривайте: https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html
     
  16. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    связанных таблиц много
    Вы правы ! Оказывается опечатка и все из за этого. Вот я слепой. Спасибо. Все работает.
     
  17. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    Код (Text):
    1. delimiter //
    2. CREATE TRIGGER updatestatus BEFORE UPDATE ON materials
    3. FOR EACH ROW
    4. BEGIN
    5.   IF NEW.status <> OLD.status THEN
    6.     SET NEW.status_date = NOW();
    7.   END IF;
    8. END;
    9. //
    10. delimiter ;
    в итоге рабочий триггер вот
     
  18. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.795
    Симпатии:
    439
    Но все же не стоит пренебрегать более простыми штатными возможностями. А триггеры можно приберечь для чего-то более полезного. Короче какое-то кривое решение ;)
     
  19. ara05ru

    ara05ru Новичок

    С нами с:
    18 апр 2019
    Сообщения:
    68
    Симпатии:
    0
    Знаю что костыль. Возможно потом исправлю. Главное работает :)