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,INSERT和DELETE命令不工作; 他们因上述错误而失败.
这是一个问题吗?语法错误?别的什么?
Cra*_*ger 20
默认情况下,PostgreSQL视图不可更新.您必须告诉PostgreSQL您希望如何更新视图.
使用"无条件ON UPDATE DO INSTEAD规则"(如您所粘贴的错误消息)或最好使用视图触发器在PostgreSQL 9.1及更高版本上执行此操作.我在上一篇文章的回答中提供了所有内容的链接,但这里有更多信息:
INSTEAD OF触发器CREATE TRIGGERCREATE VIEW在许多情况下,最好将视图保持为只读,只需更新基础表.由于您没有提供视图的定义,因此很难说出实际涉及的内容.与运行的输出更新你的问题\d uac_institution_view在psql和评论说你已经这样做了; 也许我可以指出一种直接在基础表上运行更新的方法.
您正在使用一个非常过时的PostgreSQL版本(8.3),因此您无法使用首选的INSTEAD OF触发器方法,您必须使用规则或直接更新基础表.
仅供参考,在发布涉及规则/触发器的答案之后,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/
我使用的是 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
| 归档时间: |
|
| 查看次数: |
24634 次 |
| 最近记录: |