我有以下触发器:
CREATE TRIGGER sum
AFTER INSERT
ON news
FOR EACH ROW
UPDATE news SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews
Run Code Online (Sandbox Code Playgroud)
它对表的列int_views和ext_views列进行求和,并将它们除以总页面浏览量.
每当我尝试向新闻添加新行时,我都会收到以下错误:
ERROR 1442 (HY000) at line 3: Can't update table 'news' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Run Code Online (Sandbox Code Playgroud)
触发对我来说似乎很简单.触发器无法运行是否有原因?
Eug*_*eck 13
该症状是,你正在运行UPDATE一个内部(所有行)INSERT触发-无论是修改表,这是不允许的.
也就是说,如果我猜错了你的触发器的意图,你不想更新所有行,只想更新新插入的行.你可以轻松实现这一目标
CREATE TRIGGER sum
BEFORE INSERT
ON news
FOR EACH ROW
SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个BEFORE INSERT触发器,因为您希望在将行写入表之前更改该行.
小智 8
如果您尝试在导致触发器触发的同一个表上更新/插入,请不要使用常用sql命令
-> UPDATE TABLE_NAME SET COLUMN_NAME = VALUE WHERE CONDITION_LIST;
-> INSERT INTO TABLE_NAME VALUES("VALUE1","VALUE2");
Run Code Online (Sandbox Code Playgroud)
这不行.仅使用set来指定您更新的列的值.
例:
CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE ON table_name
FOR EACH ROW
SET NEW.COLUMN_NAME = "VALUE";
Run Code Online (Sandbox Code Playgroud)