【问题标题】:Comparing values from different tables using triggers使用触发器比较来自不同表的值
【发布时间】:2017-11-25 15:07:18
【问题描述】:

所以问题是我有两个表,在插入或更新一个表上的值之前,我必须检查另一个表是否不包含我尝试插入/更新的新值,如下所示:

CREATE TABLE categoriasimples(
    nome varchar(64) PRIMARY KEY REFERENCES categoria(nome) ON DELETE CASCADE);

CREATE TABLE supercategoria(
    nome varchar(64) PRIMARY KEY REFERENCES categoria(nome) ON DELETE CASCADE);

CREATE FUNCTION check_categoria_type_sup() RETURNS trigger AS $check_categoria_type_sup$
    BEGIN
        IF nome FROM categoriasimples WHERE (NEW.nome = CategoriaSimples.nome) IS NOT NULL THEN
            RAISE EXCEPTION 'Uma categoria nao pode ser super e simples ao mesmo tempo!';
        END IF;

        RETURN NEW;
    END;
$check_categoria_type_sup$ LANGUAGE plpgsql;

CREATE TRIGGER check_categoria_type_sup BEFORE INSERT OR UPDATE ON supercategoria FOR EACH ROW EXECUTE PROCEDURE check_categoria_type_sup();

CREATE FUNCTION check_categoria_type_simp() RETURNS trigger AS $check_categoria_type_simp$
    BEGIN
        IF nome FROM supercategoria WHERE (supercategoria.nome = NEW.nome) IS NOT NULL THEN
            RAISE EXCEPTION 'Uma categoria nao pode ser simples e super ao mesmo tempo!';
        END IF;

        RETURN NEW;
    END;
$check_categoria_type_simp$ LANGUAGE plpgsql;

CREATE TRIGGER check_categoria_type_simp BEFORE INSERT OR UPDATE ON categoriasimples FOR EACH ROW EXECUTE PROCEDURE check_categoria_type_simp();

我可以将值插入到一个表中,但如果我尝试在另一个表中插入它会显示:

错误:布尔类型的输入语法无效:“bife”(另一个表中的值) 上下文:PL/pgSQL 函数 check_categoria_type_sup() 第 3 行,位于 IF SQL 状态:22P02

【问题讨论】:

    标签: sql postgresql database-trigger


    【解决方案1】:

    评论太长了。

    我很确定你可以在不使用触发器的情况下做你想做的事。我建议你调查一下 Postgres 支持表的 inheritance

    您可以只在父表上定义一个唯一约束,而不必担心试图让两个不同的表同步。

    【讨论】:

    • 赞成:建议避免触发。 OP 也可以在同一个语句中使用IF 或者只是放一个WHERE
    • 所以基本上我不能使用触发器来做到这一点,或者我必须避免它们?因为我正在阅读@Gordon Linoff 让我阅读的内容,并且继承不支持唯一约束或外键,这是我表中的两件事。我想要做的就是检查其他表中我试图插入到另一个表中的值
    • @Pmsmm 。 . .除非必要,否则我不喜欢触发器。这个答案提出了一个不基于触发器的替代方案。
    • 非常感谢大家的帮助,那我尽量不使用触发器
    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 2011-12-21
    • 2021-03-13
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2021-10-05
    相关资源
    最近更新 更多