SQLITE触发器更新使用外键的数据

时间:2017-03-09 11:12:50

标签: sql database sqlite triggers foreign-keys

我正在尝试在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。

1 个答案:

答案 0 :(得分:0)

新产品ID值是在新插入的行中分配的值。在SQL中,您可以使用last_insert_rowid() function

来阅读它
BEGIN
  INSERT INTO Menu ...;    

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