2017-04-23 12 views
1

讓我們說這是我們的價格SQL觸發器,如何將值複製從一列到另一在更新第一個

curP | oldP | ID 
+------------------+ 
|210 | null | 1 | 
+------------------+ 

的表我想創建一個觸發器,當我做:

UPDATE PRICES 
SET curP = 300 
WHERE ID = 1; 

這將顯示我們的表是這樣的:

curP | oldP | ID 
+------------------+ 
|300 | 210 | 1 | 
+------------------+ 

如何將這個觸發樣子呢?我只想將舊值複製到新列中。請幫助(我在甲骨文工作) *編輯:每當我試圖使觸發,將給予該表變異錯誤...

回答

2

您可以用BEFORE UPDATE行級TRIGGER做到這一點。這裏有一個例子:

首先創建表:

CREATE TABLE PRICES(CURP NUMBER, OLDP NUMBER, ID NUMBER); 

然後創建觸發器:

CREATE OR REPLACE TRIGGER CURP_TO_OLDP 
BEFORE UPDATE ON PRICES 
    FOR EACH ROW 
    BEGIN 
    :NEW.OLDP := :OLD.CURP; 
    END; 
/

然後對其進行測試。首先添加一些初始數據:

INSERT INTO PRICES VALUES (100,NULL,1); 
INSERT INTO PRICES VALUES (200,NULL,2); 

SELECT * FROM PRICES ORDER BY 3; 

CURP OLDP ID 
100   1 
200   2 

然後更新:

UPDATE PRICES SET CURP = 1000; 

SELECT * FROM PRICES ORDER BY 3; 

CURP OLDP ID 
1000 100 1 
1000 200 2 
+0

如果我只想更新例如具有ID 1的行而不是具有ID 2的行,會這樣工作嗎? – Kiki

+0

@kiki。 。 。這回答你的問題。你可以添加一個特定於'id'的'if'語句,但是如果你有另一個問題,你應該接受這個答案並且詢問另一個問題。 –

+0

謝謝你的回答,它只適用於一個ID而沒有任何if語句。 :d – Kiki

0

如果你有從那裏你更新的代碼一點,你可以做到這一點的更新語句不觸發

update prices set oldp = curp, curp = newvalue where id = yourid

相關問題