2013-04-03 40 views
1

我想創建一個觸發器,將輸入的日期更改爲unix時間戳。 當我插入一個值,以表中的插入值是NULLMySQL觸發器 - 插入前更新數據

CREATE TRIGGER `updateDate` BEFORE INSERT ON `tl_calendar_events` 
FOR EACH 
ROW SET NEW.startDate = UNIX_TIMESTAMP(STR_TO_DATE(NEW.startDate, '%d.%m.%Y')) 

關於「的startDate」的輸入值是像2013年11月1日

表定義:

CREATE TABLE IF NOT EXISTS `tl_calendar_events` (
... 
`startDate` int(10) unsigned DEFAULT NULL, 
... 
PRIMARY KEY (`id`), 
KEY `pid` (`pid`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=66 ; 
+0

請發表您的表創建查詢 –

回答

0

startDate列的數據類型更改爲varchar,那麼您的上述查詢將起作用。使用

`startDate` VARCHAR(10) NULL DEFAULT NULL in your table creation query 

OR

您可以將數據類型更改爲DATEDATETIME做轉換爲UNIX時間你在這種情況下,程序就沒有必要爲觸發

+1

@benfolds - 如果最終將日期存儲爲'VARCHAR',那麼您應該不得不處理諸如「2013-02-31」或「不知道」的數據。 –

+0

同意,最好按原樣存儲日期(UNIX時間戳記爲DATE,DATETIME或INT)。 – Devart

1

不能插入字符串轉換爲INT列。它看起來像嚴格服務器模式關閉,並插入默認值(... startTime int(10) unsigned DEFAULT NULL ...)。

唯一的方法是在插入時更改這些值,例如, -

INSERT INTO tl_calendar_events(startDate) 
    VALUES (UNIX_TIMESTAMP(STR_TO_DATE('01.11.2013', '%d.%m.%Y'))); 
+0

如果我的理解正確,首先不允許將'NEW.startDate'作爲一個字符串,因爲該列是數字的,即使在'BEFORE INSERT'觸發器中也是如此。在觸發器運行之前,MySQL會將'NEW.startDate'創建爲'INT'變量,因此在嚴格模式下會出現* Data截斷*錯誤。 –

+0

是的,這是正確的。 – Devart