Postgresql 创建触发器查询时出现语法错误
我有以下代码,用于在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
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'是的,对不起,我是那个意思。在这个功能的结果,我得到10个惊喜后,更新视图的任何方式。。。
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...