Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 应该在更新操作后删除行的触发器工作不正常_Mysql_Database_Triggers - Fatal编程技术网

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

Mysql 应该在更新操作后删除行的触发器工作不正常,mysql,database,triggers,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, PRIM

大家好,我正在尝试学习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 ;
这是用于向Projects表中添加新元组的调用语句

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_信息更新为正确的日期值时,触发器都应该删除它

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.

如果您能提供帮助,我将不胜感激。顺便说一句,感谢您的回复。

您不能删除您调用触发器的行(显然)

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


另一种选择是将所有逻辑捆绑到一个存储过程中,然后传入新值,存储过程可以根据输入进行更新或删除。

但是第一种方法是否符合逻辑?因为我想我应该给出一个非null的值,然后我必须将它更新为null?