Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Mysql+ trigger


 Поделиться

Рекомендованные сообщения

Доброго времени, Уважаемые!

Задача:

необходимо сделать счетчик, который будет каждый день к исходному значению, добавлять значение.

Пример: исходное = 100, каждый день к этому значению, должно прибавляться +3, т.е. в понедельник = 100, вторник = 103, среда = 106 и так далее.

Что рассматривал:

Данная задача, однозначно должна решаться через серверную обработку, первое и (думается) правильное - триггеры.

НО! триггер в MySQL, срабатывают по событию (добавление,удаление, изменение) записей в таблицы. Время срабатывания - не основной фактор, как я понял.

Внимание, вопрос )))

 

Правильно ли я все понял, сталкивался ли кто-нибудь с такой задачей и если можно, поделитесь опытом - примером...
Заранее благодарен ))

 

Ссылка на комментарий
Поделиться на других сайтах

Грубо говоря - пишете скрипт, который получает текущее значение, прибавляет к нему 3 и записывает обратно в БД. Ставите выполнение по cron раз в сутки и все) 

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

мне нужно выполнять действие, на стороне сервера.мне не нужен сервис дополнительный.

это все надстройки, которые не нужны!!!

 

Ссылка на комментарий
Поделиться на других сайтах

16 минут назад, anboza сказал:

мне нужно выполнять действие, на стороне сервера.мне не нужен сервис дополнительный.

это все надстройки, которые не нужны!!!

 

все вам правильно написали, пишите скрипт который берет данные из бд и возвращаюет туда же, и срабатывает по крону каждый день в нужное время

Ссылка на комментарий
Поделиться на других сайтах

29 минут назад, flai0616 сказал:

Грубо говоря - пишете скрипт, который получает текущее значение, прибавляет к нему 3 и записывает обратно в БД. Ставите выполнение по cron раз в сутки и все) 

UPDATE table SET table.field = table.field + 3 

не годится?

 

Ну и если правильно погуглить то видим по заросу cron mysql query

Первая же ссылка на стаковерфлоу и очень простое решение задачи

 

 personally find it easier use MySQL event scheduler than cron.

Enable it with

SET GLOBAL event_scheduler = ON;

and create an event like this:

CREATE EVENT name_of_event
ON SCHEDULE EVERY 1 DAY
STARTS '2014-01-18 00:00:00'
DO
DELETE FROM tbl_message WHERE DATEDIFF( NOW( ) ,  timestamp ) >=7;

and that's it.

 

Ссылка на комментарий
Поделиться на других сайтах


