2013-10-03 15 views
5

私は在庫管理のために1つのモジュールストックを持っているPhoneGap.Inを使用して在庫アプリケーションを構築しています。古い値の合計で挿入または置換

証券表クエリ

CREATE TABLE STOCK (
    sto_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    pro_id INTEGER FOREIGNKEY REFERENCES PRODUCT(pro_id) UNIQUE, 
    quantity TEXT 
) 

INSERT OR REPLACEクエリ

INSERT OR REPLACE INTO STOCK (pro_id,quantity) VALUES ("1","5"); 

単一の問題は、このクエリではありませんで、その完璧に働いたが、私はOLD値の合計を更新したいです新しいものと一緒に。

例:私はレコードをupdateingした後、それがどのように見える、その後quantity should be (5 (old) + 3 (new)) = 8.

を3量を持っている新しいトランザクションのためのクエリの上に発射する時期

pro_id quantity 
1  5 

これが今のレコードを既存ています。

pro_id quantity 
1  8 

どうすればこの問題を解決できますか?または私が間違っているかどうか知らせてください。おかげさまで

+0

挿入する前にまずテーブルに存在しない新しいレコードをINSERTすることをお勧めします。次に、既存のものを "quantity = quantity + '5'"で増減して更新します。 – Ouscux

答えて

6

実際に私はこの解決策の本当の創始者ではありません。本当のヒーローは彼の助けを借りてDaverandomです。私は私の問題を解決しました。

彼は私にfollow this解決策を提案しており、それは私の解決策を見つけるのに本当に役立ちます。

クエリは新しいクエリが

INSERT OR IGNORE INTO STOCK (pro_id,quantity) VALUES (1,0) ; 
UPDATE STOCK SET quantity = quantity + 2 WHERE pro_id=1; 

などの更新のように見えます

INSERT OR REPLACE INTO STOCK (pro_id,quantity) VALUES ("1","5"); 

としてのように見える古い:あなたは、それはすべての行を更新しますUPDATEでWHERE pro_id="val"を追加しない場合

。 これにより適切な結果が得られます。

すると、ユーザ火災の問い合わせ初めてその添加量が2になり、あなたが同じクエリ二度目を発射するとき、それは4

だから、私たちはそれぞれのアップデートでその値を変更することができます。

Daverandomに感謝します。 SQLiteので

2

、あなたがこのような機能を処理するためのトリガーを作成することができます。

CREATE TRIGGER t1 BEFORE INSERT ON STOCK WHEN NEW.pro_id IN (SELECT pro_id FROM STOCK) BEGIN 
    UPDATE STOCK SET quantity=COALESCE(NEW.quantity, 0)+COALESCE((SELECT quantity FROM STOCK WHERE pro_id=NEW.pro_id), 0) WHERE pro_id=NEW.pro_id; 
    SELECT RAISE(IGNORE); -- Ignore INSERT 
END; 

今からあなたは、既存のpro_idを挿入しようとするたびに、quantityの更新が代わりに実行されます。競合条項(OR REPLACE)は、トリガーがそれを処理するので問題ではありません(pro_id)。単一の文のソリューションを使用して

さらに別の

、トリガなしのこの時間は、:

INSERT OR REPLACE STOCK(pro_id, quantity) 
    SELECT npro_id, COALESCE(nqty, 0)+COALESCE(quantity,0) FROM (
     SELECT 123 AS npro_id, 9999 AS nqty 
    ) LEFT JOIN STOCK ON npro_id=pro_id; 

ただ、新しいquantityで新しいprod_id9999123を交換してください。

+0

ありがとう、しかしDaverandomの助けを借りて私が投稿した回答は完璧に働いています:) +1 –

関連する問題