我可以使用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 中的行吗?

python覆盖模块可以有条件地忽略单元测试中的行吗?

MySQL 触发器更新最后插入的行

DBGrid通过代码突出显示所定位的行吗?

可以使用 Google Prediction API 从 bigquery 表中检索相似的行吗?

我可以在我想要的字符串之前或之后 grep 一定数量的行吗? [复制]