2014-12-09 182 views
0

我是編寫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

回答

0

從值列表中刪除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

0

如果你想同時列由觸發器來填充您可以通過以下方式

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