更新任何行值时的MySQL自动更新日期

时间:2018-11-18 07:24:33

标签: mysql auto-update

我有一个已填写值的现有表。最后一列的类型为date。 我的要求是,如果有任何值被更新,则该行的相应日期列应自动更新为当前日期。

例如,如果表如下: enter image description here

并且如果我更改说行号的col1(78)/ col2(nvvb)/ col3(566)的任何值。 2的日期为2018年11月18日,那么第2行的col4应该从现有的17年10月13日自动更新为今天的18Nov2018。

我检查了现有主题时找不到答案。

我能找到的最接近的代码是此代码,但不适用于上述要求:

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 :(得分:1)

首先,您需要通过突出显示代码行并按ctrl-k,为问题/答案中显示的任何代码创建代码块

您将需要一个触发器,该触发器使用CURDATE()函数将行中的日期值更改为当前日期。 BEFORE UPDATE只是意味着在MySQL进行实际的更新调用之前应用“ BEGIN ... END”中包含的当前块。您访问要使用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 ;