Postgresql 创建触发器查询时出现语法错误

Postgresql 创建触发器查询时出现语法错误,postgresql,triggers,syntax-error,Postgresql,Triggers,Syntax Error,我有以下代码,用于在postgresql数据库中为视图添加触发器 CREATE OR REPLACE FUNCTION changeCityProc() RETURNS TRIGGER AS $changeCity$ BEGIN UPDATE vvs.tb_company SET city = "LAL" WHERE cardpresso.cardinfo.tb_company_city = vvs.tb_company.city; RETURN null; EN

我有以下代码,用于在postgresql数据库中为视图添加触发器

CREATE OR REPLACE FUNCTION changeCityProc() RETURNS TRIGGER AS $changeCity$
    BEGIN
    UPDATE vvs.tb_company SET city = "LAL" WHERE cardpresso.cardinfo.tb_company_city = vvs.tb_company.city;
    RETURN null;
    END;
$changeCity$ LANGUAGE plpgsql;




CREATE TRIGGER mytrigger
    INSTEAD OF UPDATE ON
      cardpresso.cardinfo FOR EACH ROW EXECUTE PROCEDURE changeCityProc();   

pgAdmin说“语法错误在或接近”而不是“

让我们简化一下。首先,两个模式

CREATE SCHEMA cardpresso;
CREATE SCHEMA vvs;
接下来是最简单的表

CREATE TABLE vvs.tb_company
(
  city character varying(25)
);
INSERT INTO vvs.tb_company VALUES ('foo');
和一个相当无用的观点

CREATE VIEW cardpresso.cardinfo AS
  SELECT 'test' as tb_company_city UNION ALL
  SELECT 'Orem' UNION ALL
  SELECT 'Wibble'
;
简化函数警告:这将破坏性地更新表格。如果您将此函数中的内容复制到面向生产的内容中,请小心

CREATE OR REPLACE FUNCTION changecityproc()
  RETURNS trigger AS
$BODY$
    BEGIN
    UPDATE vvs.tb_company SET city = 'bar';
    RETURN null;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
最后是触发器

CREATE TRIGGER mytrigger
  INSTEAD OF UPDATE
  ON cardpresso.cardinfo
  FOR EACH ROW
  EXECUTE PROCEDURE changecityproc();
现在,如果我们更新视图,我们希望vvs.tb_company中的所有行都更改为“bar”

select * from vvs.tb_company;
我不确定您想要该语句做什么,但它在PostgreSQL中无效,不管“LAL”应该是列名还是字符串文字。作为字符串文字'LAL',它将引发错误

ERROR: missing FROM-clause entry for table "cardinfo" LINE 2: WHERE cardpresso.cardinfo.tb_company_city = vvs.tb_compa... 错误:表“cardinfo”的子句条目中缺少 第2行:其中cardpresso.cardinfo.tb_company\u city=vvs.tb_compa。。。
正确的语法是
而不是
,但我希望错误出现在
更新
而不是
而不是
。也许文档可以帮上一点忙:这里有代替。发布代码时遗漏了它,请更新代码以与错误完全匹配。表中是否有列
“LAL”
?如果没有,那么最好对字符串文字使用单引号。非常感谢,我有一个小问题:我必须添加Where OLD.cty='someconstantvalue'来只更改那些具有someconstantvalue的人,所以我也必须为每一行进行更改?请告诉“如果是”怎么办:)不,只要您仍在使用“而不是”触发器,就不需要将每一行的每个语句都更改为。在尝试在触发器函数中使用SQL update语句之前,请在SQL窗口(psql、pgAdmin等)中测试SQL update语句。创建触发器函数时,PostgreSQL不会尝试确定SQL语句是否有效;更新vvs.tb_company SET city='superprice'where OLD.city='foo';在表中,我得到了5个美食城市和5个酒吧城市,在触发工作后,我得到了10个惊喜城市,当我想要5个惊喜和5个美食…我该怎么做?如果你想保留你的5个美食城市,你不应该使用
where OLD.city='foo'
。但在任何情况下,update语句都不应该将所有值都设置为“惊奇”。听起来你想做的事情更像是更新vvs.tb_company SET city='shopping'where OLD.city='bar'update cardpresso.cardinfo set tb_company_city = 'wibble'; select * from vvs.tb_company; city -- bar
UPDATE vvs.tb_company SET city = "LAL" 
WHERE cardpresso.cardinfo.tb_company_city = vvs.tb_company.city;
ERROR: missing FROM-clause entry for table "cardinfo" LINE 2: WHERE cardpresso.cardinfo.tb_company_city = vvs.tb_compa...