【问题标题】:Cascade DELETE to row of another table级联删除到另一个表的行
【发布时间】:2020-06-12 22:07:06
【问题描述】:
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

当我尝试删除 id = id_capitulo 的“livro”时,我想删除“livro”和“capitulo”,但是当删除“livro”时它返回成功,但它不会删除“livro”或“capitulo” ...我试图放置一个计数器,以防表中有超过 1 个“capitulo”,其 id 等于我要求删除时输入的 id 删除

【问题讨论】:

    标签: sql postgresql foreign-keys sql-delete database-trigger


    【解决方案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();
    

    【讨论】:

    • 谢谢你的回答,但是我需要按功能来做。
    • @JoseRoberto:为什么?外键约束为您提供几乎没有代码的相同功能。无论如何,我用触发解决方案更新了我的答案。
    • 无法删除这本书,因为那里有一个章节 ERROR: update or delete on table "livros" violates foreign key constraint "livro_capitulo_fk" on table "capitulos" DETAIL: Key (id_livro)=(30) is still referenced from table "capitulos。 ...我可以用“级联”做点什么?
    • @JoseRoberto:如果您已经设置了外键,请使用 on delete cascade 选项...
    猜你喜欢
    • 2011-06-27
    • 2011-10-12
    • 2020-06-14
    • 1970-01-01
    • 2017-08-10
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多