но это же жесть ((( а зачем тогда вообще сервер БД? для того, чтобы просто таблицы хранить?

 

Ссылка на комментарий
Поделиться на других сайтах

1 минуту назад, nikifalex сказал:

а если сервер случайно выключили во время когда должно сработать событие?

ну так в том и соль, что триггер должен сработать не просто "в момент", а по состоянию на момент...и так он и работает в "нормальных" СУБД

 

Ссылка на комментарий
Поделиться на других сайтах

10 часов назад, anboza сказал:

ну так в том и соль, что триггер должен сработать не просто "в момент", а по состоянию на момент

Ну можно придумать такой алгоритм. Создать триггер на select из этой таблицы. Делаем хранилище для метки, которая помогает определять добавлять +3 или нет, например еще таблицу. В триггере такой примерно алгоритм - смотреть текущее время и сравниваем ее с меткой, в метке может быть текущее время с прошлого добавления +3, делаем вывод надо ли добавлять +3 или нет, если надо, то добавляем и обновляем метку, если нет, то ничего не делаем. Но я бы так не делал. Лучше в коде php обложить select-ы из той таблицы проверкой по аналогичному алгоритму, это будет легче поддерживать. 

Ссылка на комментарий
Поделиться на других сайтах


3 часа назад, i3bepb сказал:

Создать триггер на select из этой таблицы.

расскажите - как

Ссылка на комментарий
Поделиться на других сайтах

3 часа назад, nikifalex сказал:

пока нет понимания, для чего это надо вопрошающему, все потуги как то решить проблему, тщетны.

 

я в первом посте описал задачу. она именно так и выглядит. результат этого состояния счетчика, просто  будет выводиться на фронте, в блоке типа "наш сервис посетило" столько-то людей. 

Ссылка на комментарий
Поделиться на других сайтах

4 часа назад, i3bepb сказал:

Создать триггер на select из этой таблицы.

ну как бы вариант, но уж больно он громоздкий. Ну и не факт, что обращение будет каждый день. Соответственно нужно не просто проверять дату обновления, но и вычислять разность и потом умножать накол-во пропущенных дней...

 

Я же ищу вариант решения, чтобы задача выполнялась просто на сервере. Каждый день, вне зависимости от селектов и апдейтов каких-либо данных...

Но сдается мне, что это не про mysql, судя по обсуждению...

Ссылка на комментарий
Поделиться на других сайтах

26 минут назад, anboza сказал:

Я же ищу вариант решения, чтобы задача выполнялась просто на сервере. Каждый день, вне зависимости от селектов и апдейтов каких-либо данных...

 

15 часов назад, Yoda сказал:

and create an event like this:


CREATE EVENT name_of_event
ON SCHEDULE EVERY 1 DAY
STARTS '2014-01-18 00:00:00'
DO
DELETE FROM tbl_message WHERE DATEDIFF( NOW( ) ,  timestamp ) >=7;

and that's it.

Что здесь не так?

Ссылка на комментарий
Поделиться на других сайтах

27 минут назад, anboza сказал:

Каждый день, вне зависимости от селектов и апдейтов каких-либо данных...

Такие вариант выше же предлагали

16 часов назад, flai0616 сказал:

Грубо говоря - пишете скрипт, который получает текущее значение, прибавляет к нему 3 и записывает обратно в БД. Ставите выполнение по cron раз в сутки и все)

 

15 часов назад, Yoda сказал:

Ну и если правильно погуглить то видим по заросу cron mysql query

Первая же ссылка на стаковерфлоу и очень простое решение задачи

 

 personally find it easier use MySQL event scheduler than cron.

Enable it with


SET GLOBAL event_scheduler = ON;

and create an event like this:


CREATE EVENT name_of_event
ON SCHEDULE EVERY 1 DAY
STARTS '2014-01-18 00:00:00'
DO
DELETE FROM tbl_message WHERE DATEDIFF( NOW( ) ,  timestamp ) >=7;

and that's it.

 

Ссылка на комментарий
Поделиться на других сайтах


1 час назад, chukcha сказал:

расскажите - как

Да Вы правы на select триггер не навешать, но если погуглить, то например предлагается вариант через хранимые процедуры, т.е. вместо select-а на прямую делается процедура, которая будет оберткой и уже в ней алгоритм. Возможно еще какие-то решения найдутся как это сделать.

Ссылка на комментарий
Поделиться на других сайтах


Самое простое крон
Более менее управляемо, и вычисляемо
Таски (евентсы) о них нужно знать, помнить и использовать, но это должно быть в ГДЕ- ТО  - Внимание Есть events

Ссылка на комментарий
Поделиться на других сайтах

Только что, chukcha сказал:

Что здесь не так?

здесь все так, просто пояснял суть заданного вопроса.

Ссылка на комментарий
Поделиться на других сайтах

Я с вас со всех худею дорогая редакция.
Откуда столько глупостей в голове?


1. Если падает сервер и не срабатывает sheduled task  - надо просто менять сервер.

2. Любые хранимые процедуры, триггеры и таски в базе - в конечном итоге оборачиваются некой головной болью при смене окружения, особенно если используется shared хостинг.

3. Нет принципиальной разницы это cron скрипт php, cron команда mysql или bash скрипт. Это все серверные пережитки и они все обладают одним большим недостатком - при смене окружения, паролей в базу, пользователя базы, про них можно случайно забыть.

4. Если делать совсем дубово в рамках идеи opencart - надо делать какой то шедаллер в виде событий при инициализации генераций страниц с файлом или записью базы содержащими временную метку последнго успешного события. Если вы уверены в своих силах и втом, что вы не забудете перенести кроны - крон. Если знаете как решить потенциальные проблемы с пользователем, от которого работюат триггеры и процедуры - делайте в базе. В том или ином виде задача решается однозначно и малыми костами.

 

Просто кому то удобно за 10 минут скрипт сваять, а кому то в базу пару запросов воткнуть. Единого верного решения здесь быть не может. Следуйте принципу write less do more и будет вам счастье!

Ссылка на комментарий
Поделиться на других сайтах


так и не понял, зачем писать в базу?

 

 

12 часов назад, anboza сказал:

просто  будет выводиться на фронте

 

В 24.12.2019 в 20:53, anboza сказал:

Пример: исходное = 100, каждый день к этому значению, должно прибавляться +3, т.е. в понедельник = 100, вторник = 103, среда = 106 и так далее.

echo (100+floor(($now_date - $start_date) / 86400)*3)

 

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

Только что, Otvet сказал:

так и не понял, зачем писать в базу?

в базу писать для того, чтобы обрабатывать не на клиенте. И в клиента передавать 1 конечное значение, а не передавать значение, плодить переменные и потом все это обрабатывать.

Речь об оптимальном решении, с возможностью использовать преимущество наличия БД.

 

Только что, Yoda сказал:

Просто кому то удобно за 10 минут скрипт сваять, а кому то в базу пару запросов воткнуть. Единого верного решения здесь быть не может.

Для того и обсуждаем на форуме))

 

В любом случае, я благодарен всем участникам дискуссии, за версии, мысли и предложения )))

Ссылка на комментарий
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.