使用触发器比较来自不同表的值

时间:2017-11-25 15:07:19

标签: sql postgresql database-trigger

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

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();

我可以在一个表中插入值,但如果我尝试在另一个表中插入,则表示:

错误:boolean类型的输入语法无效:" bife" (在另一个表中的值) 语境:PL / pgSQL函数check_categoria_type_sup()IF的第3行 SQL状态:22P02

1 个答案:

答案 0 :(得分:1)

评论太长了。

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

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