MySQL - 在插入之前使用函数和触发器更新列值

时间:2017-04-03 05:02:38

标签: mysql triggers

我试图在插入之前用触发器更新2列,但是我有意想不到的结果。我插入一些数据,最后2列将自动插入值,这是我的第一次尝试 enter image description here

见?即使我设置了一些触发器和函数来自动填充列,最后2列也为null。这是我第二次尝试完全相同的数据

enter image description here

最后2列填充了数据,但我不明白为什么第一次尝试失败了?

这是我在total_harga列中使用的触发器

CREATE TRIGGER `set_total_harga` BEFORE INSERT ON `tbl_transaksi_detail`
 FOR EACH ROW BEGIN
set NEW.total_harga = hitungTotalHargaPerItem(NEW.qty, NEW.harga_satuan);
END

触发列harga_satuan

CREATE TRIGGER `set_harga_satuan` BEFORE INSERT ON `tbl_transaksi_detail`
 FOR EACH ROW BEGIN
set NEW.harga_satuan = set_Harga_Unit(NEW.unit, NEW.id_barang, NEW.no_transaksi);
END

function set_Harga_Unit

  BEGIN
  DECLARE
    q,
    id_toko INT;
  SET
    id_toko =(
    SELECT DISTINCT
      `tbl_transaksi`.`id_toko`
    FROM
      `tbl_transaksi`,
      `tbl_transaksi_detail`
    WHERE
      `tbl_transaksi`.`no_transaksi` = no_trans
  ); IF unit = "PCS" THEN
SET
  q =(
  SELECT
    `tbl_harga_jual`.`harga_pcs`
  FROM
    `tbl_harga_jual`
  WHERE
    `tbl_harga_jual`.`id_barang` = id_brg AND `tbl_harga_jual`.`id_toko` = id_toko
); RETURN q; ELSEIF unit = "PAK" THEN
SET
  q =(
  SELECT
    `tbl_harga_jual`.`harga_pak`
  FROM
    `tbl_harga_jual`
  WHERE
    `tbl_harga_jual`.`id_barang` = id_brg AND `tbl_harga_jual`.`id_toko` = id_toko
); RETURN q; ELSEIF unit = "KARTON" THEN
SET
  q =(
  SELECT
    `tbl_harga_jual`.`harga_karton`
  FROM
    `tbl_harga_jual`
  WHERE
    `tbl_harga_jual`.`id_barang` = id_brg AND `tbl_harga_jual`.`id_toko` = id_toko
); RETURN q;
END IF; RETURN q;
END

function hitungTotalHargaPerItem

BEGIN
DECLARE hasil int;
    set hasil = qty * harga_satuan;
    RETURN hasil;
END

2 个答案:

答案 0 :(得分:0)

根本原因serms是设置id_toko变量值的选择:

  SET
    id_toko =(
    SELECT DISTINCT
      `tbl_transaksi`.`id_toko`
    FROM
      `tbl_transaksi`,
      `tbl_transaksi_detail`
    WHERE
      `tbl_transaksi`.`no_transaksi` = no_trans
  ); 

在另一个表中选择内部联接tbl_transaksi_detail(带有触发器的表)。但是,在第一种情况下,tbl_transaksi_detail仍然为空(触发器在插入之前),因此id_toko变量设置为null。

这将导致q为空,从而导致整个计算设置为null。

在第二种情况下,已经在tbl_transaksi_detail表中插入了记录,因此计算返回非空值。但它只返回正确的值,因为第1和第2条记录的详细信息完全相同。

我真的不明白那个计算id_toko的选择。如果这是一个交易ID,那么您可以使用last_insert_id()如果它是自动递增并且刚刚创建了交易记录,或者max(id_toko)可以获得id_toko的最高值(这不是多用户安全)。

答案 1 :(得分:-1)

根据@Shadow

的线索,似乎我在函数set_Harga_Unit中错误地选择了查询
SET
    id_toko =(
    SELECT DISTINCT
      `tbl_transaksi`.`id_toko`
    FROM
      `tbl_transaksi`,
      `tbl_transaksi_detail`<<== I DON'T NEED THIS
    WHERE
      `tbl_transaksi`.`no_transaksi` = no_trans
  ); IF unit = "PCS" THEN

首次插入tbl_transaksi_detail时,值no_transaksi为空,因为我在空表(before insert)中使用了触发器tbl_transaksi_detail,因此我删除了tbl_transaksi_detail来自查询

SET
        id_toko =(
        SELECT DISTINCT
          `tbl_transaksi`.`id_toko`
        FROM
          `tbl_transaksi`
        WHERE
          `tbl_transaksi`.`no_transaksi` = no_trans
      ); IF unit = "PCS" THEN

现在它正在工作,谢谢大家!