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

идеальное решение урегулировать проблему создать после удаления триггера или обновления в: Новичок:

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.

Смежные вопросы