2010-07-16 46 views
2

我在Windows XP上運行MySQL 48年5月1日和以下觸發測試不起作用:MySQL INSERT BEFORE TRIGGER失敗?

-- Drop the old table 
DROP TABLE IF EXISTS `ikasan01`.`ikasanwiretap`; 

-- Create 
CREATE TABLE `ikasan01`.`ikasanwiretap` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT, 
`ModuleName` varchar(255) NOT NULL, 
`FlowName` varchar(255) NOT NULL, 
`ComponentName` varchar(255) NOT NULL, 
`EventId` varchar(255) NOT NULL, 
`PayloadId` varchar(255) NOT NULL, 
`PayloadContent` varchar(255) NOT NULL, 
`CreatedDateTime` datetime NOT NULL, 
`UpdatedDateTime` datetime NOT NULL, 
`Expiry` datetime NOT NULL, 
PRIMARY KEY (`Id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- In order to use now() as a DEFAULT value on a datetime column we 
have to do it via a BEFORE INSERT TRIGGER 
CREATE TRIGGER defaultUpdateDateTime 
BEFORE INSERT ON ikasanwiretap FOR EACH ROW 
SET NEW.UpdatedDateTime = now(); 

-- Test the trigger 
insert into IkasanWiretap (ModuleName, FlowName, ComponentName, 
EventId, PayloadId, PayloadContent, CreatedDateTime, Expiry) values 
('3', '3', '3', '3', '3', '3', now(), now()); 

在我的觸發測試我仍然得到MySQL服務器,指出UpdateDateTime沒有默認值。

我已經試過所有在我手中的東西,所以我想我會問你很多有幫助的;)任何想法?

乾杯, 馬亭

PS:X-張貼在倫敦的Java用戶組和Ikasan EIP郵件列表。

回答

0

我猜觸發是在「非空」約束被驗證後開始的。

刪除UpdatedDateTime上的「not null」。

+0

嗨帕斯卡爾,這當然確實解決它是的,雖然我有點驚訝,先約束檢查。如果其他人對此有進一步的想法,請分享! – 2010-07-16 14:05:53

+0

是的,這很奇怪。我會假設'之前'觸發發生在約束驗證之前... – pascal 2010-07-16 15:33:30

+0

我明白這是公認的答案,但是任何人都可以進一步證實這一限制嗎?我只是在尋找確定性(*現在檢查MySQL文檔*) – Dan 2012-04-17 23:43:42