如果你在使用mysql的過程中,遇到了報(bào)錯1442的情況,那么你需要對它進(jìn)行一定的了解和處理。
mysql>set session sql_mode='STRICT_ALL_TABLES'; ERROR 1442 (HY000): Can't update table 'table_name' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
其中,mysql錯誤代碼1442表示不能在存儲過程或觸發(fā)器中更新表。常常是因?yàn)楫?dāng)存儲過程或觸發(fā)器調(diào)用時,表已經(jīng)被使用了。解決這個錯誤的方法也很簡單,可以通過以下的兩種方式中的一種來解決:
方法一:
禁用sql模式,使用以下命令:
SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION';
該命令將對整個MySQL數(shù)據(jù)庫生效。
方法二:
通過修改MySQL存儲函數(shù)的定義來解決報(bào)錯1442的問題。例如,如果你在存儲過程或觸發(fā)器中定義了以下存儲過程:
CREATE FUNCTION sample_function(sample_param VARCHAR(100)) RETURNS INT BEGIN UPDATE table_name SET column_name = sample_param WHERE column_name = sample_param; RETURN 1; END;
你可以將其修改為:
CREATE FUNCTION sample_function(sample_param VARCHAR(100)) RETURNS INT BEGIN UPDATE table_name SET column_name = sample_param WHERE column_name = sample_param AND NOT (SELECT COUNT(*) FROM information_schema.triggers WHERE trigger_schema = DATABASE() AND trigger_name = 'trigger_name' AND event_object_table = 'table_name' AND action_timing = 'BEFORE' AND event_manipulation = 'INSERT' AND action_orientation = 'ROW'); RETURN 1; END;
這樣修改后,當(dāng)存儲過程或觸發(fā)器被調(diào)用時,就不會發(fā)生報(bào)錯1442的情況了。