2016-02-12 148 views
2

假設團隊和玩家之間存在多對多的關係。這是由以下的表建模:多對多關係 - 自動刪除孤兒

create table team 
(
    identifier integer primary key 
); 

create table player 
(
    identifier integer primary key 
); 

create table member 
(
    team_identifier integer, 
    player_identifier integer, 

    primary key(team_identifier, player_identifier), 
    foreign key(team_identifier) references team on update cascade on delete cascade, 
    foreign key(player_identifier) references player on update cascade on delete cascade 
); 

假設以下數據:

insert into team values(1); 
insert into team values(2); 

insert into player values(1); 

insert into member values(1, 1); 
insert into member values(2, 1); 

讓我們刪除團隊:

delete from team where identifier = 1; 
delete from team where identifier = 2; 

現在我們有沒有一個團隊的球員。有沒有辦法自動刪除這個播放器?也就是說,當一個團隊的刪除導致一個孤兒玩家時,這個玩家也應該被刪除(但不是相反)。

回答

1

理想的解決方案來解決你的問題 創建後刪除觸發器或更新的membre:

CREATE FUNCTION delete_player_not_in_member() RETURNS trigger AS $delete_player_not_in_member$ 
BEGIN 
    DELETE FROM player WHERE Identifier NOT IN (SELECT player_identifier FROM membre); 
    RETURN OLD; 
END; 
$delete_player_not_in_member$ LANGUAGE plpgsql; 

CREATE TRIGGER delete_player_not_in_member AFTER DELETE OR UPDATE ON member 
FOR EACH ROW EXECUTE PROCEDURE delete_player_not_in_member(); 
0

不一定。如果您計劃在稍後將其添加到團隊中,則該球員仍可以被視爲需要球隊的球員。或者,如果你想要拉動可用的玩家。

但是,你可以嘗試使用

DELETE FROM member WHERE team_identifier = 1 
DELETE FROM member WHERE team_identifier = 2 

DELETE FROM player 
WHERE Identifier NOT IN (SELECT player_identifier FROM member) 
+0

這並不真正回答我的問題。我希望孤兒球員在刪除球隊後自動刪除**。 –

0

最簡單的就是增加一個觸發器,它跟蹤團隊刪除,如下所示:

CREATE TRIGGER drop_orphan_player 
    AFTER DELETE ON team FOR EACH ROW 
    DELETE FROM player 
    WHERE id NOT IN (
    SELECT DISTINCT player_id FROM member 
); 

看到它工作在SQLfiddle