2008-11-06 34 views
1

在HSQL數據庫中,我有兩個表(重新命名/重構用於說明目的)與HSL數據庫中的多對多關係。我想被消滅了一切,當我從一個多到多關係一方刪除(不包括查詢表,這是性能的關鍵)SQL刪除級聯幫助(特定問題)

這裏是我的主表:

CREATE TABLE PERSON 
(
    PERSON_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50) 
) 

CREATE TABLE JOB 
(
    JOB_ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    NAME VARCHAR(50) 
) 

這裏是我的連接表:

CREATE TABLE JOB_PERSON 
(
    PERSON_ID INTEGER, 
    JOB_ID INTEGER 
) 

這裏是我的約束:

ALTER TABLE JOB_PERSON ADD 
    CONSTRAINT FK_PERSON_JOB FOREIGN KEY(PERSON_ID) 
    REFERENCES PERSON ON DELETE CASCADE ON UPDATE CASCADE 

ALTER TABLE JOB_PERSON ADD 
    CONSTRAINT FK_JOB_PERSON FOREIGN KEY(JOB_ID) 
    REFERENCES JOB ON DELETE CASCADE ON UPDATE CASCADE 

我基本上WA nt執行此操作:「刪除person_id = 0的人員」,並刪除PERSON,JOB_PERSON和JOB中的所有內容(如果JOB實體將被孤立)(不再在多對多表中引用)

這是可能的不查詢數據庫?當我刪除時,它只會從PERSON和JOB_PERSON中刪除。正如你可能會說,我的SQL技能缺乏。

這裏是虛擬的數據我一直在玩弄:

insert into person values(null,'Arthur'); 
insert into person values(null,'James'); 
insert into job values(null, 'Programmer') 
insert into job values(null, 'Manager') 
insert into job_person values(0,0); 
insert into job_person values(0,1); 
insert into job_person values(1,1); 

所以,如果我進入這兩個語句:

delete from person where person_id=0 
delete from person where person_id=1 

我想擁有的一切在所有3個表中刪除。可能?

回答

4

創建存儲過程在您傳遞ID的地方,然後簡單地按照您需要的順序刪除適當的行。

這樣,您的應用就不會受限於確切的順序,這可能會在未來使用數據庫重新設計進行更改。您還可以獲得額外的獎勵,即存儲過程更快,然後發送一堆查詢。

雖然如果您絕對想要在嘗試刪除該條目時刪除依賴表的方法,那麼必須使用觸發器,但觸發器的規則是,如果可能,請避免使用它們,如果存在其他解決方案,請使用它。所以最終使用Stored Proc是最好的解決方案。