MySql存储过程如何处理?

MySql存储过程如何处理?,mysql,triggers,procedure,Mysql,Triggers,Procedure,试图让一个拒绝工作的触发器工作,我认为它必须被设置为一个程序,让它工作,这是我以前从未使用过的,有谁能告诉我,我将如何做?触发器在添加时不会显示错误,但不会执行任何操作 **除了将“已处理”更改为0之外,它现在还可以工作 什么是ebaylinked?定义触发器时应该会出现错误 如果要更新触发器定义的表,则应在更新前使用触发器。因此,我认为你打算: DELIMITER $$ CREATE TRIGGER `Update` BEFORE UPDATE ON `ebaylinked` FOR EA

试图让一个拒绝工作的触发器工作,我认为它必须被设置为一个程序,让它工作,这是我以前从未使用过的,有谁能告诉我,我将如何做?触发器在添加时不会显示错误,但不会执行任何操作

**除了将“已处理”更改为0之外,它现在还可以工作


什么是
ebaylinked
?定义触发器时应该会出现错误

如果要更新触发器定义的表,则应在更新前使用
触发器。因此,我认为你打算:

DELIMITER $$

CREATE TRIGGER `Update` BEFORE UPDATE ON `ebaylinked`
 FOR EACH ROW
BEGIN
    UPDATE product p
        SET p.product_stock = p.product_stock - new.QuantitySold
        WHERE p.eBay_ID = new.ebay_ID AND new.Processed = 1;

    SET new.Processed = 0;
END; $$

DELIMTER ;

什么是
ebaylinked
?定义触发器时应该会出现错误

如果要更新触发器定义的表,则应在更新前使用
触发器。因此,我认为你打算:

DELIMITER $$

CREATE TRIGGER `Update` BEFORE UPDATE ON `ebaylinked`
 FOR EACH ROW
BEGIN
    UPDATE product p
        SET p.product_stock = p.product_stock - new.QuantitySold
        WHERE p.eBay_ID = new.ebay_ID AND new.Processed = 1;

    SET new.Processed = 0;
END; $$

DELIMTER ;

首先,为触发器找到一个更具描述性的名称;)

现在,对于实际问题,您在触发器代码中对
ebaylinked
中的列的引用基本上是错误的。要使用刚更新的记录中的值,需要使用伪记录
NEW
,这是一条记录,包含表的当前行,更新完成后将如此。
ebaylinked.quantitysell
这样的引用是不明确的,因为它们没有指定哪一行数据是正确的

此外,不能引用触发表中的其他行。你的子句
集。。。ebaylinked.Processed=0。。。哪里因此,ebaylinked.Processed=1既冗余又错误,因为行触发器只能看到当前行

因此,您的触发代码应该是

CREATE TRIGGER `ebaylinked_update_product`
  AFTER UPDATE ON `ebaylinked`
  FOR EACH ROW
    UPDATE product
      SET product.product_stock = product.product_stock - NEW.QuantitySold
      WHERE product.eBay_ID = NEW.ebay_ID;
注意:我忽略了
processed
列,因为它没有任何用处(前提是触发器insert被包装在事务中),但是如果您必须使用它,您可以将触发器更改为在行之前,如下所示:

DELIMITER //

CREATE TRIGGER `ebaylinked_update_product`
  BEFORE UPDATE ON `ebaylinked`
  FOR EACH ROW
  BEGIN
    IF NEW.processed = 1 THEN
      UPDATE product
        SET product.product_stock = product.product_stock - NEW.QuantitySold
        WHERE product.eBay_ID = NEW.ebay_ID;
      SET NEW.processed = 0;
    END IF;
  END;
  //

  DELIMITER ;
请注意
分隔符
和其后的空格。当触发器主体包含多个以分号结尾的语句时,在某些客户端中需要此指令

希望有帮助


PS:您可以通过触发器调用存储过程来实现这一点,但对于这么简单的事情,我认为它会增加比它所值的更多的复杂性。

首先,为您的触发器找到一个更具描述性的名称;)

现在,对于实际问题,您在触发器代码中对
ebaylinked
中的列的引用基本上是错误的。要使用刚更新的记录中的值,需要使用伪记录
NEW
,这是一条记录,包含表的当前行,更新完成后将如此。
ebaylinked.quantitysell
这样的引用是不明确的,因为它们没有指定哪一行数据是正确的

此外,不能引用触发表中的其他行。你的子句
集。。。ebaylinked.Processed=0。。。哪里因此,ebaylinked.Processed=1既冗余又错误,因为行触发器只能看到当前行

因此,您的触发代码应该是

CREATE TRIGGER `ebaylinked_update_product`
  AFTER UPDATE ON `ebaylinked`
  FOR EACH ROW
    UPDATE product
      SET product.product_stock = product.product_stock - NEW.QuantitySold
      WHERE product.eBay_ID = NEW.ebay_ID;
注意:我忽略了
processed
列,因为它没有任何用处(前提是触发器insert被包装在事务中),但是如果您必须使用它,您可以将触发器更改为在行之前,如下所示:

DELIMITER //

CREATE TRIGGER `ebaylinked_update_product`
  BEFORE UPDATE ON `ebaylinked`
  FOR EACH ROW
  BEGIN
    IF NEW.processed = 1 THEN
      UPDATE product
        SET product.product_stock = product.product_stock - NEW.QuantitySold
        WHERE product.eBay_ID = NEW.ebay_ID;
      SET NEW.processed = 0;
    END IF;
  END;
  //

  DELIMITER ;
请注意
分隔符
和其后的空格。当触发器主体包含多个以分号结尾的语句时,在某些客户端中需要此指令

希望有帮助


PS:您可以通过触发器调用存储过程来实现这一点,但对于这样简单的事情,我认为它会增加比实际值更多的复杂性。

我在尝试使用该代码时发现,#1064-您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解要使用的正确语法。已处理=0;在第二行结束8@jamescox . . . 哎呀,缺少
。我在尝试使用该代码时发现,#1064-您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解要使用的正确语法。已处理=0;在第二行结束8@jamescox . . . 哎呀,丢失了
。这会进行相同的添加,但不会更新任何内容,我检查了所有字段都是正确的,它们与所发生的事情非常混淆,所以我们都在同一页上,用你自己的话给我描述一下你想要这个触发器做什么。我搞砸了,更新了,而不是插入了。除了将处理字段更改为0(似乎被忽略)之外,所有的东西都与我的新触发器一起工作?我将把最上面的问题改为“我现在有代码”您不能在后行触发器中修改
NEW
。(好吧,你可以,但它没有做任何有用的事情。)列
processed
也没有做任何有用的事情,假设您正在插入值
1
,然后触发器将其更改为
0
,作为相同插入操作的一部分。php脚本从ebay API中提取值1时,会将值1插入,1作为检查,以确保在更改产品表中的值之前,该值尚未用于更新库存。这样做的目的是:相同的添加,但不更新任何内容,我检查了所有字段是否正确,它们与当前的情况非常混淆,所以我们都在同一页上,用你自己的话给我描述一下你想要这个触发器做什么。我搞砸了,更新了,而不是插入了。除了将处理字段更改为0(似乎被忽略)之外,所有的东西都与我的新触发器一起工作?我把最重要的问题改成“我现在有你”