我正在使用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
我怎么能解决这个问题。或者让我知道我是否走错路。 谢谢。
答案 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
。