5

PhoneGap.In を使用して在庫アプリケーションを構築しています。在庫管理用のモジュール STOCK が 1 つあります。

ストック テーブル クエリ

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

挿入または置換クエリ

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

このクエリが完全に機能するという単一の問題はありませんが、OLD VALUES の SUM を NEW ONE で更新したいと考えています。

例:

pro_id quantity   
1       5

これは既存のレコードであるため、数量が 3 の新しいトランザクションに対して上記のクエリを実行すると、quantity should be (5 (old) + 3 (new) ) = 8.

したがって、レコードを更新した後は次のようになります。

pro_id quantity   
1       8

どうすればこれを解決できますか。または、私が間違っている場合はお知らせください。ありがとう。

4

2 に答える 2

7

実際、私はこのソリューションの本当の創設者ではありません。本当のヒーローはDaverandomで、彼の助けを借りて問題を解決しました。

彼は私にこの解決策に従うことを提案しており、それは私の解決策を見つけるのに非常に役立ちます.

古いクエリは次のようになります

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

新しいクエリは次のようになります

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

アップデート:

UPDATE を追加しない場合はWHERE pro_id="val"、すべての行が UPDATE されます。そのため、適切な結果が生成されます。

ユーザーが最初にクエリを起動すると数量は 2 になり、同じクエリを 2 回目に起動すると数量は 4 になります。

そのため、更新ごとにその値を変更できます。

再び Daverandom に感謝します。

于 2013-10-03T11:06:54.367 に答える
2

SQLite では、そのような機能を処理するトリガーを作成できます。

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) は、トリガーによって処理されるため ( for ) 重要ではありません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;

123newprod_id9999newに置き換えるだけquantityです。

于 2013-10-03T12:42:43.117 に答える