Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 触发器/过程的替代方案_Php_Mysql_Sql_Stored Procedures - Fatal编程技术网

Php 触发器/过程的替代方案

Php 触发器/过程的替代方案,php,mysql,sql,stored-procedures,Php,Mysql,Sql,Stored Procedures,我很难找到解决问题的办法。我需要能够为以下任务创建触发器/过程/函数(以最适用的为准) 我想计算多列的值,并将计算结果放入同一MYSQL表中的列中。我希望每次执行更新或在数据库表中插入数据的操作时都进行计算 我创建此过程是为了演示我的方法(此过程当前在更新产品集product.bawtry\u stock=之后抛出语法错误) MYSQL DELIMITER $$ CREATE PROCEDURE update_stock() BEGIN ON `produc

我很难找到解决问题的办法。我需要能够为以下任务创建触发器/过程/函数(以最适用的为准)

我想计算多列的值,并将计算结果放入同一MYSQL表中的列中。我希望每次执行更新或在数据库表中插入数据的操作时都进行计算

我创建此过程是为了演示我的方法(此过程当前在
更新产品集product.bawtry\u stock=
之后抛出语法错误)

MYSQL

DELIMITER $$

    CREATE PROCEDURE update_stock()
      BEGIN
        ON `product` 
          UPDATE product SET product.bawtry_stock =

            kids_uk_j_105 + kids_c_17 + kids_c_18 + kids_c_19 + 
            kids_c_20 + kids_c_21,


            quantity_c_size_26 + quantity_c_size_26_con_b,

            product.chain_stock =

            // as above with chain size suffixes

            product.totalstock = bawtry_stock + chain_stock,
            product.bawtry_value = bawtry_stock * wholesale_price,
            product.chain_value = chain_stock * wholesale_price,
            product.totalvalue = chain_value + bawtry_value;
  END$$

DELIMITER ;
**MYSQL表**

TBL NAME = 'product' 
TBL COLUMNS = bawtry_stock, 
              chain_stock, 
              totalstock, 
              bawtry_value,
              chain_value,
              totalvalue, 
              product_id, (PKEY)
              (together with all of the kids and quantity size columns) 
因此,每次对产品表执行更新或插入操作时,我需要计算列中的所有值,并将其输入到
bawtry\u stock、chain\u stock

如果这是不可能的,那么可能创建一个可以通过PHP调用的函数/过程,我将作为CRONJOB运行

如果有人能提供一些建议,我们将不胜感激。 谢谢

编辑

只是为了提供一些进一步的信息-我已经尝试使用类似的语法将其作为触发器:

触发器

分隔符$$

CREATE
    TRIGGER `update_stock`
AFTER UPDATE ON `product` 
FOR EACH ROW BEGIN
            UPDATE product
            SET bawtry_stock =

 // ... same body logic as above

  END$$

DELIMITER ;
这产生了MySQL触发器:错误1442(HY000):无法更新存储函数/触发器中的表“tbl”,因为调用此存储函数/触发器的语句已经使用了该表


我研究了这一点,发现了这篇文章

您可以创建另一个表,它保存您的计算值和产品id(可以用外键引用),将触发器添加到主表中以进行更新和插入操作,并在新表中更新或插入您的值。无论您在何处使用这些值,都可以在select语句中连接这两个表。

这是一个非常复杂的表,像这样使用表并不常见。我建议您考虑如何重构此表,以使表中的列更少

尝试阅读有关关系数据库数据规范化的内容。 试一试

现在回到你的问题上来。如果每次更改数据时都需要更新表,则需要触发器。 在触发器中,您将列称为new.col_name和old.col_name

你必须有两个触发器。1用于更新,1用于插入。 我建议您在插入触发器之前和更新触发器之前使用

比如:

CREATE TRIGGER update_product_stock_trg BEFORE update ON product
FOR EACH ROW SET 
    new.totalstock = new.bawtry_stock + new.chain_stock,
    new.bawtry_value = new.bawtry_stock * new.wholesale_price,
    new.chain_value = new.chain_stock * new.wholesale_price,
    new.totalvalue = new.chain_value + new.bawtry_value

    .... and so on for all your calculations.

;


CREATE TRIGGER insert_product_stock_trg BEFORE INSERT ON product
FOR EACH ROW SET 
    new.totalstock = new.bawtry_stock + new.chain_stock,
    new.bawtry_value = new.bawtry_stock * new.wholesale_price,
    new.chain_value = new.chain_stock * new.wholesale_price,
    new.totalvalue = new.chain_value + new.bawtry_value
 .... and so on for all your calculations.

;

您可以阅读有关在MySQL中创建触发器的更多信息,“但是为什么我不能使用该模式?”。现在请解释您被卡住的位置。@RandomSeed-请参阅上面的进一步编辑以解释我被卡住的位置。可能的重复项-您不能更新调用触发器的表中的任意行,但是。@RandomSeed-所以在这里最好的做法是创建一个触发器,该触发器通过UPDATE或INSERT操作修改正在修改的行。这是有意义的,因为您不需要在每次仅修改一行时计算表中的每一行。你能不能拿出一个例子来说明我的触发器在一行中是如何工作的?ThanksIt开始看起来这是我完成这项任务的最佳方式。谢谢你的建议。我根本没办法让它发挥作用。我已经创建了如上所示的触发器,并且查询成功。但是,当我尝试在表中插入/更新任何内容时,会显示以下错误消息
#1054-字段列表中的未知列“数量大小1”
-我仔细检查了代码,在触发器语句中没有声明该大小。。。我不知所措。有什么线索吗?你能给我完整的表声明和你写的触发器吗?