2016-06-16 25 views
2

我試圖從表中刪除單個行,它可以觸發並將所有相關信息(多行)複製到第三個表中。我下面建造一個簡單的例子:使用單個SQL觸發器從單個刪除複製多行?


表:學生

NAME  AGE 
----- ------ 
Mark  19 
Jim  21 
Scott 22 

表:牌號

NAME  GRADE 
----- ------ 
Mark  95 
Mark  98 
Jim  60 
Scott 100 
Scott 79 
Scott 77 

表:備份(我什麼觸發完成)

SQL> DELETE FROM STUDENTS WHERE NAME='MARK'; 
SQL> SELECT * FROM BACKUP; 

NAME  AGE  GRADE 
----- ------ ------ 
Mark  19  95 
Mark  19  98 

在上例中,刪除行「Mark ... 30」也會刪除第二個表中的「Mark」作爲名稱的兩行。我不知道如何做到這一點。我能夠編譯觸發器代碼,但調用「DELETE FROM STUDENTS WHERE NAME ='MARK'」返回太多行錯誤。下面是我的代碼

我的代碼

CREATE OR REPLACE TRIGGER save_the_grades 
BEFORE DELETE 
ON grades 
FOR EACH ROW 

DECLARE 
    v_grade number(3); 
BEGIN 

SELECT grade INTO v_grade FROM Grades WHERE Names=:old.name; 

INSERT INTO backup 
(name, age, grade) 
VALUES 
(:old.name, :old.age, v_grade); 
END; 
+0

如果你想要保持刪除記錄周圍,是不是一個更好的系統是有一個標誌的錶行和一個視圖,只返回不是'標記爲已刪除。 –

+0

如果將StackOverflow的暴怒帶給我的話,這與需要觸發器的作業問題有關。然而,這個問題遠遠大於這個問題。我只是想知道如何去做。 – Noah

+1

您已經爲MySQL,SQL Server和Oracle添加了標籤。這些是三種不同的數據庫,具有三種不同的過程語言擴展和三種非常不同的語法集來定義觸發器。我從剩下的問題中猜測出你正在使用Oracle,因此應該刪除MySQL和SQL Server標記。 –

回答

0

你得到了太多的行,因爲你犯了一個選擇成接受只有一行的結果。嘗試結合選擇和插入