首批通过分布式安全可靠测评,为关键业务系统打造
CREATE VIEW
更新时间:2026-07-15 20:56:58
描述
该语句用于创建视图。
使用限制及注意事项
如果指定了
OR REPLACE子句,该语句能够替换已有的视图。视图在数据库中实际上并不是以表的形式存在,视图是作为在
CREATE VIEW语句中指定的SELECT语句的结果而派生出来的,每次使用时视图就会派生。如果
FROM子句中引用了两个或多个表或视图,则称该视图为连接视图(Join View)。一个可更新的连接视图,也称为可修改的连接视图,涉及两个或多个基表或视图,并允许 DML 操作。可更新的视图不受限于WITH READ ONLY子句。要实现可更新,视图必须满足多个条件。例如,其中一条通用规则就是对于连接视图的
INSERT、UPDATE或DELETE操作一次只能修改一个基表。
权限要求
执行 CREATE VIEW 语句,需要当前用户拥有 CREATE VIEW 权限。有关 OceanBase 数据库权限的详细介绍,请参见 Oracle 模式下的权限分类。
语法
CREATE [OR REPLACE] [{NO FORCE} | FORCE] VIEW view_name [(column_name_list)]
AS select_stmt
[view_check_option];
column_name_list:
column_name [, column_name ...]
view_check_option:
WITH READ ONLY
| WITH CHECK OPTION
参数解释
| 参数 | 描述 |
|---|---|
| OR REPLACE | 可选项,表示如果要创建的视图名称已存在,则使用新的定义重新创建视图。 |
| {NO FORCE} | FORCE | 可选项,控制视图的创建是否强制执行。
|
| view_name | 视图名称。 |
| column_name_list | 可选项,指定视图的列名列表。如果未指定列名列表,由 SELECT 语句检索的列名将用作视图列名。SELECT 语句检索的列可以是对表列的简单引用,也可以是使用函数、常量值、运算符等的表达式。视图列名有以下限制:
|
| select_stmt | 用于定义视图的查询(SELECT)语句。它给出了视图的定义,可以从基表或其他视图进行选择。有关查询语句的具体结构和选项信息,参见 SELECT 语句。 |
| view_check_option | 可选项,用于指定视图的附加属性,详细介绍可参见下文 view_check_option。 |
view_check_option
WITH READ ONLY:是在创建或替换视图时的一个选项,用于指定该视图只能用于读取数据,而不能用于 DML 操作(INSERT、UPDATE、DELETE),即禁止通过视图进行插入、更新或删除操作。WITH CHECK OPTION:是一种用于创建视图的语法,它用于确保插入或更新的数据满足视图的定义条件。即允许通过视图进行 DML 操作,但要求操作后的数据必须满足视图的定义条件。说明
Oracle 模式下的
WITH CHECK OPTION语法不支持指定为LOCAL或CASCADED,默认为CASCADED。对于 V4.2.5 版本,从 V4.2.5 BP7 版本开始支持视图过滤条件(
where_clause)包含子查询时指定WITH CHECK OPTION子句。注意
当过滤条件中使用
WITH CHECK OPTION子句时,视图定义中暂不支持使用JOIN操作。
示例
创建测试表 tbl1 和 tbl2。
obclient> CREATE TABLE tbl1 (col1 INT, col2 VARCHAR(50));
obclient> CREATE TABLE tbl2 (col1 INT, col2 INT);
选择表
tbl1中的col1、col2列来创建视图v1_t1。obclient> CREATE OR REPLACE FORCE VIEW v1_t1(vcol1, vcol2) AS SELECT col1, col2 FROM tbl1;基于表
tbl2的col1、col2列来创建视图v2_t2,v2_t2中包含满足tbl2.col2 > 1的全部数据。obclient> CREATE VIEW v2_t2 AS SELECT * FROM tbl2 WHERE tbl2.col2 > 1 WITH CHECK OPTION;基于表
tbl2的col1、col2列来创建视图v3_t3,并同时为视图v3_t3添加注释。创建视图
v3_t3。obclient> CREATE VIEW v3_t3 AS SELECT col1, --test.col1 col2 --test.col2 FROM tbl2;通过
SHOW CREATE VIEW或DBMS_METADATA.GET_DDL查询视图注释。通过
SHOW CREATE VIEW查询视图注释。obclient> SHOW CREATE VIEW v3_t3;返回结果如下:
+-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | VIEW | CREATE VIEW | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | +-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | V3_T3 | CREATE VIEW "V3_T3" ("COL1", "COL2") AS SELECT col1, --test.col1 col2 --test.col2 FROM tbl2 | utf8mb4 | utf8mb4_bin | +-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ 1 row in set通过
DBMS_METADATA.GET_DDL查询视图注释。obclient> SELECT DBMS_METADATA.GET_DDL('VIEW', 'V3_T3', 'SYS') FROM DUAL;返回结果如下:
+-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | VIEW | CREATE VIEW | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | +-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | V3_T3 | CREATE VIEW "V3_T3" ("COL1", "COL2") AS SELECT col1, --test.col1 col2 --test.col2 FROM tbl2 | utf8mb4 | utf8mb4_bin | +-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ 1 row in set (0.028 sec) obclient(SYS@oracle001)[SYS]> SELECT DBMS_METADATA.GET_DDL('VIEW', 'V3_T3', 'SYS') FROM DUAL; +------------------------------------------------------------------------------------------------------------------------------------------+ | DBMS_METADATA.GET_DDL('VIEW','V3_T3','SYS') | +------------------------------------------------------------------------------------------------------------------------------------------+ | CREATE VIEW "V3_T3" ("COL1", "COL2") AS SELECT col1, --test.col1 col2 --test.col2 FROM tbl2 | +------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set
在过滤条件子查询后指定
WITH CHECK OPTION子句。obclient> CREATE OR REPLACE VIEW v4_t1 AS SELECT * FROM tbl1 t1 WHERE EXISTS (SELECT 1 FROM tbl2 t2 WHERE t2.col1 = t1.col1) WITH CHECK OPTION;