2010-07-03 24 views
1

我正在使用CMS系统,并使用一种将表格字段插入到表格中的smartform。更改已插入表格字段的值

在这些领域是产品名称,数量和成本。

成本和产品名称取自产品表,而数量是手动输入。

我知道这不是最好的架构,但我受限于我正在使用的系统。

我想要做的是改变插入后的成本值,以数量*成本。

这样做最简单的方法是什么?

+1

为什么要这样做?它违反了良好DB设计的原则,并且是绝对的罪。 – 2010-07-03 08:32:38

+0

你有没有看到我说我明白这个问题? – Jacob 2010-07-03 17:51:04

回答

0

如果你的双手系得太紧以至于无法更改表格结构,那么你可能无法使用触发器,但是无论如何。

这是一个示例的表结构:

DROP TABLE IF EXISTS `products`; 

CREATE TABLE `products` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `product` VARCHAR(255), 
    `quantity` INT(11) NOT NULL, 
    `cost` DECIMAL(6,2) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

创建触发器,它被插入到products表之前更新成本:

DELIMITER // 
DROP TRIGGER IF EXISTS update_cost// 
CREATE TRIGGER update_cost BEFORE INSERT ON products 
FOR EACH ROW BEGIN 
    SET NEW.cost = NEW.cost * NEW.quantity; 
END; 
// 
DELIMITER ; 

插入几个产品进入表:

INSERT INTO `products` (`product`, `quantity`, `cost`) VALUES 
('Acme portable hole', 10, 20), 
('Acme jet pack', 1000, 2); 

成本自动更新:

SELECT * FROM prodcuts; 

+----+--------------------+----------+---------+ 
| id | product   | quantity | cost | 
+----+--------------------+----------+---------+ 
| 1 | Acme portable hole |  10 | 200.00 | 
| 2 | Acme jet pack  |  1000 | 2000.00 | 
+----+--------------------+----------+---------+ 
+0

我可以改变表结构,只是不用查询用来访问它,但我可以使用触发器。谢谢。 – Jacob 2010-07-03 17:52:47

+0

@Jacob:我想这是个好消息:-)我很高兴能够提供帮助。至少一个触发器应该有助于防止成本爆炸,因为它只会发生一次 - 插入行时。这也意味着您不必担心在整个代码中执行此操作。 – Mike 2010-07-03 18:20:58

0

您可以插入后运行UPDATE,使用新产品的标识字段:

UPDATE products 
SET cost = cost * quantity 
WHERE product_id = @productId 
1

要改变一个行:

update TheTable 
set  cost = quantity * cost 
where pk = 123 

如果你运行这个多次,成本将爆炸;-)

+0

+1很好的警告:) – sarnold 2010-07-03 08:31:55