2013-10-03 38 views
5

我正在使用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"); 

没有一个单一的问题与此查询其完美的工作,但我想更新旧值之和与新的一个。

例子:

pro_id quantity 
1  5 

这是现有的记录,因此现在,当我将触发上述查询新的交易具有3量则quantity should be (5 (old) + 3 (new)) = 8.

所以updateing记录后,它看起来像。

pro_id quantity 
1  8 

我该如何解决这个问题。或者让我知道我是否在错误的方式。 谢谢。

+0

我建议你在插入之前通过检查它们来插入表中不存在的新记录。然后通过增加/减少金额通过“数量=数量+'5'”更新现有的数量。 – Ouscux

回答

6

其实我不是这个解决方案的真正创始人。在他的帮助下,真正的英雄是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; 

更新:

如果您不会更新增加WHERE pro_id="val"那么将更新所有行。 这样会产生合适的结果。

当用户查询火第一次那么数量为2,当你火相同的查询第二次将4

所以,我们可以改变在每次更新该值。

再次感谢Daverandom。

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; 

只是新prod_id9999quantity取代123

+0

谢谢,但我在Daverandom的帮助下发布的答案完美无缺:) +1 –