2017-04-03 116 views
0

我想在插入前用觸發器更新2列,但我有意想不到的結果。我插入一些數據,最後2列將自動插入值,這裏我的第一次嘗試 enter image description hereMySQL - 在插入前用函數和觸發器更新列值

請參閱?最後2列是空的,即使我設置了一些觸發器和函數來自動填充這些列。在這裏我恰有相同的數據

第二次嘗試

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 

功能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 

功能hitungTotalHargaPerItem

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

在這個函數中:hitungTotalHargaPerItem set hasil = qty * harga_satuan;如果harga_satuan爲空,我認爲結果將爲空 – Cherif

回答

-1

它似乎我已經在功能set_Harga_Unit誤選擇查詢的基礎上,從線索@Shadow

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爲null,因爲我在空表使用觸發器before inserttbl_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 

現在它工作,謝謝大家!

+0

此解決方案不可持續。在你刪除一條記錄的時候,或者只是在'tbl_transaksi'表中有一個回滾,那麼計數將返回一個不正確的值。另外,如果您有多個用戶試圖同時插入交易詳情,這並不安全。即使您沒有多個用戶同時插入事務詳細信息,「max(id_toko)」也會更有效地獲得最高的事務id。此外,您的解決方案基於我提供的解決方案。所以,接受你自己的答案既不正確也不公平。 – Shadow

0

根本原因SERM的是那臺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變量設置爲空。

這將導致q爲空,從而導致整個計算設置爲空。

在第二種情況下,已經有一條記錄插入到tbl_transaksi_detail表中,因此計算返回一個非空值。但它僅返回正確的值,因爲第1條和第2條記錄的詳細信息完全相同。

我真的不明白,無論如何選擇計算id_toko。如果這是一個交易ID,那麼如果它是自動增量並且剛剛創建了交易記錄,則可以使用last_insert_id(),或者使用max(id_toko)以獲得最高值id_toko(這不是多用戶安全的)。

相關問題