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

时间:2012-02-19 20:43:02

标签: mysql triggers insert

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

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

5 个答案:

答案 0 :(得分: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'];

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

答案 1 :(得分: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 :(得分: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 ;

答案 3 :(得分:0)

您只能在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 ;

答案 4 :(得分:-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
相关问题