2015-05-31 98 views
1

我有一個表JOB。它有以下列:cycle_id, job_id, status在同一張桌子上使用觸發器插入新行

每個週期有7個作業執行。所以cycle_idjob_id構成複合主鍵。

狀態列可以具有以下值:WAITING_TO_START, RUNNING. COMPLETED

每個工作都是cron工作。而每個工作都是不同人的責任,所以要同步每個人我使用的數據庫表JOB。每個作業都會監聽JOB表並觀察它是否有一行的job_id和狀態爲'WAITING_TO_START'。所以,當工作狀態更改爲COMPLETED時,我想要的是,cycle_id與更新的作業相同,job_id作爲更新作業的ID + 1,狀態爲「WAITING_TO_START」創建下一個作業行。所以,我創建了一個觸發此爲:

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 ; 

但是,當我對工作表進行更新,我得到以下錯誤:

UPDATE job SET status='COMPLETED' WHERE cycle_id=1 AND job_id=1; 

ERROR 1442(HY000):不能更新在存儲函數/觸發器中的表'作業',因爲它已經被調用該存儲函數/觸發器的語句使用。

那麼有沒有一種方法來實現同步。我不希望每項工作都會在下一份工作的編號中創建一行。我希望它自動處理。這個觸發器可以以不同的方式寫入,還是應該使用其他一些機制。

回答

1

您將無法insert into the same table from a trigger。我會用程序代替你的扳機,然後通過程序頻道的所有狀態更新:

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; 

Sql Fiddle here

雖然過程將需要一些修改你的代碼(即你需要調用的程序而不是直接更新數據),程序的好處是更明顯 - 觸發器在後臺自動執行操作可能不直觀。

相關問題