我可以使用MySQL触发器更新刚添加的行吗?

问题描述 投票:3回答:5

我的数据库中一列的默认初始值与行的自动递增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行的''附近使用正确的语法

我已经尝试了各种各样的排列,没有运气。谁能看到我做错了什么?

mysql triggers insert
5个回答
8
投票

正如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'];

在您需要更新后,您将获得正确的值。


7
投票

我认为你不能这样做。 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 ;

2
投票

你得到错误是因为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 ;

0
投票

你可以创建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 ;

-1
投票

这对我有用:

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
© www.soinside.com 2019 - 2024. All rights reserved.