CREATE VIEW
CREATE VIEW
语句将一个 SELECT
语句保存为一个可查询的对象,类似于一个表。TiDB 中的视图是非物化的。这意味着在查询视图时,TiDB 会在内部重写查询,将视图定义与 SQL 查询合并。
概要
- CreateViewStmt
- OrReplace
- ViewAlgorithm
- ViewDefiner
- ViewSQLSecurity
- ViewName
- ViewFieldList
- ViewCheckOption
CreateViewStmt ::=
'CREATE' OrReplace ViewAlgorithm ViewDefiner ViewSQLSecurity 'VIEW' ViewName ViewFieldList 'AS' CreateViewSelectOpt ViewCheckOption
OrReplace ::=
( 'OR' 'REPLACE' )?
ViewAlgorithm ::=
( 'ALGORITHM' '=' ( 'UNDEFINED' | 'MERGE' | 'TEMPTABLE' ) )?
ViewDefiner ::=
( 'DEFINER' '=' Username )?
ViewSQLSecurity ::=
( 'SQL' 'SECURITY' ( 'DEFINER' | 'INVOKER' ) )?
ViewName ::= TableName
ViewFieldList ::=
( '(' Identifier ( ',' Identifier )* ')' )?
ViewCheckOption ::=
( 'WITH' ( 'CASCADED' | 'LOCAL' ) 'CHECK' 'OPTION' )?
示例
mysql> CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, c1 INT NOT NULL);
Query OK, 0 rows affected (0.11 sec)
mysql> INSERT INTO t1 (c1) VALUES (1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.03 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> CREATE VIEW v1 AS SELECT * FROM t1 WHERE c1 > 2;
Query OK, 0 rows affected (0.11 sec)
mysql> SELECT * FROM t1;
+----+----+
| id | c1 |
+----+----+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+----+
5 rows in set (0.00 sec)
mysql> SELECT * FROM v1;
+----+----+
| id | c1 |
+----+----+
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+----+
3 rows in set (0.00 sec)
mysql> INSERT INTO t1 (c1) VALUES (6);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM v1;
+----+----+
| id | c1 |
+----+----+
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
+----+----+
4 rows in set (0.00 sec)
mysql> INSERT INTO v1 (c1) VALUES (7);
ERROR 1105 (HY000): insert into view v1 is not supported now.
MySQL 兼容性
- 目前,TiDB 中的任何视图都不能进行插入或更新(即不支持
INSERT VIEW
和UPDATE VIEW
)。WITH CHECK OPTION
仅在语法上兼容,但不生效。 - 目前,TiDB 中的视图不支持
ALTER VIEW
,但可以使用CREATE OR REPLACE
代替。 - 目前,
ALGORITHM
字段在 TiDB 中仅在语法上兼容,但不生效。TiDB 目前只支持 MERGE 算法。