级联DELETE到另一个表的行。

问题描述 投票:0回答:1
CREATE OR REPLACE FUNCTION removerCapitulo()
  RETURNS trigger AS
$BODY$
declare counter int;
BEGIN
select count(*) into counter FROM capitulos where id_capitulo = NEW.id_livro;
if (counter >1)
THEN
DELETE FROM capitulos WHERE id_capitulo = NEW.id_livro;
END IF;
    RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER removerCapitulo_trigger
  BEFORE DELETE
  ON livros
  FOR EACH ROW
  EXECUTE PROCEDURE  removerCapitulo();

 DELETE FROM public.livros
    WHERE id_livro = 30

当我试图删除一个 "lvro "与id= id_capitulo我想删除 "lvro "和 "capitulo",但是当删除一个 "lvro "它返回成功,但它不删除 "lvro "或 "capitulo"... ... 我试图把一个计数器的情况下,有一个以上的 "capitulo "在表中的ID等于ID,我把当我要求删除它删除。

sql postgresql
1个回答
1
投票

当我尝试删除一个id=id_capitulo的 "livro "时,我想删除 "livro "和 "capitulo"。

你不需要一个触发器。相反,你可以在外键中加入 on delete cascade 选项。

create table capitulos (
    ...              -- other table columns
    id_capitulo int 
        references livros(id_livro)
        on delete cascade
);

至于你现有的代码: 因为你有一个。delete 触发器,你需要使用伪表态的 old 而非 new 实际上是空的)。

create or replace function remover_capitulo()
returns trigger as
$body$
begin
    delete from capitulos where id_capitulo = old.id_livro;
    return old;
end;
$body$
language plpgsql;

create trigger trg_remover_capitulo
    before delete on livros
    for each row
    execute procedure remover_capitulo();
© www.soinside.com 2019 - 2024. All rights reserved.