diff --git a/constraints.md b/constraints.md index 8c6fc7c59fa87..1a02a85f84ba1 100644 --- a/constraints.md +++ b/constraints.md @@ -55,12 +55,12 @@ ALTER TABLE orders ADD FOREIGN KEY fk_user_id (user_id) REFERENCES users(id); * TiDB supports foreign keys so that no errors are reported for this syntax when migrating data from other databases. Currently, foreign keys are not enforced as part of DML operations. For example, even though there is no such record as `id=123` in the `users` table, the following transaction commits successfully in TiDB: ``` - START TRANSACTION; - INSERT INTO orders (user_id, doc) VALUES (123, NULL); - COMMIT; + START TRANSACTION; + INSERT INTO orders (user_id, doc) VALUES (123, NULL); + COMMIT; ``` -* In TiDB, foreign key information is not displayed in the execution result of the `SHOW CREATE TABLE` statement. +* In TiDB, the foreign key information is not displayed in the execution result of the `SHOW CREATE TABLE` statement. ## Not Null diff --git a/views.md b/views.md index 10d807bb25ace..7c4926f24e7d0 100644 --- a/views.md +++ b/views.md @@ -6,38 +6,214 @@ aliases: ['/docs/v3.1/views/','/docs/v3.1/reference/sql/views/'] # Views -TiDB supports views. A view acts as a virtual table and its table schema is defined by the `SELECT` statement when you create the view. Using views has the following benefits: +TiDB supports views. A view acts as a virtual table, whose schema is defined by the `SELECT` statement that creates the view. Using views has the following benefits: -- Exposing only safe fields and data to users to ensure security of sensitive fields and data stored in the underlying table -- Defining complex queries that frequently appear as views to make complex queries easier and more convenient +- Exposing only safe fields and data to users to ensure security of sensitive fields and data stored in the underlying table. +- Defining complex queries that frequently appear as views to make complex queries easier and more convenient. ## Query views Querying a view is similar to querying an ordinary table. However, when TiDB queries a view, it actually queries the `SELECT` statement associated with the view. -## Examples +## Show metadata + +To obtain the metadata of views, choose any of the following methods. + +### Use the `SHOW CREATE TABLE view_name` or `SHOW CREATE VIEW view_name` statement + +Usage example: + +{{< copyable "sql" >}} + +```sql +show create view v; +``` + +This statement shows the `CREATE VIEW` statement corresponding to this view and the value of the `character_set_client` and `collation_connection` system variables when the view was created. + +```sql ++------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ +| View | Create View | character_set_client | collation_connection | ++------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ +| v | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`127.0.0.1` SQL SECURITY DEFINER VIEW `v` (`a`) AS SELECT `s`.`a` FROM `test`.`t` LEFT JOIN `test`.`s` ON `t`.`a`=`s`.`a` | utf8 | utf8_general_ci | ++------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ +1 row in set (0.00 sec) +``` + +### Query the `INFORMATION_SCHEMA.VIEWS` table + +Usage example: + +{{< copyable "sql" >}} + +```sql +select * from information_schema.views; +``` + +You can view the relevant meta information of the view by querying this table, such as `TABLE_CATALOG`, `TABLE_SCHEMA`, `TABLE_NAME`, `VIEW_DEFINITION`, `CHECK_OPTION`, `IS_UPDATABLE`, `DEFINER`, `SECURITY_TYPE`, `CHARACTER_SET_CLIENT`, and `COLLATION_CONNECTION`. + +```sql ++---------------+--------------+------------+------------------------------------------------------------------------+--------------+--------------+----------------+---------------+----------------------+----------------------+ +| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | VIEW_DEFINITION | CHECK_OPTION | IS_UPDATABLE | DEFINER | SECURITY_TYPE | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | ++---------------+--------------+------------+------------------------------------------------------------------------+--------------+--------------+----------------+---------------+----------------------+----------------------+ +| def | test | v | SELECT `s`.`a` FROM `test`.`t` LEFT JOIN `test`.`s` ON `t`.`a`=`s`.`a` | CASCADED | NO | root@127.0.0.1 | DEFINER | utf8 | utf8_general_ci | ++---------------+--------------+------------+------------------------------------------------------------------------+--------------+--------------+----------------+---------------+----------------------+----------------------+ +1 row in set (0.00 sec) +``` + +### Use the HTTP APIs + +Usage example: + +{{< copyable "" >}} + +```sql +curl http://127.0.0.1:10080/schema/test/v +``` + +By visiting `http://{TiDBIP}:10080/schema/{db}/{view}`, you can get all the metadata for the view. + +``` +{ + "id": 122, + "name": { + "O": "v", + "L": "v" + }, + "charset": "utf8", + "collate": "utf8_general_ci", + "cols": [ + { + "id": 1, + "name": { + "O": "a", + "L": "a" + }, + "offset": 0, + "origin_default": null, + "default": null, + "default_bit": null, + "default_is_expr": false, + "generated_expr_string": "", + "generated_stored": false, + "dependences": null, + "type": { + "Tp": 0, + "Flag": 0, + "Flen": 0, + "Decimal": 0, + "Charset": "", + "Collate": "", + "Elems": null + }, + "state": 5, + "comment": "", + "hidden": false, + "version": 0 + } + ], + "index_info": null, + "fk_info": null, + "state": 5, + "pk_is_handle": false, + "is_common_handle": false, + "comment": "", + "auto_inc_id": 0, + "auto_id_cache": 0, + "auto_rand_id": 0, + "max_col_id": 1, + "max_idx_id": 0, + "update_timestamp": 416801600091455490, + "ShardRowIDBits": 0, + "max_shard_row_id_bits": 0, + "auto_random_bits": 0, + "pre_split_regions": 0, + "partition": null, + "compression": "", + "view": { + "view_algorithm": 0, + "view_definer": { + "Username": "root", + "Hostname": "127.0.0.1", + "CurrentUser": false, + "AuthUsername": "root", + "AuthHostname": "%" + }, + "view_security": 0, + "view_select": "SELECT `s`.`a` FROM `test`.`t` LEFT JOIN `test`.`s` ON `t`.`a`=`s`.`a`", + "view_checkoption": 1, + "view_cols": null + }, + "sequence": null, + "Lock": null, + "version": 3, + "tiflash_replica": null +} +``` + +## Example The following example creates a view, queries this view, and delete this view: +{{< copyable "sql" >}} + ```sql -tidb> create table t(a int, b int); +create table t(a int, b int); +``` + +``` Query OK, 0 rows affected (0.01 sec) +``` + +{{< copyable "sql" >}} + +```sql +insert into t values(1, 1),(2,2),(3,3); +``` -tidb> insert into t values(1, 1),(2,2),(3,3); +``` Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 +``` + +{{< copyable "sql" >}} + +```sql +create table s(a int); +``` -tidb> create table s(a int); +``` Query OK, 0 rows affected (0.01 sec) +``` + +{{< copyable "sql" >}} -tidb> insert into s values(2),(3); +```sql +insert into s values(2),(3); +``` + +``` Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 +``` + +{{< copyable "sql" >}} + +```sql +create view v as select s.a from t left join s on t.a = s.a; +``` -tidb> create view v as select s.a from t left join s on t.a = s.a; +``` Query OK, 0 rows affected (0.01 sec) +``` + +{{< copyable "sql" >}} + +```sql +select * from v; +``` -tidb> select * from v; +``` +------+ | a | +------+ @@ -46,18 +222,25 @@ tidb> select * from v; | 3 | +------+ 3 rows in set (0.00 sec) +``` + +{{< copyable "sql" >}} -tidb> drop view v; +```sql +drop view v; +``` + +``` Query OK, 0 rows affected (0.02 sec) ``` ## Limitations -Currently, the TiDB view has the following limitations: +Currently, views in TiDB are subject to the following limitations: -- TiDB does not support materialized views. -- TiDB views are read-only and do not support write operations like `UPDATE`, `INSERT`, `DELETE` and so on. -- For created views, TiDB only support the `DROP [VIEW | TABLE]` DDL operation. +* Materialized views are not supported yet. +* Views in TiDB are read-only and do not support write operations such as `UPDATE`, `INSERT`, `DELETE`, and `TRUNCATE`. +* For created views, the only supported DDL operation is `DROP [VIEW | TABLE]` ## See also