无法更新视图?

时间:2012-10-31 05:06:04

标签: postgresql sql-update sql-view

我的网站是使用在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个查询才有效。 UPDATEINSERTDELETE命令无效;他们因上述错误而失败。

这是一个问题吗?语法错误?还有别的吗?

3 个答案:

答案 0 :(得分:18)

默认情况下,PostgreSQL视图不可更新。您必须告诉PostgreSQL您希望如何更新视图。

使用“无条件ON UPDATE DO INSTEAD规则”(如您所粘贴的错误消息)或最好使用视图触发器在PostgreSQL 9.1及更高版本上执行此操作。我提供了my answer to your previous post中所有内容的链接,但是这里有更多信息:

在许多情况下,最好将视图保持为只读,只需更新基础表。由于您没有提供视图的定义,因此很难说出实际涉及的内容。使用\d uac_institution_view中运行psql的输出更新您的问题并发表评论说您已经这样做了;也许我可以指出一种直接在基础表上运行更新的方法。

您正在使用一个非常过时的PostgreSQL版本(8.3),因此您无法使用首选的INSTEAD OF触发器方法,您必须使用规则或直接更新基础表。

答案 1 :(得分:6)

仅供参考,在发布涉及规则/触发器的答案后,PostgreSQL 9.3推出了可自动更新的视图。截至2013年6月27日,版本9.3处于测试版2,所以它还不是GA。

以下是一个示例:https://web.archive.org/web/20160322164044/http://michael.otacoo.com/postgresql-2/postgres-9-3-feature-highlight-auto-updatable-views/

答案 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放出来