我可以使用MySQL触发器更新刚添加的行吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用MySQL触发器更新刚添加的行吗?相关的知识,希望对你有一定的参考价值。
我的数据库中一列的默认初始值与行的自动递增ID相同。我正在尝试使用触发器来设置它。
CREATE TRIGGER `default_order_value`
AFTER INSERT ON `clusters`
FOR EACH ROW
BEGIN
UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id;
END
但这会导致语法错误
#1064 - 您的SQL语法有错误;检查与mysql服务器版本对应的手册,以便在第5行的''附近使用正确的语法
我已经尝试了各种各样的排列,没有运气。谁能看到我做错了什么?
答案
正如zerkms所说,你需要改变分隔符。但由于您只使用1行代码,因此不需要BEGIN和END。这样,您也不需要更改分隔符
CREATE TRIGGER `default_order_value`
AFTER INSERT ON `clusters`
FOR EACH ROW
UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id;
由于您收到错误而无法更新行,我建议如下:
根本不要执行更新查询。默认情况下,订单值= ID值。因此,当订单值更改时,您可以正确更新它。
如果您使用php请求数据,请执行以下操作:
$order = $row['order'];
if ($order == '')
$order = $row['id'];
在您需要更新后,您将获得正确的值。
另一答案
我认为你不能这样做。 AFTER INSERT
触发器无法通过发出UPDATE
或类似的内容来修改同一个表:
CREATE TRIGGER `default_order_value`
AFTER INSERT ON `clusters`
FOR EACH ROW
SET NEW.`order` = NEW.id ;
这会导致此错误:
> Error Code: 1362. Updating of NEW row is not allowed in after trigger
你不能使用BEFORE INSERT
触发器,因为那时NEW.id
是未知的(如果修改上面的内容,order
列将在插入后得到0
值。
您可以做的是使用交易:
START TRANSACTION ;
INSERT INTO clusters (id)
VALUES (NULL);
UPDATE clusters
SET `order` = id
WHERE id = LAST_INSERT_ID();
COMMIT ;
另一答案
你得到错误是因为mysql将第5行中的;
视为触发器声明的结束,这显然会导致语法错误。
因此,在指定触发器主体之前,需要重新定义分隔符:
delimiter |
CREATE TRIGGER `default_order_value`
AFTER INSERT ON `clusters`
FOR EACH ROW
BEGIN
UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id;
END;
|
delimiter ;
另一答案
你可以创建BEFORE INSERT TRIGGER,它的工作原理如下:
CREATE TRIGGER `default_order_value`
BeFORE INSERT ON `clusters`
FOR EACH ROW
BEGIN
SET NEW.`order` = NEW.id ;
END
我们正在使用以下相同
DELIMITER $$
USE `e_store`$$
DROP TRIGGER /*!50032 IF EXISTS */ `Test`$$
CREATE
/*!50017 DEFINER = 'root'@'%' */
TRIGGER `Test` BEFORE INSERT ON `categories`
FOR EACH ROW
BEGIN
DECLARE vtype VARCHAR(250) DEFAULT NULL;
SET vtype = NEW.name;
IF (NEW.MDNAME IS NULL)
THEN
-- SET NEW.MDNAME = 'NA';
SET NEW.MDNAME=MD5(NEW.name);
END IF;
END;
$$
DELIMITER ;
另一答案
这对我有用:
CREATE TRIGGER `update_table_2`
AFTER UPDATE ON `table_1`
FOR EACH ROW
UPDATE table2
JOIN table_1
SET table_2.the_column = NEW.the_column
WHERE table_2.auto_increment_field = OLD.auto_increment_field
以上是关于我可以使用MySQL触发器更新刚添加的行吗?的主要内容,如果未能解决你的问题,请参考以下文章
除了覆盖表之外,还有其他方法可以更新 Big Query 中的行吗?