我的网站是使用在Ubuntu 11.10上的Postgresql 8.3服务器上运行的Drupal 6开发的。也是webmin版本1.590。
现在我想更新表中的记录,但是当我运行时:
UPDATE uac_institution_view SET status = '2' WHERE nid = '9950'
它给我一个错误:
执行SQL失败:SQL UPDATE uac_institution_view SET status = '2'WHERE nid ='9950'失败:错误:无法更新视图提示:您 需要一个无条件的ON UPDATE DO INSTEAD规则。
问题是只有SELECT
个查询才有效。 UPDATE
,INSERT
和DELETE
命令无效;他们因上述错误而失败。
这是一个问题吗?语法错误?还有别的吗?
答案 0 :(得分:18)
默认情况下,PostgreSQL视图不可更新。您必须告诉PostgreSQL您希望如何更新视图。
使用“无条件ON UPDATE DO INSTEAD
规则”(如您所粘贴的错误消息)或最好使用视图触发器在PostgreSQL 9.1及更高版本上执行此操作。我提供了my answer to your previous post中所有内容的链接,但是这里有更多信息:
INSTEAD OF
trigger CREATE TRIGGER
CREATE VIEW
在许多情况下,最好将视图保持为只读,只需更新基础表。由于您没有提供视图的定义,因此很难说出实际涉及的内容。使用\d uac_institution_view
中运行psql
的输出更新您的问题并发表评论说您已经这样做了;也许我可以指出一种直接在基础表上运行更新的方法。
您正在使用一个非常过时的PostgreSQL版本(8.3),因此您无法使用首选的INSTEAD OF
触发器方法,您必须使用规则或直接更新基础表。
答案 1 :(得分:6)
仅供参考,在发布涉及规则/触发器的答案后,PostgreSQL 9.3推出了可自动更新的视图。截至2013年6月27日,版本9.3处于测试版2,所以它还不是GA。
答案 2 :(得分:3)
我在postgres 9.5上,默认情况下视图是可更新的。 示例:
CREATE TABLE UP_DATE (id number, name varchar2(29));
insert into up_date values(1, 'Foo');
select * from up_date;
CREATE OR REPLACE VIEW UPDATE
AS
Select
name from up_date;
select * from update;
insert into update values('Bar');
select * from update;
将Foo和Bar放出来