2

私は現在、ある種の在庫システムを作成しています。

アイテムをtbl1保存する場所があります。に、在庫が残っtbl1ている欄があります。qty

tbl1:

id product  qty
1  mouse    10
2  keyboard 15
3  monitor  8

tbl2また、アイテムの発行ですべてのトランザクションを保存するテーブルもあります。この表には がありissued_qtyます。

tbl2

id requested_by product  issued_qty
1  john         mouse    2

私の問題は、行を INSERTtbl2と同時に UPDATE する方法tbl1.qty (tbl1.qty - tbl2.issued_qty)です。

たとえばtbl2、requested_by、product、qty_issued にレコードを挿入するtbl1と、自動的に更新されます。2 (数量) のマウスをジョンに発行するためです。tbl1 のマウスの記録は、自動的に少なくなるはずです。の発行枚数tbl2

私の考えは使用することですTRIGGER

しかし、残念ながら私は成功していません..これで私を助けてくれませんか..

ありがとう。

4

1 に答える 1

8

大量のデータが予想されない場合は、ビューまたはストアド プロシージャを使用してオンザフライで計算し、実際の量を返します。長期的には、頭痛の種を大幅に軽減できます。

ビュー(実際にはビュー)は次のようになります

CREATE VIEW vw_table2_sum AS
SELECT product, SUM(issued_qty) qty
  FROM Table2
 GROUP BY product;

CREATE VIEW vw_table1 AS
SELECT t.id, t.product, t.qty - COALESCE(v.qty, 0) qty
  FROM Table1 t LEFT JOIN vw_table2_sum v
    ON t.product = v.product;

私たちがするとき

SELECT * FROM vw_table1;

取得します

| | ID | 製品 | 数量 |
-----------------------
| | 1 | マウス | 8 | -- 数量は現在のものです
| | 2 | キーボード | 15 |
| | 3 | モニター | 8 |

これがSQLFiddleのデモです

何らかの理由で在庫数量をトリガーで管理したい場合は、次のようになります。

CREATE TRIGGER tg_ai_table2
AFTER INSERT ON table2
FOR EACH ROW
  UPDATE Table1
     SET qty = qty - NEW.issued_qty
   WHERE product = NEW.product;

これがSQLFiddleのデモです

于 2013-08-16T03:03:14.750 に答える