2017-03-09 1 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 

これは私が必要なメニューに新しいエントリを挿入します。しかし、注文ごとにproductIDを変更することなくOrderItemのProductIDを更新するには、私は最も良い方法を確信していません。

+0

WHEREで行をフィルタリングできます。 –

+0

@ CL。 私はどこで使用しようとしましたが、トリガーがBEFORE UPDATEトリガーであるため、OrderItemsテーブルに新しいProductIDを挿入する方法が不明でした。確かに新しいProductIDを見るためにAFTER INSERTなどを使用する必要がありますか? – 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

関連する問題

 関連する問題