2016-02-12 102 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