Php 触发器/过程的替代方案
我很难找到解决问题的办法。我需要能够为以下任务创建触发器/过程/函数(以最适用的为准) 我想计算多列的值,并将计算结果放入同一MYSQL表中的列中。我希望每次执行更新或在数据库表中插入数据的操作时都进行计算 我创建此过程是为了演示我的方法(此过程当前在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
更新产品集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”
-我仔细检查了代码,在触发器语句中没有声明该大小。。。我不知所措。有什么线索吗?你能给我完整的表声明和你写的触发器吗?