当更新或插入表中发生更新列值时创建触发器

问题描述:

我是编写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) 
); 

我创建基于上述structure.here表我有2场ENTERED_DATE DATETIME CHANGED_DATE DATETIME,日期列,我想写触发如果任何插入操作都如果有更新操作应该插入日期字段,更新日期字段应该被更新。 感谢您的帮助。提前致谢!

+0

你能分享的'表结构brand_profile_mapping_log'此表 – 2014-12-09 11:53:13

+0

为什么不使用插入语句作为'insert into brand_profile_mapping_log(PROFILE_MAPPING_ID BIGINT,DOTLOOP_PROFILE_ID BIGINT,BRAND_PROFILE_ID,PROFILE_TYPE,PROFILE_NAME,SOURCE ,PROFILE_HASH)'values(NEW.profile_mapping_id,...)' – 2014-12-09 11:53:32

+0

在你创建的表中使用'timestamp'类型代替'datetime' ENTERED_DATE DATETIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'你不需要'changed_date'列这张桌子。您无需为此编写触发器 – Gunaseelan 2014-12-09 12:15:29

从值列表中删除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 
+0

@Nithi换句话说,您无法输入自动递增列的值。数据库将自动为您填充。 – 2014-12-09 13:09:23

+0

@Nithi你有机会回顾我的观察吗? – 2014-12-11 04:50:33

如果你想同时列由触发器来填充您可以通过以下方式

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演示