【发布时间】:2013-03-25 15:08:45
【问题描述】:
在表 A 我有字段 CENA(price)、cena_za_kus(price_per_piece)、mnozstvi(quantity)。
在 表 B 我有字段 DPH(vat)。
我想添加一个更新/插入前触发器,它将计算PRICE 字段的值,如下所示:
price = (price_per_piece * count) + (price_per_piece * count * tableB.vat)
这可能吗? 谢谢。
编辑:table A 中的行有一个 foreign_key dph_id 指向table B 中的对应行。
CREATE TABLE `polozky` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`objednavka_id` int(11) NOT NULL,
`dph_id` int(11) NOT NULL,
`polozka` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`cena` float NOT NULL,
`mnozstvi` int(11) NOT NULL,
`cena_za_kus` float NOT NULL,
PRIMARY KEY (`id`),
KEY `IdObjednavka` (`objednavka_id`,`dph_id`),
KEY `objednavka_id` (`objednavka_id`),
KEY `dph_id` (`dph_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=63663 ;
ALTER TABLE `polozky`
ADD CONSTRAINT `polozky_ibfk_7` FOREIGN KEY (`objednavka_id`) REFERENCES `objednavky` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `polozky_ibfk_8` FOREIGN KEY (`dph_id`) REFERENCES `dph` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
和
CREATE TABLE `dph` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sekce` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'nastaveni',
`popis` varchar(8) COLLATE utf8_unicode_ci NOT NULL,
`DPH` int(11) unsigned NOT NULL,
`poradi` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `DPH_2` (`DPH`),
UNIQUE KEY `popis` (`popis`),
KEY `DPH` (`DPH`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ;
【问题讨论】:
-
分享所涉及表的表架构;使用
show create table tableName。 -
您在表中定义了
cena或价格,您希望触发器在其上运行并且不为空。如果价格是派生/计算值,那么为什么要存储它。只需根据需要计算。如果你真的需要它,那么我会建议一个视图。CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t; -
Harrison:用触发器计算数据库中的值而不是每次在 PHP 中手动计算不是更好吗?