2012-07-14 57 views
3

我有一個表SCHEDULES_CLASS,其中的2個字段是CLASS_ID(CLASS表的外鍵),STATUSNUMBER_OF_ENROLLED_STUDENTS。我有其他表CLASS有1個字段MAX_SEATS。更新mysql中觸發器中的同一行

當預定班級中的NUMBER_OF_ENROLLED_STUDENTS等於可用於各個CLASS的MAX_SEATS時,我需要將該SCHEDULES_CLASS的狀態從初始狀態變爲「FULL」,即「OPEN」。

我創建了一個觸發這一目的如下:

USE mydb; 
DELIMITER ## 
dROP TRIGGER IF EXISTS updateClassStatusTrigger ## 
CREATE TRIGGER updateClassStatusTrigger 
BEFORE UPDATE ON SCHEDULED_CLASS 
    FOR EACH ROW 
    BEGIN 
     UPDATE SCHEDULED_CLASS SET STATUS="FULL" WHERE CLASS_ID=NEW.CLASS_ID 
     AND EXISTS (SELECT 1 FROM SCHEDULED_CLASS sc, CLASS cl WHERE cl.CLASS_ID=NEW.CLASS_ID AND NEW.NUMBER_OF_ENROLLED_STUDENTS=cl.MAX_SEATS); 
END## 

我使用phpMyAdmin,我得到以下錯誤,當任何更新發生在SCHEDULED_CLASS表:

#1442 - Can't update table 'SCHEDULED_CLASS' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

任何想法,如何完成這項任務?即,只要登記的學生人數達到最大可用座位,就將預定班級的狀態更新爲「滿」。

感謝

+0

爲什麼你不在業務層而不是使用觸發器做到這一點? – CodeZombie 2012-07-14 12:39:11

+0

我正在做這個在php + mysql中,調用mysql的查詢。我認爲這是一次固定條件下的更新,觸發器將是一個很好的選擇。謝謝。 – mtk 2012-07-14 13:19:55

回答

6

更新同一行的方式就是SET NEW.column_name = some_Value。爲了簡化您的觸發器,請考慮:

CREATE TRIGGER updateClassStatusTrigger 
BEFORE UPDATE ON SCHEDULED_CLASS 
FOR EACH ROW 
    SET NEW.STATUS='FULL' 

此外,您還需要在給定某些條件的情況下更新值。由於我們不再使用標準UPDATE,因此無法在同一查詢中完成此操作。所以,拆分:

USE mydb; 
DELIMITER ## 
dROP TRIGGER IF EXISTS updateClassStatusTrigger ## 
CREATE TRIGGER updateClassStatusTrigger 
BEFORE UPDATE ON SCHEDULED_CLASS 
    FOR EACH ROW 
    BEGIN 
     SELECT EXISTS (SELECT 1 FROM SCHEDULED_CLASS sc, CLASS cl WHERE cl.CLASS_ID=NEW.CLASS_ID AND NEW.NUMBER_OF_ENROLLED_STUDENTS=cl.MAX_SEATS) INTO @row_exists; 
     IF @row_exists THEN 
      SET NEW.STATUS='FULL'; 
     END IF; 
    END## 

我希望我沒有在上面的語法錯誤。我已經在自己的表格上對它進行了測試,但是之後進行了編輯以適合您的模式。

你自己的嘗試失敗了,因爲在觸發器內,MySQL不允許你修改觸發器執行的表。它無法分析你的查詢,以確定你基本上可以用有效的方式完成的嘗試 - 它甚至不嘗試。它只是禁止修改同一個表。

+0

這非常有幫助。非常感謝 ! – mtk 2012-07-14 13:20:20