2014-01-09 41 views
0

創建觸發器很困難。這是我的代碼。我創建了2個表格:在Oracle中創建觸發器時出錯

CREATE TABLE client_table 
    (
    clientid NUMBER(6) PRIMARY KEY, 
    lastname varchar2(50) NOT NULL, 
    firstname varchar2(50) NOT NULL, 
    password varchar2(20) NOT NULL, 
    email varchar2(100) NOT NULL, 
    phoneno NUMBER(12) NOT NULL, 
    zipcode NUMBER(6) NOT NULL , 
    street varchar2(60) NOT NULL, 
    CHECK (email LIKE '%@%.%') 
); 

CREATE TABLE location_table 
(
    zipcode NUMBER(6) PRIMARY KEY, 
    country varchar2(100) NOT NULL, 
    region varchar2(60) NOT NULL, 
    town varchar2(60) NOT NULL 
); 

我添加了一個約束,以便client_table中的zipcode是一個外鍵。

ALTER TABLE client_table 
ADD CONSTRAINT clirefzip 
    FOREIGN KEY(zipcode) REFERENCES location_table(zipcode) 
    DEFERRABLE INITIALLY DEFERRED; 

現在我想添加一個觸發器,這樣,當我刪除location_table的位置,它會刪除client_table所有客戶端,具有相同郵編爲刪除的位置。所以我嘗試這樣的:

CREATE OR REPLACE TRIGGER location_delete 
AFTER DELETE ON location_table 
REFERENCING OLD AS old_buffer 
FOR EACH ROW 
DELETE FROM client_table WHERE zipcode = old_buffer.zipcode; 

不幸的是它不起作用。

+1

「* does not work *」既不是可接受的錯誤描述也不是有效的Oracle錯誤消息。但是,爲什麼你不把外鍵聲明爲「在刪除級聯」? –

+0

所以我要做的就是在我的約束中寫入如下內容:外鍵(zipcode)在刪除級聯上引用location_table(zipcode)? – Zan

+0

Thx很多人。它工作得很好。它簡單而有效。對不起,我的雜亂的帖子。我是新手。下次發佈問題時,我會嘗試更具體。 – Zan

回答

0
Hi there has some syntactical errors in your code. I hope this code works . Thanks  

    CREATE OR REPLACE TRIGGER location_delete 
    AFTER DELETE ON location_table 
    --REFERENCING OLD AS old_buffer 
    FOR EACH ROW 
    begin 
    DELETE FROM client_table WHERE zipcode = zipcode; 
    end location_trigger; 
+0

請勿嘗試此操作! 「郵編=郵編」總是評估爲真!你要刪除整個子表(或至少所有的郵編不是空的記錄) –

+0

它應該已經刪除從client_table WHERE zipcode =:OLD.zipcode; –