无法更新视图?

sri*_*inu 6 postgresql sql-view sql-update

我的网站是使用在Ubuntu 11.10上的Postgresql 8.3服务器上运行的Drupal 6开发的.另外webmin版本1.590.

现在我想更新表中的记录,但是当我运行时:

UPDATE uac_institution_view SET status = '2' WHERE nid = '9950'
Run Code Online (Sandbox Code Playgroud)

它给我一个错误,如:

无法执行SQL:SQL UPDATE uac_institution_view SET status ='2'WHERERE nid ='9950'失败:错误:无法更新视图提示:您需要一个无条件的ON UPDATE DO INSTEAD规则.

问题是只有SELECT查询才有效.UPDATE,INSERTDELETE命令不工作; 他们因上述错误而失败.

这是一个问题吗?语法错误?别的什么?

Cra*_*ger 20

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

使用"无条件ON UPDATE DO INSTEAD规则"(如您所粘贴的错误消息)或最好使用视图触发器在PostgreSQL 9.1及更高版本上执行此操作.我在上一篇文章的回答中提供了所有内容的链接,但这里有更多信息:

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

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

  • 您可能想要添加,因为9.3个简单视图可以自动更新:http://www.postgresql.org/docs/current/static/sql-createview.html#SQL-CREATEVIEW-UPDATABLE-VIEWS (4认同)

Jef*_*nch 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/


hap*_*dha 6

我使用的是 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;
Run Code Online (Sandbox Code Playgroud)

将输出 Foo 和 Bar