在更新操作后应该删除行的触发器无法正常工作

时间:2013-01-09 21:15:36

标签: mysql database triggers

嗨,我正在尝试学习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.

如果您能提供帮助,我将非常感谢,并感谢您的回复。

1 个答案:

答案 0 :(得分:0)

你不能删除你所谓的触发器的行(显然)。

相反,将列定义为NOT NULL,这会强制应用程序代码处理这种情况,在这种情况下删除行而不是在列中使用null更新它。

另一个选项是将所有逻辑捆绑到您在新值中传递的存储过程中,并且存储过程可以根据输入进行更新或删除。

相关问题