2010-07-03 23 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