триггер для установки или вставки метки времени в последней строке ДО ВСТАВКИ - PullRequest
0 голосов
/ 31 октября 2019

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

// моя таблица выглядит так:

```` topic varchar
```` payload int
```` datecreated timestamp  current_timestamp
```` dateended timestamp no  (this needs to get up updated with the current time before a new row get's inserted in the table)
any ideeas ?

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

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

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

Но я думаю, что было бы проще вычислить информацию на лету при запросе таблицы. Если вы используете MySQL 8.0, вы можете использовать оконные функции:

select
    topic, 
    payload, 
    datecreated,
    lead(datecreated) over(order by datecreated) dateended
from mytable

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

select
    t.topic, 
    t.payload, 
    t.datecreated,
    (select min(datecreated) from mytable t1 where t1.datecreated > t.datecreated) dateended
from mytable t
0 голосов
/ 01 ноября 2019

Вы всегда должны избегать избыточного хранения данных. Вместо добавления дополнительного столбца вы должны просто рассчитать этот столбец:

SELECT topic, payload, datecreated as start, (SELECT datecreated FROM my_table where datecreated > start order by datecreated LIMIT 1) as end FROM my_table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...