首页 > 解决方案 > 错误:SQL 插入命令中不存在列“exists”

问题描述

我正在尝试了解一下触发器,我想制作一个触发器来检查我是否将新行添加到由(城市,偶数类型,伤亡)组成的预测表中

如果我的新行伤亡人数高于城市人口,我将得到一个错误,并且新行不会插入到我的预测表中

到目前为止,这是我的代码

创建我的触发器

create trigger T1
before insert on prediction
for each row
execute procedure trigf1();

创建 trigf1();

create or replace function trigf1() returns trigger as $$
declare bad_population record;
Begin
  select city.cname INTO bad_population
  from city
  where new.casualties>city.population and new.cname=city.cname;

  if exists bad_population then begin 
    raise notice 'bad population-more casualites than city population';
    return null;
  end;
  else
    return new;
  end if;
end;
$$language plpgsql;

当我尝试输入这些值时出现错误

insert into prediction values ('Naples', 'Volcano', 3056)

这就是错误

ERROR:  column "exists" does not exist
LINE 1: SELECT exists bad_population
               ^
QUERY:  SELECT exists bad_population
CONTEXT:  PL/pgSQL function trigf1() line 7 at IF
SQL state: 42703

我的城市表

我的城市表

我的预测表

我的预测表

希望您能帮助理解错误并解决我的问题

标签: postgresqlplpgsqldatabase-trigger

解决方案


使用FOUNDIF FOUND THEN

如果您的查询有任何结果,FOUND则为 TRUE,否则为 FALSE。

EXISTS接受一个返回 TRUE 或 FALSE 的查询,具体取决于查询是否返回任何结果,例如IF EXISTS (SELECT 1 FROM table WHERE condition) THEN...

因此,主要区别是FOUND在您的查询/语句返回后设置的变量,并根据您的 SELECT 语句是否返回任何结果,或者您的 UPDATE/DELETE 语句是否影响任何行而设置为 TRUE/FALSE。

EXISTS另一方面是一个运算符,它根据您在该时间点提供给它的查询返回 TRUE/FALSE。


推荐阅读