我试图在插入之前用触发器更新2列,但是我有意想不到的结果。我插入一些数据,最后2列将自动插入值,这是我的第一次尝试
见?即使我设置了一些触发器和函数来自动填充列,最后2列也为null。这是我第二次尝试完全相同的数据
最后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
答案 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
现在它正在工作,谢谢大家!