2017-03-09 3 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 원이라면 그걸 업데이트 할 수 있어요. 만약 이전 주문에 잘못된 가격이 적용 되었다면 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의 이전 항목을 변경해야합니다.

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 

이 내가 필요한 메뉴에 새 항목을 삽입합니다

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

현재 나는이 트리거를 가지고있다. 그러나 모든 주문에 대해 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

관련 문제