是否可以从带有视图的表中删除行?
如果是,我们如何在 PostgreSQL 中做到这一点?
如果不是,有什么替代方案?
从版本 9.3 开始,PostgreSql 中的视图是可更新的。
请参阅文档:http://www.postgresql.org/docs/9.3/static/sql-createview.html(查找“可更新视图”)以了解视图必须满足的“可更新”条件.
一个非常简单的例子:
create table tbl1
( rollnumber int,
name varchar) ;
insert into tbl1 values(1,'abc');
insert into tbl1 values(2,'def');
insert into tbl1 values(3,'ghi');
create view view1 as select * from tbl1;
delete from view1 where rollnumber=2;
您可以从带有视图的表中删除行。 *我的帖子详细解释了一个视图。
例如,您创建
person
表,如下所示:
CREATE TABLE person (
id INTEGER,
first_name VARCHAR(20),
last_name VARCHAR(20),
age INTEGER
);
然后,将 4 行插入到
person
表中,如下所示:
INSERT INTO person (id, first_name, last_name, age)
VALUES (1, 'John', 'Smith', 27),
(2, 'David', 'Miller', 32),
(3, 'Robert', 'Brown', 18),
(4, 'Mark', 'Davis', 40);
然后调用
person
,得到如下结果:
postgres=# SELECT * FROM person;
id | first_name | last_name | age
----+------------+-----------+-----
1 | John | Smith | 27
2 | David | Miller | 32
3 | Robert | Brown | 18
4 | Mark | Davis | 40
(4 rows)
然后,您创建
my_view
视图,如下所示:
CREATE VIEW my_view AS
SELECT first_name, age FROM person;
现在,您可以使用
person
从 my_view
表中删除 2 行,如下所示。 *id
和last_name
不可用:
DELETE FROM my_view WHERE age = 32 OR age = 40;
然后,从
person
表中删除2行,如下所示:
postgres=# SELECT * FROM person;
id | first_name | last_name | age
----+------------+-----------+-----
1 | John | Smith | 27
3 | Robert | Brown | 18
(2 rows)