2016-02-18 4 views
0

есть мои таблицы:PGSQL удалить каскад

create table location (
    nom text primary key, 
    adresse text 
); 
create table groupe (nom text primary key); 
create table groupelocation (
    nomGroupe text references groupe (nom) on delete cascade, 
    nomLocation text references location (nom) on delete cascade, 
    primary key(nomGroupe, nomLocation) 
); 
insert into groupe values('groupe'); 
insert into location values('location', 'là bas'); 
insert into groupelocation values('groupe', 'location'); 

Я хочу, чтобы, когда я удалить somethng в таблице группы, удалить все местоположения, которые связаны, но я не могу найти решение:/ Я пробовал для этого: create rule deletelocations as on delete to groupe do instead (delete from (select location natural join groupelocation where old.nom = nomGroupe));, но это не будет работать:/Не могли бы вы мне помочь?

ответ

0

Postgres не поддерживает поставку операторов CASCADE для DELETE, но имеет поддержку каскадных удалений при создании таблицы.

http://www.postgresql.org/docs/9.0/static/sql-createtable.html

КАСКАД Удалить все строки, ссылки на удаленные строки или обновить значение столбца ссылающейся к новому значению ссылочного столбца, соответственно.

+0

Это так трудно: о там нет каких-либо других решений проще? Как использовать правила? Я не понимаю, почему мое правило не будет работать: s – Kpone

0

Там есть решение, я создал небольшую функцию plpgsql, чтобы исправить эту проблему

CREATE OR REPLACE FUNCTION deletelocation() 
RETURNS text AS $$ 
DECLARE 
    idloc int; 
    curs refcursor; 
BEGIN 
    OPEN curs FOR SELECT location.id FROM location except SELECT location.id FROM location JOIN groupelocation ON location.id = groupelocation.idLocation; 
    LOOP 
     FETCH curs INTO idloc; 
     EXIT WHEN NOT FOUND; 
     DELETE FROM location WHERE id = idloc; 
    END LOOP; 
    CLOSE curs; 
    RETURN ''; 
END; 
$$ language plpgsql; 
Смежные вопросы