函数是 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
我想创建一个带有关系触发器的函数。触发器应该不会让一个关系内的数据集超过 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