2015-10-22 30 views
1

我有以下觸發:錯誤代碼:1442在存儲函數/觸發無法更新表「學生」

CREATE [email protected] TRIGGER after_insert_student after INSERT ON 
students FOR EACH ROW BEGIN 
    SET @NEWID := NEW.ID ; 
if @NEWID IS NOT NULL THEN  
    INSERT INTO students SET ID = @NEWID; 
else 
    INSERT INTO students SET ID = 001; 
END IF 
END 

錯誤:

Error Code: 1442. Can't update table 'students' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

回答

0

不能更改,而表INSERT觸發器正在觸發。 INSERT可能會執行一些可能導致死鎖的鎖定。另外,從觸發器更新表格會導致同一個觸發器在無限遞歸循環中再次觸發。這些原因都是MySQL阻止你這樣做的原因。

要做到這一點,請參考this link

0

你可能需要一個BEFORE INSERT觸發器。然後,不要更新表格,只需將所需的值分配給NEW.ID。

0

的問題是,你不能寫的語句像

INSERT INTO students SET ID = @NEWID; 

,因爲它需要知道你要插入的列,或者如果沒有指定列,那麼你插入到所有字段的值等

INSERT INTO students values (@NEWID); 

應該工作,或者如果你要堅持你的SET ID然後嘗試寫類似

UPDATE students SET ID = @NEWID; 

希望這能指導您解決您的問題。

0

解決方案:使它成爲一個BEFORE UPDATE開啓觸發,並使用新的運營商,它會做的工作 - 因爲所有你想要的是,如果新的ID是空集,以001:

CREATE [email protected] TRIGGER after_insert_student 
BEFORE INSERT ON students 
FOR EACH ROW BEGIN 
    IF NEW.ID IS NULL THEN  
     SET ID = 001; 
    END IF; 
END; 

原因:您不能更新,其中觸發器調用的表(學生):

Within a stored function or trigger, it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.

這樣做將產生錯誤1442:

Error Code: 1442 
Can't update table 'chatroompost' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 
相關問題