2017-03-09 36 views
0

我想創建SQLite中觸發,將允許用戶編輯欄,將以前的行復製爲新條目,並更改上一所依據的任何數據條目。這些都是相關的表:SQLite觸發器來更新使用數據的外鍵

CREATE TABLE "Menu" 
("ProductID" INTEGER PRIMARY KEY AUTOINCREMENT, 
"Description" VARCHAR, "Code" VARCHAR, "Price_Pence" INTEGER) 

CREATE TABLE "OrderItems" 
("OrderItemsID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , 
"ProductID" INTEGER, "Quantity" INTEGER, 
FOREIGN KEY(ProductID) REFERENCES Menu (ProductID)) 

菜單存儲數據,如:

OrderItemsID | ProductID | Quantity 
------------------------------------ 
1   | 3   | 1 
2   | 2   | 1 

etc. 

我希望把它在那裏我可以改變價格:

ProductID | Description  | Code | Price_Pence 
---------------------------------------------- 
1   | Egg Salad  | ESL |  200 
2   | Ham Salad  | HSL |  200 
3   | Cheese Sandwich | CSD |  150 

etc. 

的OrderItems商店像數據例如,如果我想要奶酪三明治= 200,我可以更新。如果我這樣做,以前的訂單,現在將有不正確的價格,所以我需要有一個觸發器,它會插入新行插入菜單,會自動給該行一個新的ProductID所以在這種情況下,它會變成:

ProductID | Description  | Code | Price_Pence 
---------------------------------------------- 
1   | Egg Salad  | ESL |  200 
2   | Ham Salad  | HSL |  200 
3   | Cheese Sandwich | CSD |  200 
4   | Cheese Sandwich | CSD |  150 

這則需要改變的OrderItems如以前的任何條目

OrderItemsID | ProductID | Quantity 
------------------------------------ 
1   | 4   | 1 
2   | 2   | 1 

目前我有這個觸發:

CREATE TRIGGER "menuArchive" 
BEFORE UPDATE OF Price_Pence ON Menu 

BEGIN 
INSERT INTO Menu 
(Description, Code, Price_Pence) 
VALUES (old.Description, old.Code, old.Price_Pence) 
;END 

這將插入新的進入,我需要菜單。但是,我無法確定更新OrderItems中ProductID的最佳方式,而無需更改每個訂單的productID。

+0

您可以使用WHERE篩選行。 –

+0

@CL。 我試圖用一個WHERE然而,是不確定的觸發器是BEFORE UPDATE觸發器我將如何將新產品ID爲的OrderItems表。當然,您需要使用AFTER INSERT或其他東西來查看新的ProductID? – TomRGarr

+0

觸發器已知道要更新的行的新值。 –

回答

0

新產品ID值是得到了新插入的行中指定的值。在SQL中,您可以使用last_insert_rowid() function來讀取它:

BEGIN 
    INSERT INTO Menu ...;  

    UPDATE OrderItems 
    SET ProductID = last_insert_rowid() 
    WHERE ProductID = OLD.ProductID; 
END; 
+0

謝謝你,完美的作品,我不是知道last_insert_rowid()函數。 – TomRGarr