我有一个已填写值的现有表。最后一列的类型为date。 我的要求是,如果有任何值被更新,则该行的相应日期列应自动更新为当前日期。
并且如果我更改说行号的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
)
任何帮助将不胜感激。
谢谢
答案 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 ;