【问题标题】:Create trigger to update column value when update or insert happens in the table当表中发生更新或插入时创建触发器以更新列值
【发布时间】:2014-12-10 10:50:28
【问题描述】:

我是编写 mysql 触发器的新手。

这里是创建sql语句

CREATE TABLE BRAND_PROFILE_MAPPING (
    PROFILE_MAPPING_ID BIGINT(20) NOT NULL AUTO_INCREMENT,
    DOTLOOP_PROFILE_ID BIGINT(20) NULL DEFAULT NULL,
    BRAND_PROFILE_ID VARCHAR(255) NULL DEFAULT NULL,
    PROFILE_TYPE VARCHAR(90) NULL DEFAULT NULL,
    PROFILE_NAME VARCHAR(225) NULL DEFAULT NULL,
    SOURCE VARCHAR(255) NULL DEFAULT NULL,
    PROFILE_HASH VARCHAR(32) NULL DEFAULT NULL,
    ENTERED_DATE DATETIME NULL DEFAULT NULL,
    CHANGED_DATE DATETIME NULL DEFAULT NULL,
    PRIMARY KEY (PROFILE_MAPPING_ID)
);

我根据上述结构创建了表。这里我有 2 个字段 ENTERED_DATE DATETIME CHANGED_DATE DATETIME , 日期列我想写触发器如果任何插入操作两个日期字段都应该插入如果有任何更新操作,更改日期字段应该被更新。 感谢您的帮助。提前致谢!

【问题讨论】:

  • 可以分享brand_profile_mapping_log这个表的表结构吗
  • 为什么不使用插入语句作为insert into brand_profile_mapping_log (PROFILE_MAPPING_ID BIGINT,DOTLOOP_PROFILE_ID BIGINT,BRAND_PROFILE_ID,PROFILE_TYPE,PROFILE_NAME,SOURCE,PROFILE_HASH) 值(NEW.profile_mapping_id,...)`
  • 在您的创建表中使用timestamp 类型而不是datetime ENTERED_DATE DATETIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 您不需要此表的changed_date 列。您不需要为此编写触发器
  • 我们无法根据 prod 环境更改其数据类型
  • 您在创建表吗?或者上面的创建查询已经存在BRAND_PROFILE_MAPPING 表?

标签: mysql triggers


【解决方案1】:

从值列表中删除 profile_mapping_id,因为它是自动递增的。

CREATE TRIGGER `brand_profile_mapping_trigger` AFTER INSERT ON brand_profile_mapping FOR EACH ROW 
BEGIN insert into **brand_profile_mapping_log** values(NEW.dotloop_profile_id,NEW.brand_profile_id,NEW.profile_type,NEW.profile_name,NEW.source,NEW.profile_hash);
END

【讨论】:

  • @Nithi 换句话说,您不能为自动递增的列输入值。数据库将为您自动填充它。
  • @Nithi 你有机会回顾我的观察吗?
【解决方案2】:

如果您希望两列都由触发器填充,您可以通过以下方式进行操作

CREATE TRIGGER brand_profile_mapping_before_insert_trigger
BEFORE INSERT ON brand_profile_mapping -- you have to use BEFORE event
FOR EACH ROW 
SET NEW.entered_date = CURRENT_DATE, 
    NEW.changed_date = CURRENT_DATE;

CREATE TRIGGER brand_profile_mapping_before_update_trigger
BEFORE UPDATE ON brand_profile_mapping -- you have to use BEFORE event
FOR EACH ROW 
SET NEW.entered_date = OLD.entered_date, -- preserve the original value, so it can't be overridden
    NEW.changed_date = CURRENT_DATE;

这是一个SQLFiddle演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 2018-01-12
    • 2018-12-10
    • 2021-01-12
    • 2016-05-17
    • 1970-01-01
    • 2014-07-10
    • 2013-06-10
    相关资源
    最近更新 更多