2013-01-09 48 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