2013-10-03 22 views
5

Tôi đang xây dựng Ứng dụng khoảng không quảng cáo bằng PhoneGap.Ở rằng tôi có một mô-đun CỔ PHẦN để quản lý chứng khoán.Chèn hoặc Thay thế bằng tổng giá trị cũ

Cổ Table Query

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

INSERT OR REPLACE Query

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

Có không phải là một vấn đề duy nhất với truy vấn này của nó làm việc một cách hoàn hảo, nhưng tôi muốn cập nhật SUM của giá trị cũ VỚI MỘT MỚI.

Ví dụ:

pro_id quantity 
1  5 

này được kỷ lục hiện tại vì vậy bây giờ khi tôi sẽ cháy trên truy vấn cho giao dịch mới có 3 số lượng sau đó quantity should be (5 (old) + 3 (new)) = 8.

Vì vậy, sau updateing kỷ lục nó trông như thế nào.

pro_id quantity 
1  8 

Làm cách nào tôi có thể giải quyết ý tưởng này. hoặc cho tôi biết nếu tôi đang đi sai đường. Cảm ơn.

+0

Tôi khuyên bạn nên INSERT hồ sơ mới không tồn tại trong bảng đầu tiên bằng cách kiểm tra chúng trước khi chèn. Sau đó, UPDATE những cái hiện có bằng cách tăng/giảm số lượng của chúng thông qua "quantity = quantity + '5'". – Ouscux

Trả lời

6

Thực ra tôi không phải là người sáng lập thực sự của giải pháp này. Anh hùng thực sự là Daverandom với sự giúp đỡ của anh ta tôi đã giải quyết vấn đề của tôi.

Anh ấy đề nghị tôi giải pháp follow this và điều đó thực sự hữu ích khi tìm giải pháp của tôi.

truy vấn Cũ hơn trông giống như

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

New Query trông giống như

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

Cập nhật:

Nếu bạn sẽ không thêm WHERE pro_id="val" trong CẬP NHẬT sau đó nó sẽ cập nhật tất cả các hàng . Vì vậy, điều đó sẽ tạo ra kết quả phù hợp.

Khi truy vấn người dùng lửa lần đầu tiên sau đó số lượng sẽ là 2 và khi bạn bắn cùng một truy vấn lần thứ hai nó sẽ 4.

Vì vậy, Chúng tôi có thể thay đổi giá trị đó trong mỗi lần cập nhật.

Một lần nữa nhờ vào Daverandom.

2

Trong SQLite, bạn có thể tạo ra một kích hoạt để xử lý chức năng như vậy:

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; 

Từ giờ trở đi, bất cứ khi nào bạn cố gắng để chèn một hiện pro_id, cập nhật trên quantity được thực hiện để thay thế. Mệnh đề xung đột (OR REPLACE) không quan trọng vì trình kích hoạt sẽ xử lý nó (cho pro_id).

Tuy nhiên, một, lần này mà không gây nên, sử dụng giải pháp tuyên bố duy nhất:

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; 

Chỉ cần thay thế 123 với mới prod_id9999 với mới quantity.

+0

Cảm ơn nhưng câu trả lời được đăng bởi tôi với sự giúp đỡ của Daverandom đang hoạt động hoàn hảo :) +1 –

Các vấn đề liên quan