MySQL Auto Update Дата, когда любое значение строки обновляется - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть существующая таблица с уже заполненными значениями. Последний столбец имеет тип date.Я требую, чтобы при обновлении какого-либо значения соответствующий столбец даты в этой строке автоматически обновлялся до текущей даты.

Например, если таблица имеет следующий вид: enter image description here

и если я изменю любое из значений col1 (78) / col2 (nvvb) / col3 (566), скажем, строки №.2 на дату 18Nov2018, тогда столбец 4 строки 2 должен автоматически обновиться до сегодняшней даты 18Nov2018 от 13 октября 17 *.

Я проверил существующие темы, не найдя ответа.

Наиболее близким я могу найти этот код, но он не работает для вышеуказанного требования:

create table if not exists my_table (
    index1 char(32) not null primary key,
    title varchar(50),
    my_timestamp timestamp not null default current_timestamp on update current_timestamp
)

Любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 18 ноября 2018

Сначала вам нужно создать блоки кода для любого кода, который вы отображаете в своем вопросе / ответе, выделив строки кода и нажав ctrl-k

. Вам потребуется триггер, который изменяет значение даты встрока текущей даты с использованием функции CURDATE ().ПЕРЕД ОБНОВЛЕНИЕМ просто означает применение текущего блока, заключенного в «BEGIN ... END», прежде чем MySQL сделает фактический вызов обновления.Вы получаете доступ к строке, которая будет обновлена ​​с помощью NEW. <field>.Чтобы сохранить значение в определенном кортеже, используйте оператор SELECT ... INTO ....

DELIMITER $$
CREATE TRIGGER trigger_name
BEFORE UPDATE ON table_name
FOR EACH ROW
BEGIN
     SELECT CURDATE() INTO NEW.`col4(date)`;
END $$
DELIMITER ;

Для получения дополнительной информации см .: https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-select-into-table.html

ОБНОВЛЕНИЕ: ВЫ НЕ МОЖЕТЕ ОБНОВИТЬ В СООТВЕТСТВИИ С ТРИГГЕРОМ ОБНОВЛЕНИЯ, MySQL не предотвращает сам вызов триггера обновления и не предотвращает проблемы взаимоблокировки, поэтому вы не можете использовать это.Необходимо использовать метод ниже.

Используя метод, описанный в комментариях (если ваша версия это поддерживает):

CREATE TABLE last_mod (
last_modified_date DATE NOT NULL,
PRIMARY KEY (last_modified_date)
)

CREATE TABLE IF NOT EXISTS my_table (
my_date DATETIME NOT NULL,
INDEX par (my_date),
FOREIGN KEY (my_date) REFERENCES last_mod(mast_modified_date) ON UPDATE CASCADE
     );

DELIMITER $$
CREATE TRIGGER trigger_name
BEFORE UPDATE ON my_table
FOR EACH ROW
BEGIN
     UPDATE last_mod SET last_modified_date = CURDATE();
END $$
DELIMITER ;
...