函数是 SQL

Function is SQL

我想创建一个带有关系触发器的函数。触发器应该不会让一个关系内的数据集超过 3 个。不管关系中有多少数据集,我创建的函数都会以某种方式出现异常。

这是我的函数代码。所以它返回 Null 显然足以引发异常。我该怎么做才能在少于 3 个时不引发异常?

create function myFunction() returns trigger as $$
  Begin
    if exists(
            select case when count(*)>3 then count(*) end
            from person
            )
        then raise exception 'Just 3 Datasets allowed';
    End if;
return null;
End;
$$ language plpgsql 

这个结构:

if exists (select case when count(*)>3 then count(*) end
           from person
          )

始终计算为 true。为什么? exists 计算子查询 return 的行数。一个聚合查询,没有 group by always return 一行。如果基础 table 中没有行,则 returned 值通常为 NULL.

请注意,exists 不关心 return 行上的 列值 。因此,具有 NULL 值的行与具有其他值的行一样“存在”。事实上,Postgres 让你 return 根本没有专栏! (虽然我个人觉得这种语法有点笨拙。)

我怀疑你打算:

if (select count(*)
    from person
   ) > 3