Size: a a a

2020 April 14

KR

Kirill R in ru_mysql
Добрый вечер!
Подскажите, пожалуйста, по триггерам в mysql:
У меня в таблице есть колонка innerValue1, и есть колонка innerValue1LastModified. Я хочу сделать триггер, который будет обновлять innerValue1LastModified (ставить туда текущий timestamp) если при обновлении строки было изменено значение innerValue1.
При этом у меня таких пар колонок — 40 шт.
Вопрос: как можно такое сделать с наименьшей потерей производительности (ну или хоть как-то)? До этого писал только простые совсем триггеры, знаний не хватает.
источник

NI

Nickolay Ihalainen in ru_mysql
интересно, https://github.com/graalvm/mysql-mle-demos когда-нибудь зарелизят?
источник

KR

Kirill R in ru_mysql
Kirill R
Добрый вечер!
Подскажите, пожалуйста, по триггерам в mysql:
У меня в таблице есть колонка innerValue1, и есть колонка innerValue1LastModified. Я хочу сделать триггер, который будет обновлять innerValue1LastModified (ставить туда текущий timestamp) если при обновлении строки было изменено значение innerValue1.
При этом у меня таких пар колонок — 40 шт.
Вопрос: как можно такое сделать с наименьшей потерей производительности (ну или хоть как-то)? До этого писал только простые совсем триггеры, знаний не хватает.
С одним полем получилось вот такой триггер:

IF (NEW.innerValue1 != OLD.innerValue1)
  THEN
      SET NEW.innerValue1LastChanged = CURRENT_TIMESTAMP;
END IF

(это всё в FOR EACH ROW, BEFORE UPDATE).
А как подкинуть сюда правильно остальные?
источник

KR

Kirill R in ru_mysql
Kirill R
С одним полем получилось вот такой триггер:

IF (NEW.innerValue1 != OLD.innerValue1)
  THEN
      SET NEW.innerValue1LastChanged = CURRENT_TIMESTAMP;
END IF

(это всё в FOR EACH ROW, BEFORE UPDATE).
А как подкинуть сюда правильно остальные?
Разобрался:
BEGIN
IF (NEW.innerValue1 != OLD.innerValue1 ) OR (NEW.innerValue1 IS NOT NULL AND OLD.innerValue1 IS NULL) OR (NEW.innerValue1 IS NULL AND OLD.innerValue1 IS NOT NULL) THEN SET NEW.innerValue1LastChanged = CURRENT_TIMESTAMP; END IF;
IF (NEW.innerValue2 != OLD.innerValue2 ) OR (NEW.innerValue2 IS NOT NULL AND OLD.innerValue2 IS NULL) OR (NEW.innerValue2 IS NULL AND OLD.innerValue2 IS NOT NULL) THEN SET NEW.innerValue2LastChanged = CURRENT_TIMESTAMP; END IF;

END
источник

D

Dahi in ru_mysql
Всем добрый вечер! Подскажите, пожалуйста, как это можно сделать?
Что я понял: у меня есть пользователь root (по умолчанию со всеми привилегиями). Я создам еще одного user'а и дам ему через GRANT нужные мне привилегия.
Теперь вот не понимаю, как реализовать/показать вот эти примеры.
источник

А

Александр in ru_mysql
Kirill R
Разобрался:
BEGIN
IF (NEW.innerValue1 != OLD.innerValue1 ) OR (NEW.innerValue1 IS NOT NULL AND OLD.innerValue1 IS NULL) OR (NEW.innerValue1 IS NULL AND OLD.innerValue1 IS NOT NULL) THEN SET NEW.innerValue1LastChanged = CURRENT_TIMESTAMP; END IF;
IF (NEW.innerValue2 != OLD.innerValue2 ) OR (NEW.innerValue2 IS NOT NULL AND OLD.innerValue2 IS NULL) OR (NEW.innerValue2 IS NULL AND OLD.innerValue2 IS NOT NULL) THEN SET NEW.innerValue2LastChanged = CURRENT_TIMESTAMP; END IF;

END
лучше не так сделать
источник

KR

Kirill R in ru_mysql
Александр
лучше не так сделать
Подскажешь?
источник

А

Александр in ru_mysql
Kirill R
Подскажешь?
BEGIN
 IF NOT NEW.innerValue1 <=> OLD.innerValue1 THEN
   SET NEW.innerValue1LastChanged = CURRENT_TIMESTAMP;
 END IF;
 IF NOT NEW.innerValue2 <=> OLD.innerValue2 THEN
   SET NEW.innerValue2LastChanged = CURRENT_TIMESTAMP;
 END IF;
 ....
END
источник

KR

Kirill R in ru_mysql
Пробовал, но так срабатывает даже когда null меняется на null
источник

А

Александр in ru_mysql
нет
источник

А

Александр in ru_mysql
знак шатла (<=>) с нулом сравнивает
источник

А

Александр in ru_mysql
источник

А

Александр in ru_mysql
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
       -> 1, 1, 0
источник

KR

Kirill R in ru_mysql
Ааа
источник

KR

Kirill R in ru_mysql
If NOT
источник

А

Александр in ru_mysql
ага
источник

KR

Kirill R in ru_mysql
Я сделал без not, невнимательно прочитал, и у меня всё затриггерилось:) спасибо большое!
источник

А

Александр in ru_mysql
ещё есть короткая запись чтобы ловить любое изменение по нескольким полям
BEGIN
 IF NOT (NEW.col1, NEW.col2, NEW.col3)
    <=> (OLD.col1, OLD.col2, OLD.col3)
 THEN
   -- какое-то из полей col1, col2, col3 изменено
 END IF;
END
источник

KR

Kirill R in ru_mysql
Прикольно, спасибо! В моём случае, правда, надо каждое поле по отдельности, но постараюсь запомнить такую запись
источник
2020 April 15

ЕО

Евгений Овчинников in ru_mysql
Nickolay Ihalainen
не я не про это: вот есть у нас микросервисы, приходит запрос от клиента и параллельно уходит в 10 микросервисов. Каждый из микросервисов делает дело и выставляет дату в last_access_date
А если сделать innodb_locks_unsafe_for_binlog=1 Галере станет лучше?
источник