【问题标题】:Alternative to TRIGGERS/PROCEDURES MYSQL触发器/程序 MYSQL 的替代方案
【发布时间】:2014-07-22 11:54:47
【问题描述】:

我无法找到解决问题的方法。我需要能够为以下任务创建 TRIGGER/PROCEDURE/FUNCTION(以最适用的为准)。

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

我创建了这个 PROCEDURE 来演示我的方法(这个过程目前在 UPDATE product SET product.bawtry_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) 

因此,每次对产品表执行 UPDATE 或 INSERT 操作时 - 我需要计算列出的列中的所有值并将其输入到 bawtry_stock, chain_stock 等中。

如果这是不可能的,那么也许创建一个可以通过 PHP 调用的 FUNCTION/PROCEDURE,我将作为 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 Trigger: ERROR 1442 (HY000): Cant update table 'tbl' in stored function/trigger because it is already used by statement which invoked this stored function/trigger 错误。

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

【问题讨论】:

标签: php mysql sql stored-procedures


【解决方案1】:

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

【讨论】:

  • 开始看起来这是我完成这项任务的最佳方式。谢谢你的建议。
【解决方案2】:

这是一个非常复杂的表格,这样的表格使用并不常见。我建议您考虑如何重构此表以分隔具有较少列的表。

尝试阅读有关关系数据库的数据规范化的信息。 试试this tutorial

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

您必须有 2 个触发器。 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 中创建触发器的更多信息here

【讨论】:

  • 我无法让它工作。我已经创建了如上所示的触发器并且查询成功了。但是,当我尝试将任何内容插入/更新到表中时,会显示以下错误消息#1054 - Unknown column 'quantity_size_1' in 'field list' - 我已经使用细齿梳浏览了我的代码,并且在我的触发器语句中没有声明该大小......我我不知所措。有什么线索吗?
  • 你能把完整的表声明和你写的触发器发给我吗?
猜你喜欢
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多