插入或替换旧值的总和

时间:2013-10-03 10:11:55

标签: sql sqlite cordova

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

股票表格查询

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。

示例:

pro_id quantity   
1       5

这是现有的记录,所以现在我将查询新的交易,其中有3个数量然后quantity should be (5 (old) + 3 (new) ) = 8.

因此,在更新记录后,它看起来像。

pro_id quantity   
1       8

我怎么能解决这个问题。或者让我知道我是否走错路。 谢谢。

2 个答案:

答案 0 :(得分:7)

实际上我并不是这个解决方案的真正创始人。真正的英雄是Daverandom在他的帮助下我已经解决了我的问题。

他建议我follow this解决方案,这对找到我的解决方案非常有帮助。

旧查询看起来像

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",那么它将更新所有行。 这将产生适当的结果。

当用户首次点击查询时,数量将为2,当您第二次触发相同的查询时,它将为4。

因此,我们可以在每次更新中更改该值。

再次感谢Daverandom。

答案 1 :(得分: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)无关紧要,因为触发器会处理它(对于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替换为新的prod_id,将9999替换为新的quantity