2013-01-09 51 views
0

嗨,那裏我試圖學習MySQL,但是,我定義了一個觸發器後,應該對錶中的列進行更新操作後,它不工作正常。當我更新這個列時,它應該立即刪除一行(這個列的類型是DATE,並且在開始時它被聲明爲NULL)。這是我的表更新操作後應該刪除行的觸發器無法正常工作

Create Table Projects (

    pro_ID INT NOT NULL, 
    pro_Name VARCHAR(150) NOT NULL, 
    comp_date_info DATE DEFAULT NULL, 

    PRIMARY KEY(pro_ID) 
); 

的結構,我嘗試添加一個元組與存儲過程

DELIMITER // 
CREATE PROCEDURE insert_into_Projects (IN projectID INT, IN projectName VARCHAR(50)) 
BEGIN 

INSERT INTO homework.Projects values (projectID, projectName,NULL); 

END // 
DELIMITER ; 

,這是添加新的元組到項目表調用語句

call insert_into_Projects(111,'Project Mayhem'); 

到目前爲止,你可以意識到我有一個元組像

pro_ID pro_Name   comp_date_info 

1) 111  Project Mayhem NULL 

,這是觸發執行

DELIMITER // 
CREATE TRIGGER after_Projects_update 
AFTER UPDATE ON homework.Projects 
FOR EACH ROW 
BEGIN 

delete from homework.Projects 
where comp_date_info != NULL; 

END // 
DELIMITER ; 

最後我想每當我更新這個元組的comp_date_info到合適的日期值觸發應該將其刪除。

update homework.Projects 
set comp_date_info = '1989-04-05' 
where pro_ID = 113; 

但我與說

Error Code: 1442. Can't update table 'Projects' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

我會感激,如果你能幫助一個錯誤,感謝您的答覆方式,通過面向。

回答

0

你不能刪除你已經稱爲觸發器的行(顯然)。

取而代之,將列定義爲NOT NULL,這將強制應用程序代碼處理情況,在這種情況下刪除行而不是使用列中的空值來更新它。

另一種選擇是將所有邏輯打包到一個存儲過程中,您在新值中傳遞的存儲過程可以根據輸入進行更新或刪除。

+0

但是第一種方式是合乎邏輯的嗎?因爲我想我應該給一個不是null的值,然後我必須將它更新爲NULL? – quartaela