当更新或插入表中发生更新列值时创建触发器
问题描述:
我是编写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,日期列,我想写触发如果任何插入操作都如果有更新操作应该插入日期字段,更新日期字段应该被更新。 感谢您的帮助。提前致谢!
答
从值列表中删除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演示
你能分享的'表结构brand_profile_mapping_log'此表 – 2014-12-09 11:53:13
为什么不使用插入语句作为'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
在你创建的表中使用'timestamp'类型代替'datetime' ENTERED_DATE DATETIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'你不需要'changed_date'列这张桌子。您无需为此编写触发器 – Gunaseelan 2014-12-09 12:15:29