Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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 Trigger - Fatal编程技术网

Mysql 在同一表上使用触发器插入新行

Mysql 在同一表上使用触发器插入新行,mysql,database-trigger,Mysql,Database Trigger,我有一个表作业。它有以下列:cycle\u id、job\u id、status 每个周期执行7个作业。因此,cycle\u id和job\u id形成复合主键 “状态”列可以具有以下值:正在等待启动,正在运行。已完成 每个作业都是cron作业。每个工作都是不同的人负责的,所以要同步每个人,我使用的是一个数据库表作业。每个作业都会收听作业表,并观察是否有一行作业id和状态为“等待开始”的作业。因此,每当作业状态更改为“已完成”时,我想要的是创建下一个作业行,其周期id与更新的作业相同,作业id为

我有一个表
作业
。它有以下列:
cycle\u id、job\u id、status

每个周期执行7个作业。因此,
cycle\u id
job\u id
形成复合主键

“状态”列可以具有以下值:
正在等待启动,正在运行。已完成

每个作业都是cron作业。每个工作都是不同的人负责的,所以要同步每个人,我使用的是一个数据库表作业。每个作业都会收听作业表,并观察是否有一行作业id和状态为“等待开始”的作业。因此,每当作业状态更改为“已完成”时,我想要的是创建下一个作业行,其
周期id
与更新的作业相同,作业id为更新的作业id+1,状态为“等待开始”。因此,我创建了一个触发器,如下所示:

DELIMITER $$

CREATE TRIGGER start_new_job
AFTER UPDATE ON job
FOR EACH ROW
BEGIN
IF NEW.status = 'COMPLETED' AND OLD.job_id <=6 THEN
   INSERT INTO job(cycle_id, job_id, status) VALUES (OLD.cycle_id, OLD.job_id+1, 'WATING_TO_START');
END IF;
END$$
DELIMITER ;
错误1442(HY000):无法更新存储函数/触发器中的表“job”,因为调用此存储函数/触发器的语句已使用它

那么有没有一种方法可以实现同步呢。我不希望每个作业都创建一个带有下一个作业id的行。我希望自动处理它。这个触发器可以用不同的方式编写,或者我应该使用其他机制。

您将无法使用。我将用一个过程替换触发器,然后通过该过程引导所有状态更新:

CREATE PROCEDURE UpdateJobStatus(jobId INT, NewStatus NVARCHAR(50))
BEGIN
  UPDATE job
     SET `Status` = NewStatus 
     WHERE job_id = jobId;

  IF NewStatus = 'COMPLETED' AND jobId <=6 THEN
    INSERT INTO job(cycle_id, job_id, status) 
       SELECT cycle_id, job_id+1, 'WATING_TO_START'
       FROM job 
       WHERE job_id = jobId;
  END IF;
END;
创建过程UpdateJobStatus(jobId INT,NewStatus NVARCHAR(50))
开始
更新作业
SET`Status`=NewStatus
其中job_id=jobId;
如果NewStatus=‘已完成’和jobId
CREATE PROCEDURE UpdateJobStatus(jobId INT, NewStatus NVARCHAR(50))
BEGIN
  UPDATE job
     SET `Status` = NewStatus 
     WHERE job_id = jobId;

  IF NewStatus = 'COMPLETED' AND jobId <=6 THEN
    INSERT INTO job(cycle_id, job_id, status) 
       SELECT cycle_id, job_id+1, 'WATING_TO_START'
       FROM job 
       WHERE job_id = jobId;
  END IF;
END;