5

我正在使用 PhoneGap 构建库存应用程序。我有一个模块 STOCK 用于库存管理。

库存表查询

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");

这个查询没有一个问题可以完美运行,但我想用新的值更新旧值的总和。

例子:

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;

更新:

如果您不添加WHERE pro_id="val"UPDATE 那么它将更新所有行。这样就会产生适当的结果。

当用户第一次触发查询时,数量将为 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;

只需123用 newprod_id9999new替换quantity

于 2013-10-03T12:42:43.117 回答