【问题标题】:MYSQL: How do I create a trigger that calculates a field value based on value from different table?MYSQL:如何创建一个触发器,根据不同表中的值计算字段值?
【发布时间】: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 中手动计算不是更好吗?

标签: mysql sql triggers


【解决方案1】:

试试这个:

DELIMITER $$

CREATE TRIGGER `yourDB_polozky`
   BEFORE INSERT
   ON `yourDB`.`polozky`
   FOR EACH ROW
BEGIN
   DECLARE vat_rate   float;

   SELECT DPH
     INTO dph_rate
     FROM `yourDB`.`dph`
    WHERE id = new.dph_id;

   SET new.cena = (1 + dph_rate) * (new.cena_za_kus * new.mnozstvi);
END
$$

【讨论】:

  • 我花了一段时间,但最终成功了。我需要添加“新”。到最后一行。我还意识到我必须编写一个类似但复杂的触发器,以防带有增值税的表发生变化。
  • 糟糕!我很着急;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多