我有一个我想要的表:当表更新时,其中2个字段(标题和描述)会更改并从另一个表中获取值
这是我的触发器:
drop trigger trigger_trade_request ;
CREATE TRIGGER trigger_trade_request AFTER UPDATE ON `trade_request`
FOR EACH ROW
BEGIN
IF NEW.title = null THEN
UPDATE `trade_request_type`,`trade_request`
SET NEW.title = `trade_request_type`.title ,
NEW.description = `trade_request_type`.description
WHERE `trade_request_type`.id = NEW.trade_request_typeId;
END IF;
END;
我的桌子:
错误:
错误1442:无法更新存储函数/触发器中的表'trade_request',因为它已被调用此存储函数/触发器的语句使用。
它不起作用!问题是什么?
答案 0 :(得分:4)
is null
检查空值。BEFORE
行上更新的行使用SET
触发器和NEW
的值。试试这个:
CREATE TRIGGER trigger_update_request BEFORE UPDATE ON `trade_request`
FOR EACH ROW
BEGIN
IF NEW.title IS NULL THEN
SET NEW.title = (SELECT title FROM trade_request_type
WHERE trade_request_type.id = NEW.trade_request_typeId);
SET NEW.description = (SELECT description FROM trade_request_type
WHERE trade_request_type.id = NEW.trade_request_typeId);
END IF;
END;
您可以使用SELECT...INTO
语法代替SET
,如下所示:
CREATE TRIGGER trigger_update_request BEFORE UPDATE ON `trade_request`
FOR EACH ROW
BEGIN
IF NEW.title IS NULL THEN
SELECT title, description
FROM trade_request_type
WHERE trade_request_type.id = NEW.trade_request_typeId
INTO NEW.tile, NEW.description;
END IF;
END;
答案 1 :(得分:0)
这是因为您正在尝试更新其他表。 试试这个:
UPDATE `trade_request`
SET NEW.title = `trade_request_type`.title ,
NEW.description = `trade_request_type`.description
FROM `trade_request_type`
WHERE `trade_request_type`.id = NEW.trade_request_typeId;
AND `trade_request_type`.id = `trade_request`.id
答案 2 :(得分:0)
三个问题:
is null
(不是= null
,这是永远不会的)NEW.column = some_value
试试这个:
drop trigger trigger_trade_request ;
CREATE TRIGGER trigger_trade_request BEFORE UPDATE ON `trade_request`
FOR EACH ROW
BEGIN
IF NEW.title is null THEN
SET NEW.title = (select title from trade_request_type WHERE trade_request_type.id = NEW.trade_request_typeId);
SET NEW.description = (select description from trade_request_type WHERE trade_request_type.id = NEW.trade_request_typeId);
END IF;
END;