我正在尝试在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))
菜单存储数据,例如:
ProductID | Description | Code | Price_Pence
----------------------------------------------
1 | Egg Salad | ESL | 200
2 | Ham Salad | HSL | 200
3 | Cheese Sandwich | CSD | 150
etc.
OrderItems存储如下数据:
OrderItemsID | ProductID | Quantity
------------------------------------
1 | 3 | 1
2 | 2 | 1
etc.
我希望能够在我可以更改产品价格的地方使用它,例如如果我想奶酪三明治= 200,我可以更新。如果我之前订单现在的价格不正确,那么我需要有一个触发器,它会在Menu中插入一个新行,这将自动为该行提供一个新的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 :(得分:0)
新产品ID值是在新插入的行中分配的值。在SQL中,您可以使用last_insert_rowid() function:
来阅读它BEGIN
INSERT INTO Menu ...;
UPDATE OrderItems
SET ProductID = last_insert_rowid()
WHERE ProductID = OLD.ProductID;
END;