Postgresql 如何使用PostegreSQL中另一个表中的所有记录测试新值?

Postgresql 如何使用PostegreSQL中另一个表中的所有记录测试新值?,postgresql,triggers,plpgsql,Postgresql,Triggers,Plpgsql,我想要一个触发器函数,用于测试另一个表中的另一列中是否只存在一个列的新值 基本上我有一个表:netgeo_cable_test,我想测试插入geom列的新值是否存在于netgeo_point_tech表的geom列中 我想尝试像数组一样的循环,但选择的结果不是数组 我不知道如何才能测试列中的每个记录。请根据需要尝试以下调整: CREATE OR REPLACE FUNCTION insert_records_netgeo_cable_test( _geom text , _fld

我想要一个触发器函数,用于测试另一个表中的另一列中是否只存在一个列的新值

基本上我有一个表:netgeo_cable_test,我想测试插入geom列的新值是否存在于netgeo_point_tech表的geom列中

我想尝试像数组一样的循环,但选择的结果不是数组


我不知道如何才能测试列中的每个记录。

请根据需要尝试以下调整:

CREATE OR REPLACE FUNCTION insert_records_netgeo_cable_test(
    _geom text
    , _fld2 text
    , _fld3 text
)
RETURNS boolean AS
$func$
DECLARE
    /* _testCond int; */
    _sql   text := 'INSERT INTO netgeo_cable_test (geom, fld2, fld3)
        VALUES($1, $2, $3)'; -- PREPARED SQL
BEGIN
    /* SELECT COUNT(*) INTO _testCond FROM netgeo_point_tech WHERE geom = $1;
    ### IF _testCond == 0 THEN */
    IF EXISTS (SELECT 1 FROM netgeo_point_tech WHERE geom = $1) THEN
        EXECUTE _sql
            USING   $1, $2, $3; -- EXECUTE PREPARED SQL Wt VALUES
        RETURN true;  -- boolean!
    ELSE
        RETURN FALSE; -- boolean for failed test Cond
    END IF;
 RAISE NOTICE 'sql: %', _sql;

 END
 $func$  LANGUAGE plpgsql;

希望这有助于了解更多信息,请参见以下内容[

是否要查看它是否存在?如果只是想确保它存在,则应使用外键。您肯定不想使用循环。@Jeremy我想测试它是否不存在您的问题与[问题。唯一要包括的是一行,如_testCond:int=SELECT COUNT*,来自netgeo\u point\u tech,其中geom=$1,我假设第一个参数是geom。然后,在之前,如果_testCond==0,执行包含在行中的sql,然后使用$1执行_sql,…..n END IF;进行计数是没有效率的,因为它将检查整个表/索引。实际上,您并不关心计数,只关心记录是否存在。您希望查询在找到单个记录后立即返回。因此,如果存在,您应该这样做选择1 FROM…,WHERE…,THEN…@404 updated:在注释中保留这两个选项如果表的大小很小,两个选项都可以使用。@阿弥陀佛如果我理解这个函数,它会根据值是否存在返回true或false,对吗?我不理解执行部分,它是做什么的?@LyessD the EXECUTE[命令用于执行一个准备好的语句。sql变量预编译sql语句,然后通过使用关键字替换值来执行它。因此,它将返回true,以便您可以在代码中处理。此外,如果出现错误,它将在打印错误sql时引发错误。因此,-我们传递所有必需字段作为参数的值-我们预处理SQL语句-我们测试插入所需的条件,如果为true-执行预处理的SQL-如果错误,则发出通知更新上述代码,现在发送true和false,并添加了更多注释,以便您更好地理解。希望这有帮助