Kingbase-高级特性1-视图

视图
视图是基于 SQL 语句结果集的可视化的表,其内容由查询定义。在下列示例中,由于用户有频繁查询城市及对应天气的需求,故将该查询定义为视图,并给该查询命名为 myview ,从而使得用户不必为以后的操作每次指定全部的条件:
CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
SELECT * FROM myview;
对视图的设计和使用是更好的操作 SQL 数据库的关键,视图极大简化了用户对数据的操作。视图允许用户
通过始终如一的接口来封装表的结构细节,这样避免了表结构随着应用的进化而改变。
视图几乎可以用在任何能够使用表的地方。甚至可以在其他视图的基础上创建视图。
视图( view )是 CREATE VIEW 语句定义的导出表,由一个或多个表(或其他视图)中的数据的一种定制的
表示,由查询所定义。因此视图可认为是一个存储的查询或是一个虚拟表 (virtual table) ,在系统的数据字典
中仅存放了视图的定义,不存放视图对应的数据。视图几乎可在任何使用表的地方使用。
由于视图是由表导出的,所以视图和表存在许多类似。视图可以被查询,但在修改、插入或删除时具有一定
的限制。例如,当在视图上执行的操作影响了视图的基本表中的数据时,该操作将受到基本表的完整性约束
和触发器的限制。
视图与表不同,一个视图不分配任何存储空间,不真正地包含数据,由查询定义的视图是查询结果集的映射。
视图只在数据字典中存储其定义。
引入视图可以通过限制对表的预定义行集合的存取,为表提供附加的安全性,可以为用户简化命令,可用于
保存复杂查询等。
Note: 视图有无效和有效两种状态。使用一个无效视图时候,若该无效视图经过重新编译依然无效,那么将
会抛出错误信息。
无效视图
a. 无效视图的产生
1) 创建一个无效视图
使用 create force view 创建一个无效视图。创建 force view 时若依赖检查成功,则创建为一个有效视
图,否则创建为一个无效视图。这里依赖检查就是视图编译,视图编译阶段的检查主要包括:依
赖对象是否存在、创建者是否有依赖对象的 select 权限等。
create force view vtab as select * from tab; --tab 不存在
WARNING: View created with compilation errors
CREATE VIEW
select reloptions from sys_class where relname = 'vtab';
reloptions
----------------
{status=false}
2) 有效视图变成无效视图
删除视图依赖,改变视图依赖列等会使被依赖视图变成无效状态。
create or replace 也可能会将有效视图替换为无效视图。
create table tab(a int);
CREATE TABLE
create force view vtab as select * from tab;
CREATE VIEW
select reloptions from sys_class where relname = 'vtab';
reloptions
------------
drop table tab;
NOTICE: view vtab depends on table tab
DROP TABLE
select reloptions from sys_class where relname = 'vtab';
reloptions
----------------
{status=false}
b. 无效视图的使用
1) 重新编译后依然无效
使用 ( 查询,插入,更新等 ) 一个无效视图时,会重新编译该视图。若编译失败视图依然无效,抛
出错误。
create force view vtab as select * from tab; --tab 不存在
WARNING: View created with compilation errors
CREATE VIEW
(continues on next page)
(continued from previous page)
select reloptions from sys_class where relname = 'vtab';
reloptions
----------------
{status=false}
select * from vtab;
ERROR: view "vtab" is still invalid after recompiling
2) 重新编译后有效
使用一个无效视图时候,会重新编译该视图。若编译成功,视图有效,按用户指令操作该视图。
create force view vtab as select * from tab; --tab 不存在
WARNING: View created with compilation errors
CREATE VIEW
select reloptions from sys_class where relname = 'vtab';
reloptions
----------------
{status=false}
create table tab(a int);
CREATE TABLE
select * from vtab;
a
---
(0 rows)
select reloptions from sys_class where relname = 'vtab';
reloptions
---------------
{status=true}
有效视图
a. 有效视图的产生
1) 创建一个有效视图
创建视图时候若依赖检查成功则创建为一个有效视图。创建视图 ( 不带 force ) ,依赖检查失败,视
图创建会失败。
create table tab(a int);
CREATE TABLE
create force view vtab as select * from tab;
CREATE VIEW
select reloptions from sys_class where relname = 'vtab';
reloptions
------------
create view vtab1 as select * from tab1;
ERROR: relation "tab1" does not exist
LINE 1: create view vtab1 as select * from tab1;
2) 无效视图变成有效视图
使用一个无效视图,若视图重新编译成功,视图变成有效视图。
create force view vtab as select * from tab;
CREATE VIEW
select reloptions from sys_class where relname = 'vtab';
reloptions
(continues on next page)
(continued from previous page)
----------------
{status=false}
create table tab(a int);
CREATE TABLE
select * from vtab;
a
---
(0 rows)
select reloptions from sys_class where relname = 'vtab';
reloptions
------------
b. 有效视图的使用
create table tab(a int);
CREATE TABLE
insert into tab values(3);
INSERT 0 1
create view vtab as select * from tab;
CREATE VIEW
select reloptions from sys_class where relname = 'vtab';
reloptions
------------
select * from vtab;
a
---
3
视图状态的维护
a. 删除或更改视图依赖 ( 列、表等 ) ,此次更改会影响被依赖视图,那么所有被依赖视图会被更新为无效
状态
create table tab(a int);
CREATE TABLE
create view vtab as select * from tab;
CREATE VIEW
create view vvtab as select * from vtab;
CREATE VIEW
select relname, reloptions from sys_class where relname in ('vtab',
'vvtab');
relname | reloptions
---------+------------
vtab |
vvtab |
(2 rows)
drop table tab;
NOTICE: there are(is) 2 objects that depend(s) on it
DETAIL: view vtab depends on table tab
view vvtab depends on view vtab
DROP TABLE
select relname, reloptions from sys_class where relname in ('vtab',
'vvtab');
relname | reloptions
---------+----------------
vtab | {status=false}
(continues on next page)
(continued from previous page)
vvtab | {status=false}
(2 rows)
b. 使用一个无效视图的时候,会重新编译视图。若视图编译后有效,执行用户指令;若视图编译后依然
无效,抛出错误。
  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值