我很难找到解决问题的方法。我需要能够创建一个触发器/程序/函数(无论哪个是最适用的)以下任务。
我想计算多个列的值,并将计算结果放入同一个MYSQL表内的列中。我希望每次执行操作时都进行计算,该操作要么更新数据,要么在数据库表中插入数据。
我创建了这个PROCEDURE来演示我的方法(这个过程目前在UPDATE product SET product.bawtry_stock =
之后抛出语法错误)
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
您可以创建另一个表,其中保存计算值和product_id(可以使用外键引用),在主表中添加用于更新和插入操作的触发器,并在新表中更新或插入您的值。无论在哪里使用这些值,都可以在select语句中将这两个表连接起来。
这是一个非常复杂的表,使用这样的表并不常见。我建议你考虑一下如何重构这个表,用更少的列来分隔表。
尝试阅读关于关系数据库的数据规范化。试试这个教程
现在回到你的问题。如果您需要在每次数据更改时更新表,则需要一个触发器。在触发器中,您将列称为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中创建触发器的信息