From e94334c829058051bc83e3115a5ab0d9df8b0677 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 5 Aug 2025 04:34:43 +0000 Subject: [PATCH 1/5] [INIT] Start translation to Simplified-Chinese --- .translation-init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.translation-init b/.translation-init index 6d48543e1b..20a97dec51 100644 --- a/.translation-init +++ b/.translation-init @@ -1 +1 @@ -Translation initialization: 2025-08-04T01:18:33.401522 +Translation initialization: 2025-08-05T04:34:43.246797 From 8020c93195620aef724dceda071edc703609d5d8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 5 Aug 2025 04:37:21 +0000 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=8C=90=20Translate=2001-privileges.md?= =?UTF-8?q?=20to=20Simplified-Chinese?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../access-control/01-privileges.md | 232 +++++++++--------- 1 file changed, 122 insertions(+), 110 deletions(-) diff --git a/docs/cn/guides/56-security/access-control/01-privileges.md b/docs/cn/guides/56-security/access-control/01-privileges.md index 2852a9d191..06bf0412dd 100644 --- a/docs/cn/guides/56-security/access-control/01-privileges.md +++ b/docs/cn/guides/56-security/access-control/01-privileges.md @@ -2,7 +2,7 @@ title: 权限 --- -权限(Privilege)是执行某项操作的许可。在 Databend 中,用户必须拥有特定权限才能执行相应操作。例如,查询表时,用户需要对该表拥有 `SELECT` 权限;同理,要读取 Stage 中的数据集,用户必须拥有 `READ` 权限。 +权限(Privilege)是执行某项操作的许可。在 Databend 中,用户必须拥有特定权限才能执行相应操作。例如,查询表时需要对该表拥有 `SELECT` 权限;读取 Stage 中的数据集则必须拥有 `READ` 权限。 在 Databend 中,用户可通过两种方式获得权限:一是直接将权限授予用户;二是先将权限授予角色,再将该角色授予用户。 @@ -10,7 +10,7 @@ title: 权限 ## 管理权限 -管理用户或角色的权限,请使用以下命令: +使用以下命令管理用户或角色的权限: - [GRANT](/sql/sql-commands/ddl/user/grant) - [REVOKE](/sql/sql-commands/ddl/user/revoke) @@ -18,13 +18,14 @@ title: 权限 ### 向用户/角色授予权限 -授予权限有两种方式:可直接授予用户,也可先授予角色,再将角色授予用户。下例直接将权限授予用户 david:先创建用户 david(密码 abc123),再将 default Schema 中所有对象的全部权限直接授予 david,最后查看 david 的权限。 +授予权限有两种方式:直接授予用户,或先授予角色再授予用户。 +下例将权限直接授予用户 david:先创建密码为 abc123 的新用户 david,再将 default 数据库中所有对象的全部权限直接授予 david,最后查看 david 的权限。 -```sql title='示例-1:' +```sql title='示例 1:' -- 创建用户 david,密码 abc123 CREATE USER david IDENTIFIED BY 'abc123'; --- 将 default Schema 中所有对象的全部权限授予 david +-- 将 default.* 的所有权限授予 david GRANT ALL ON default.* TO david; -- 查看 david 的权限 @@ -37,26 +38,26 @@ SHOW GRANTS FOR david; └───────────────────────────────────────────────────┘ ``` -下例先将权限授予角色,再将角色授予用户 eric:先创建角色 writer,并授予其对 default Schema 中所有对象的全部权限;随后创建用户 eric(密码 abc123),并将 writer 角色授予 eric;最后查看 eric 的权限。 +下例先将权限授予角色,再将角色授予用户 eric:先创建角色 writer 并授予 default.* 的全部权限,再创建用户 eric(密码 abc123),然后将 writer 角色授予 eric,最后查看 eric 的权限。 -```sql title='示例-2:' +```sql title='示例 2:' -- 创建角色 writer CREATE ROLE writer; --- 将 default Schema 中所有对象的全部权限授予角色 writer +-- 将 default.* 的所有权限授予角色 writer GRANT ALL ON default.* TO ROLE writer; -- 创建用户 eric,密码 abc123 CREATE USER eric IDENTIFIED BY 'abc123'; --- 将角色 writer 授予用户 eric +-- 将角色 writer 授予 eric GRANT ROLE writer TO eric; -- 查看 eric 的权限 SHOW GRANTS FOR eric; ┌──────────────────────────────────────────────────┐ -│ Grants │ +│ Grants │ ├──────────────────────────────────────────────────┤ │ GRANT ALL ON 'default'.'default'.* TO 'eric'@'%' │ └──────────────────────────────────────────────────┘ @@ -64,33 +65,34 @@ SHOW GRANTS FOR eric; ### 从用户/角色撤销权限 -在访问控制中,可从用户或角色撤销权限。下例先从用户 david 撤销 default Schema 中所有对象的全部权限,再查看 david 的权限: +在访问控制中,可从用户或角色撤销权限。 +下例从用户 david 撤销 default.* 的所有权限,并查看 david 的权限: -```sql title='示例-1(续):' --- 从 david 撤销 default Schema 中所有对象的全部权限 +```sql title='示例 1(续):' +-- 从 david 撤销 default.* 的所有权限 REVOKE ALL ON default.* FROM david; -- 查看 david 的权限 SHOW GRANTS FOR david; ``` -下例先从角色 writer 撤销 default Schema 中所有对象的全部权限,再查看 eric 的权限: +下例从角色 writer 撤销 default.* 的所有权限,随后查看 eric 的权限(因权限已从角色撤销,结果为空)。 -```sql title='示例-2(续):' --- 从角色 writer 撤销 default Schema 中所有对象的全部权限 +```sql title='示例 2(续):' +-- 从角色 writer 撤销 default.* 的所有权限 REVOKE ALL ON default.* FROM ROLE writer; -- 查看 eric 的权限 --- 由于权限已从角色撤销,结果为空 +-- 无结果显示,权限已被撤销 SHOW GRANTS FOR eric; ``` ## 访问控制权限 -Databend 提供多种权限,支持对数据库对象进行细粒度控制。权限可分为以下类别: +Databend 提供多种权限,实现对数据库对象的细粒度控制,可分为以下两类: -- 全局权限:作用于整个数据库管理系统,而非特定对象,涵盖创建/删除数据库、管理用户与角色、修改系统级设置等操作。详见[全局权限](#global-privileges)。 -- 对象级权限:针对特定数据库对象,包括: +- 全局权限(Global Privileges):作用于整个数据库管理系统,而非特定对象,涵盖创建/删除数据库、管理用户与角色、修改系统级设置等操作。详见[全局权限](#global-privileges)。 +- 对象级权限(Object-specific Privileges):按对象类型划分,包括: - [表权限](#table-privileges) - [视图权限](#view-privileges) - [数据库权限](#database-privileges) @@ -102,84 +104,86 @@ Databend 提供多种权限,支持对数据库对象进行细粒度控制。 ### 所有权限 -| 权限 | 对象类型 | 描述 | -|:------------------|:------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------| -| ALL | 所有 | 授予指定对象类型的全部权限。 | -| ALTER | Global、Database、Table、View | 修改数据库、表、用户或 UDF。 | -| CREATE | Global、Table | 创建表或 UDF。 | -| CREATE DATABASE | Global | 创建数据库或 UDF。 | -| CREATE WAREHOUSE | Global | 创建 Warehouse。 | -| CREATE CONNECTION | Global | 创建 Connection。 | -| DELETE | Table | 删除或清空表中的行。 | -| DROP | Global、Database、Table、View | 删除数据库、表、View 或 UDF;恢复已删除的表。 | -| INSERT | Table | 向表中插入行。 | -| SELECT | Database、Table | 从表中查询行;显示或使用数据库。 | -| UPDATE | Table | 更新表中的行。 | -| GRANT | Global | 向用户或角色授予/撤销权限。 | -| SUPER | Global、Table | 终止查询;设置全局配置;优化表;分析表;操作 Stage(列出、创建、删除 Stage)、Catalog 或共享。 | -| USAGE | Global | “无权限”的同义词。 | -| CREATE ROLE | Global | 创建角色。 | -| DROP ROLE | Global | 删除角色。 | -| CREATE USER | Global | 创建 SQL 用户。 | -| DROP USER | Global | 删除 SQL 用户。 | -| WRITE | Stage | 写入 Stage。 | -| READ | Stage | 读取 Stage。 | -| USAGE | UDF | 使用 UDF。 | -| ACCESS CONNECTION | CONNECTION | 访问 Connection。 | +| 权限 | 对象类型 | 描述 | +|:------------------|:------------------------------|:---------------------------------------------------------------------------------------| +| ALL | 所有 | 授予指定对象类型的全部权限。 | +| ALTER | Global、Database、Table、View | 修改数据库、表、用户或 UDF。 | +| CREATE | Global、Table | 创建表或 UDF。 | +| CREATE DATABASE | Global | 创建数据库或 UDF。 | +| CREATE WAREHOUSE | Global | 创建 Warehouse。 | +| CREATE CONNECTION | Global | 创建 Connection。 | +| CREATE SEQUENCE | Global | 创建 Sequence。 | +| DELETE | Table | 删除或截断表中的行。 | +| DROP | Global、Database、Table、View | 删除数据库、表、视图或 UDF;恢复已删除的表。 | +| INSERT | Table | 向表插入行。 | +| SELECT | Database、Table | 从表查询行;显示或使用数据库。 | +| UPDATE | Table | 更新表中的行。 | +| GRANT | Global | 向用户或角色授予/撤销权限。 | +| SUPER | Global、Table | 终止查询;设置全局配置;优化表;分析表;操作 Stage(列出、创建、删除)、Catalog 或 Share。 | +| USAGE | Global | 等同于“无权限”。 | +| CREATE ROLE | Global | 创建角色。 | +| DROP ROLE | Global | 删除角色。 | +| CREATE USER | Global | 创建 SQL 用户。 | +| DROP USER | Global | 删除 SQL 用户。 | +| WRITE | Stage | 写入 Stage。 | +| READ | Stage | 读取 Stage。 | +| USAGE | UDF | 使用 UDF。 | +| ACCESS CONNECTION | CONNECTION | 访问 Connection。 | +| ACCESS SEQUENCE | SEQUENCE | 访问 Sequence。 | ### 全局权限 -| 权限 | 描述 | -|:------------------|:-----------------------------------------------------------------------------------------------------------------------------------| -| ALL | 授予指定对象类型的全部权限。 | -| ALTER | 添加或删除表列;修改 Cluster Key;重新聚簇表。 | -| CREATEROLE | 创建角色。 | -| CREAT DATABASE | 创建 DATABASE。 | -| CREATE WAREHOUSE | 创建 WAREHOUSE。 | -| CREATE CONNECTION | 创建 CONNECTION。 | -| DROPUSER | 删除用户。 | -| CREATEUSER | 创建用户。 | -| DROPROLE | 删除角色。 | -| SUPER | 终止查询;设置或取消设置;操作 Stage、Catalog 或共享;调用函数;COPY INTO Stage。 | -| USAGE | 仅连接 databend query。 | -| CREATE | 创建 UDF。 | -| DROP | 删除 UDF。 | -| ALTER | 修改 UDF;修改 SQL 用户。 | +| 权限 | 描述 | +|:------------------|:-----------------------------------------------------------------------------------------------| +| ALL | 授予指定对象类型的全部权限。 | +| ALTER | 添加或删除表列;修改 Cluster Key;重新聚簇表。 | +| CREATEROLE | 创建角色。 | +| CREAT DATABASE | 创建 DATABASE。 | +| CREATE WAREHOUSE | 创建 WAREHOUSE。 | +| CREATE CONNECTION | 创建 CONNECTION。 | +| DROPUSER | 删除用户。 | +| CREATEUSER | 创建用户。 | +| DROPROLE | 删除角色。 | +| SUPER | 终止查询;设置或取消设置;操作 Stage、Catalog 或 Share;调用函数;COPY INTO Stage。 | +| USAGE | 仅用于连接 Databend 查询。 | +| CREATE | 创建 UDF。 | +| DROP | 删除 UDF。 | +| ALTER | 修改 UDF;修改 SQL 用户。 | ### 表权限 -| 权限 | 描述 | -|:----------|:-----------------------------------------------------------------------------------------------------------------| -| ALL | 授予指定对象类型的全部权限。 | -| ALTER | 添加或删除表列;修改 Cluster Key;重新聚簇表。 | -| CREATE | 创建表。 | -| DELETE | 删除表中的行;清空表。 | -| DROP | 删除或恢复表;恢复最近删除的表版本。 | -| INSERT | 向表中插入行;COPY INTO 表。 | -| SELECT | 查询表;SHOW CREATE 表;DESCRIBE 表。 | -| UPDATE | 更新表中的行。 | -| SUPER | 优化或分析表。 | -| OWNERSHIP | 授予对数据库的完全控制权;同一对象一次只能有一个角色拥有此权限。 | +| 权限 | 描述 | +|:----------|:---------------------------------------------------------------------------------------| +| ALL | 授予指定对象类型的全部权限。 | +| ALTER | 添加或删除表列;修改 Cluster Key;重新聚簇表。 | +| CREATE | 创建表。 | +| DELETE | 删除表中的行;截断表。 | +| DROP | 删除或恢复表;恢复最近删除的表版本。 | +| INSERT | 向表插入行;COPY INTO 表。 | +| SELECT | 查询表;SHOW CREATE 表;DESCRIBE 表。 | +| UPDATE | 更新表中的行。 | +| SUPER | 优化或分析表。 | +| OWNERSHIP | 授予对数据库的完全控制权;同一对象一次只能有一个角色拥有此权限。 | ### 视图权限 -| 权限 | 描述 | -|:------|:---------------------------------------------------------------------| -| ALL | 授予指定对象类型的全部权限。 | -| ALTER | 创建或删除 View;使用另一条 QUERY 修改现有 View。 | -| DROP | 删除 View。 | +| 权限 | 描述 | +|:----------|:-------------------------------------------------------| +| ALL | 授予指定对象类型的全部权限。 | +| ALTER | 创建或删除视图;使用另一条 Query 修改现有视图。 | +| DROP | 删除视图。 | ### 数据库权限 -拥有以下任一数据库权限,或对数据库中任一表的任何权限后,即可使用 [USE DATABASE](/sql/sql-commands/ddl/database/ddl-use-database) 指定数据库。 +拥有以下任一数据库权限或数据库中任一表的任何权限后,即可使用 [USE DATABASE](/sql/sql-commands/ddl/database/ddl-use-database) 指定数据库。 -| 权限 | 描述 | -|:----------|:-----------------------------------------------------------------------------------------------------------------| -| ALTER | 重命名数据库。 | -| DROP | 删除或恢复数据库;恢复最近删除的数据库版本。 | -| SELECT | SHOW CREATE 数据库。 | -| OWNERSHIP | 授予对数据库的完全控制权;同一对象一次只能有一个角色拥有此权限。 | -| USAGE | 允许使用 `USE ` 进入数据库,但不授予其中任何对象的访问权限。 | +| 权限 | 描述 | +|:----------|:---------------------------------------------------------------------------------------| +| ALTER | 重命名数据库。 | +| DROP | 删除或恢复数据库;恢复最近删除的数据库版本。 | +| SELECT | SHOW CREATE 数据库。 | +| OWNERSHIP | 授予对数据库的完全控制权;同一对象一次只能有一个角色拥有此权限。 | +| USAGE | 允许使用 `USE ` 进入数据库,但不授予其中任何对象的访问权限。 | > 注意: > @@ -187,19 +191,19 @@ Databend 提供多种权限,支持对数据库对象进行细粒度控制。 ### 会话策略权限 -| 权限 | 描述 | -| :-- | :-- | -| SUPER | 终止查询;设置或取消设置。 | -| ALL | 授予指定对象类型的全部权限。 | +| 权限 | 描述 | +| :-- | :-- | +| SUPER | 终止查询;设置或取消设置。 | +| ALL | 授予指定对象类型的全部权限。 | ### Stage 权限 -| 权限 | 描述 | -|:----------|:-----------------------------------------------------------------------------------------------------------------| -| WRITE | 写入 Stage;例如 COPY INTO Stage、预签名上传或删除 Stage。 | -| READ | 读取 Stage;例如列出 Stage、查询 Stage、从 Stage COPY INTO 表、预签名下载。 | -| ALL | 授予指定对象类型的 READ、WRITE 权限。 | -| OWNERSHIP | 授予对 Stage 的完全控制权;同一对象一次只能有一个角色拥有此权限。 | +| 权限 | 描述 | +|:----------|:---------------------------------------------------------------------------------------| +| WRITE | 写入 Stage,例如 COPY INTO Stage、预签名上传或删除 Stage。 | +| READ | 读取 Stage,例如列出 Stage、查询 Stage、从 Stage COPY INTO 表、预签名下载。 | +| ALL | 授予指定对象类型的 READ、WRITE 权限。 | +| OWNERSHIP | 授予对 Stage 的完全控制权;同一对象一次只能有一个角色拥有此权限。 | > 注意: > @@ -207,28 +211,36 @@ Databend 提供多种权限,支持对数据库对象进行细粒度控制。 ### UDF 权限 -| 权限 | 描述 | -|:----------|:-----------------------------------------------------------------------------------------------------------------| -| USAGE | 可使用 UDF;例如 COPY INTO Stage、预签名上传。 | -| ALL | 授予指定对象类型的 READ、WRITE 权限。 | -| OWNERSHIP | 授予对 UDF 的完全控制权;同一对象一次只能有一个角色拥有此权限。 | +| 权限 | 描述 | +|:----------|:---------------------------------------------------------------------------------------| +| USAGE | 可使用 UDF,例如 COPY INTO Stage、预签名上传。 | +| ALL | 授予指定对象类型的 READ、WRITE 权限。 | +| OWNERSHIP | 授予对 UDF 的完全控制权;同一对象一次只能有一个角色拥有此权限。 | > 注意: > -> 1. 若 UDF 已被常量折叠,则不检查其认证。 +> 1. 若 UDF 已被常量折叠,则不检查其认证。 > 2. 若 UDF 是 INSERT 中的值,则不检查其认证。 ### Catalog 权限 -| 权限 | 描述 | -|:------|:--------------------------------------------------| -| SUPER | SHOW CREATE catalog;创建或删除 catalog。 | -| ALL | 授予指定对象类型的全部权限。 | +| 权限 | 描述 | +|:------|:-----------------------------------------------| +| SUPER | SHOW CREATE catalog;创建或删除 catalog。 | +| ALL | 授予指定对象类型的全部权限。 | ### Connection 权限 -| 权限 | 描述 | -|:------------------|:-----------------------------------------------------------------------------------------------------------------| -| Access Connection | 可访问 Connection。 | -| ALL | 授予指定对象类型的 Access Connection 权限。 | -| OWNERSHIP | 授予对 Connection 的完全控制权;同一对象一次只能有一个角色拥有此权限。 | \ No newline at end of file +| 权限 | 描述 | +|:------------------|:---------------------------------------------------------------------------------------| +| Access Connection | 可访问 Connection。 | +| ALL | 授予指定对象类型的 Access Connection 权限。 | +| OWNERSHIP | 授予对 Connection 的完全控制权;同一对象一次只能有一个角色拥有此权限。 | + +### Sequence 权限 + +| 权限 | 描述 | +|:----------------|:---------------------------------------------------------------------------------------| +| Access Sequence | 可访问 Sequence(如 Drop、Desc)。 | +| ALL | 授予指定对象类型的 Access Sequence 权限。 | +| OWNERSHIP | 授予对 Sequence 的完全控制权;同一对象一次只能有一个角色拥有此权限。 | \ No newline at end of file From 03415c3a2b5f77fadceadc6ec633b6bf99dfef30 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 5 Aug 2025 04:39:26 +0000 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=8C=90=20Translate=2001-privileges.md?= =?UTF-8?q?=20to=20Simplified-Chinese?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../00-ddl/01-table/10-ddl-create-table.md | 312 ++++++++++++------ 1 file changed, 217 insertions(+), 95 deletions(-) diff --git a/docs/cn/sql-reference/10-sql-commands/00-ddl/01-table/10-ddl-create-table.md b/docs/cn/sql-reference/10-sql-commands/00-ddl/01-table/10-ddl-create-table.md index 088db6e05f..0c9faede92 100644 --- a/docs/cn/sql-reference/10-sql-commands/00-ddl/01-table/10-ddl-create-table.md +++ b/docs/cn/sql-reference/10-sql-commands/00-ddl/01-table/10-ddl-create-table.md @@ -1,27 +1,26 @@ ---- title: CREATE TABLE sidebar_position: 1 --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + import EEFeature from '@site/src/components/EEFeature'; - + -创建表是许多数据库中最复杂的操作之一,因为您可能需要: +对许多数据库来说,创建表是最复杂的操作之一,因为你可能需要: -- 手动指定存储引擎(Engine) -- 手动指定索引(Index) -- 甚至需要指定数据分区(Partition)或数据分片(Shard) +- 手动指定引擎 +- 手动指定索引 +- 甚至指定数据分区或数据分片 -Databend 的设计目标是易于使用,在创建表时**不需要**执行上述任何操作。此外,CREATE TABLE 语句提供以下选项,使您在各种场景下都能轻松创建表: +Databend 的设计目标是易于使用,在创建表时不需要进行任何这些操作。此外,CREATE TABLE 语句提供了以下选项,使你在各种场景下创建表变得更加容易: -- [CREATE TABLE](#create-table):从头创建新表 -- [CREATE TABLE ... LIKE](#create-table--like):基于现有表的列定义创建新表 -- [CREATE TABLE ... AS](#create-table--as):通过 SELECT 查询结果创建表并插入数据 +- [CREATE TABLE](#create-table):从头开始创建表。 +- [CREATE TABLE ... LIKE](#create-table--like):创建一个与现有表具有相同列定义的表。 +- [CREATE TABLE ... AS](#create-table--as):创建一个表,并使用 SELECT 查询的结果插入数据。 另请参阅: @@ -45,93 +44,122 @@ CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ] [ . ] :::note -- Databend 支持的数据类型请参阅[数据类型(Data Types)](../../../00-sql-reference/10-data-types/index.md) -- 建议尽量避免在列名中使用特殊字符。如必须使用,需用反引号包裹别名:`CREATE TABLE price(\`$CA\` int)` -- Databend 会自动将列名转为小写(如 _Total_ 会显示为 _total_) -::: +- 有关 Databend 中可用的数据类型,请参阅 [数据类型](../../../00-sql-reference/10-data-types/index.md)。 + +- Databend 建议在命名列时尽量避免使用特殊字符。但是,如果在某些情况下必须使用特殊字符,别名应使用反引号括起来,例如:CREATE TABLE price(\`$CA\` int); + +- Databend 会自动将列名转换为小写。例如,如果你将一列命名为 _Total_,它在结果中将显示为 _total_。 + ::: ## CREATE TABLE ... LIKE -创建与现有表列定义相同的新表,复制列名、数据类型及非空约束(NOT NULL Constraints)。 +创建一个与现有表具有相同列定义的表。现有表的列名、数据类型及其非空约束将被复制到新表中。 语法: + ```sql CREATE TABLE [IF NOT EXISTS] [db.]table_name LIKE [db.]origin_table_name ``` -此命令**不复制**原始表的数据或属性(如 `CLUSTER BY`、`TRANSIENT`、`COMPRESSION`),新表使用系统默认设置。 +此命令不包含原始表中的任何数据或属性(例如 `CLUSTER BY`、`TRANSIENT` 和 `COMPRESSION`),而是使用默认系统设置创建一个新表。 + +:::note 解决方法 + +- 在使用此命令创建新表时,可以显式指定 `TRANSIENT` 和 `COMPRESSION`。例如, -:::note 变通方案 -创建时可显式指定 `TRANSIENT` 和 `COMPRESSION`: ```sql create transient table t_new like t_old; + create table t_new compression='lz4' like t_old; ``` + ::: ## CREATE TABLE ... AS -通过 SELECT 查询结果创建表并填充数据。 +创建一个表,并用 SELECT 命令计算的数据填充它。 语法: + ```sql CREATE TABLE [IF NOT EXISTS] [db.]table_name AS SELECT query ``` -此命令**不复制**原始表属性(如 `CLUSTER BY`、`TRANSIENT`、`COMPRESSION`),新表使用系统默认设置。 +此命令不包含原始表中的任何属性(例如 CLUSTER BY、TRANSIENT 和 COMPRESSION),而是使用默认系统设置创建一个新表。 + +:::note 解决方法 + +- 在使用此命令创建新表时,可以显式指定 `TRANSIENT` 和 `COMPRESSION`。例如, -:::note 变通方案 -创建时可显式指定 `TRANSIENT` 和 `COMPRESSION`: ```sql create transient table t_new as select * from t_old; + create table t_new compression='lz4' as select * from t_old; ``` + ::: -## 列可空性(Column Nullability) +## 列的可空性 + +在 Databend 中,默认情况下**所有列都是可空的(NULL)**。如果需要一个不允许 NULL 值的列,请使用 NOT NULL 约束。更多信息,请参阅 [NULL 值和 NOT NULL 约束](../../../00-sql-reference/10-data-types/index.md)。 -Databend 中所有列默认**可为空(NULL)**。如需禁止 NULL 值,请使用 `NOT NULL` 约束。详见 [NULL 值与 NOT NULL 约束](../../../00-sql-reference/10-data-types/index.md)。 +## 列默认值 -## 列默认值(Column Default Values) +`DEFAULT ` 在未提供显式表达式时为列设置默认值。默认表达式可以是: -`DEFAULT ` 设置当未提供显式值时的列默认值,支持: -- 固定常量(如 `'Marketing'`) -- 无参数标量表达式(如 `NOW()`、`UUID()`) -- 序列动态生成值(如 `NEXTVAL(staff_id_seq)`) +- 一个固定常量,例如下面示例中 `department` 列的 `Marketing`。 +- 一个没有输入参数并返回标量值的表达式,例如 `1 + 1`、`NOW()` 或 `UUID()`。 +- 从序列中动态生成的值,例如下面示例中 `staff_id` 列的 `NEXTVAL(staff_id_seq)`。 + - NEXTVAL 必须作为独立的默认值使用;不支持类似 `NEXTVAL(seq1) + 1` 的表达式。 + - 用户必须遵守其被授予的序列使用权限,包括 [NEXTVAL](/sql/sql-functions/sequence-functions/nextval#access-control-requirements) 等操作。 ```sql CREATE SEQUENCE staff_id_seq; + CREATE TABLE staff ( - staff_id INT DEFAULT NEXTVAL(staff_id_seq), -- 从序列生成 + staff_id INT DEFAULT NEXTVAL(staff_id_seq), -- 如果未提供值,则从序列 'staff_id_seq' 中分配下一个数字 name VARCHAR(50), - department VARCHAR(50) DEFAULT 'Marketing' -- 固定默认值 + department VARCHAR(50) DEFAULT 'Marketing' -- 如果未提供值,则默认为 'Marketing' ); + +-- 当 COPY INTO 中不包含 staff_id 时,staff_id 会自动生成 +COPY INTO staff(name, department) FROM @stage ... + +-- staff_id 从暂存文件中加载 +COPY INTO staff FROM @stage ... +COPY INTO staff(staff_id, name, department) FROM @stage ... ``` -## 计算列(Computed Columns) +## 计算列 -通过标量表达式从其他列生成的列,当依赖列更新时自动重新计算。支持两种类型: -- **存储列(STORED)**:物理存储计算结果 -- **虚拟列(VIRTUAL)**:查询时动态计算 +计算列(Computed Column)是使用标量表达式从表中的其他列生成的列。当用于计算的任何列中的数据更新时,计算列将自动重新计算其值以反映更新。 + +Databend 支持两种类型的计算列:存储型(Stored)和虚拟型(Virtual)。存储型计算列物理存储在数据库中并占用存储空间,而虚拟型计算列不进行物理存储,其值在访问时动态计算。 + +Databend 支持两种创建计算列的语法选项:一种使用 `AS ()`,另一种使用 `GENERATED ALWAYS AS ()`。两种语法都允许指定计算列是存储型还是虚拟型。 -语法: ```sql --- 简写语法 -CREATE TABLE ... ( - AS () STORED|VIRTUAL +CREATE TABLE [IF NOT EXISTS] [db.]table_name +( + [ NOT NULL | NULL] AS () STORED | VIRTUAL, + [ NOT NULL | NULL] AS () STORED | VIRTUAL, + ... ) --- 完整语法 -CREATE TABLE ... ( - GENERATED ALWAYS AS () STORED|VIRTUAL +CREATE TABLE [IF NOT EXISTS] [db.]table_name +( + [NOT NULL | NULL] GENERATED ALWAYS AS () STORED | VIRTUAL, + [NOT NULL | NULL] GENERATED ALWAYS AS () STORED | VIRTUAL, + ... ) ``` -**存储列示例**:`total_price` 随 `price`/`quantity` 更新 +以下是创建存储型计算列的示例:每当 "price" 或 "quantity" 列的值更新时,"total_price" 列将自动重新计算并更新其存储值。 + ```sql -CREATE TABLE products ( +CREATE TABLE IF NOT EXISTS products ( id INT, price FLOAT64, quantity INT, @@ -139,9 +167,10 @@ CREATE TABLE products ( ); ``` -**虚拟列示例**:`full_name` 动态拼接 `first_name`/`last_name` +以下是创建虚拟型计算列的示例:"full_name" 列根据 "first_name" 和 "last_name" 列的当前值动态计算。它不占用额外的存储空间。每当访问 "first_name" 或 "last_name" 的值时,将计算并返回 "full_name" 列。 + ```sql -CREATE TABLE employees ( +CREATE TABLE IF NOT EXISTS employees ( id INT, first_name VARCHAR, last_name VARCHAR, @@ -149,31 +178,36 @@ CREATE TABLE employees ( ); ``` -:::tip 选择存储(STORED)还是虚拟(VIRTUAL)? -| 考量因素 | 存储列(STORED) | 虚拟列(VIRTUAL) | -|----------------|--------------------------------|--------------------------------| -| 存储空间 | 占用物理存储 | 不占用存储空间 | -| 实时性 | 写入时立即更新 | 查询时动态计算 | -| 数据一致性 | 始终保持最新 | 可能存在瞬时不一致 | -| 查询性能 | 读取速度快 | 计算增加查询开销 | -::: +:::tip STORED 还是 VIRTUAL? +在选择存储型计算列和虚拟型计算列时,请考虑以下因素: + +- 存储空间:存储型计算列会占用表中额外的存储空间,因为它们的计算值是物理存储的。如果你的数据库空间有限或希望最小化存储使用,虚拟型计算列可能是更好的选择。 + +- 实时更新:当依赖的列更新时,存储型计算列会立即更新其计算值。这确保了在查询时始终能获得最新的计算值。而虚拟型计算列在查询期间动态计算其值,这可能会略微增加处理时间。 + +- 数据完整性和一致性:存储型计算列在写入操作时更新其计算值,从而保持即时的数据一致性。然而,虚拟型计算列在查询时动态计算其值,这意味着在写入操作和后续查询之间可能存在短暂的不一致。 + ::: ## MySQL 兼容性 -Databend 与 MySQL 的主要差异在于数据类型和特定索引提示(Index Hints)。 +Databend 的语法与 MySQL 的主要区别在于数据类型和一些特定的索引提示。 ## 访问控制要求 -| 权限 | 对象类型 | 描述 | -|--------|--------------|--------------| -| CREATE | 全局, 表 | 创建表权限 | +| 权限 | 对象类型 | 描述 | +|:----------|:--------------|:-----------------------| +| CREATE | Global, Table | 创建表。 | + + +要创建表,执行操作的用户或 [current_role](/guides/security/access-control/roles) 必须具有 CREATE [权限](/guides/security/access-control/privileges#table-privileges)。 -用户或 [current_role](https://docs.databend.cn/guides/security/access-control/roles) 需具备 CREATE [权限](https://docs.databend.cn/guides/security/access-control/privileges#table-privileges)。 ## 示例 -### 基础建表 -创建带默认值的表: +### 创建表 + +创建一个列带有默认值的表(在本例中,`genre` 列的默认值为 'General'): + ```sql CREATE TABLE books ( id BIGINT UNSIGNED, @@ -181,13 +215,30 @@ CREATE TABLE books ( genre VARCHAR DEFAULT 'General' ); ``` -插入验证默认值: + +描述该表以确认其结构和 `genre` 列的默认值: + ```sql -INSERT INTO books(id, title) VALUES(1, 'Invisible Stars'); -SELECT * FROM books; +DESC books; ++-------+-----------------+------+---------+-------+ +| Field | Type | Null | Default | Extra | ++-------+-----------------+------+---------+-------+ +| id | BIGINT UNSIGNED | YES | 0 | | +| title | VARCHAR | YES | "" | | +| genre | VARCHAR | YES | 'General'| | ++-------+-----------------+------+---------+-------+ ``` -结果: + +插入一行时不指定 `genre`: + +```sql +INSERT INTO books(id, title) VALUES(1, 'Invisible Stars'); ``` + +查询该表,注意 `genre` 列已被设置为默认值 'General': + +```sql +SELECT * FROM books; +----+----------------+---------+ | id | title | genre | +----+----------------+---------+ @@ -195,58 +246,129 @@ SELECT * FROM books; +----+----------------+---------+ ``` -### 结构复制 -基于现有表结构创建: +### 创建表 ... Like + +创建一个新表(`books_copy`),其结构与现有表(`books`)相同: + ```sql CREATE TABLE books_copy LIKE books; -DESC books_copy; -- 验证结构复制 ``` -### 查询建表 -通过 SELECT 结果创建: +检查新表的结构: + +```sql +DESC books_copy; ++-------+-----------------+------+---------+-------+ +| Field | Type | Null | Default | Extra | ++-------+-----------------+------+---------+-------+ +| id | BIGINT UNSIGNED | YES | 0 | | +| title | VARCHAR | YES | "" | | +| genre | VARCHAR | YES | 'General'| | ++-------+-----------------+------+---------+-------+ +``` + +向新表中插入一行,注意 `genre` 列的默认值已被复制: + +```sql +INSERT INTO books_copy(id, title) VALUES(1, 'Invisible Stars'); + +SELECT * FROM books_copy; ++----+----------------+---------+ +| id | title | genre | ++----+----------------+---------+ +| 1 | Invisible Stars| General | ++----+----------------+---------+ +``` + +### 创建表 ... As + +创建一个新表(`books_backup`),其中包含现有表(`books`)的数据: + ```sql CREATE TABLE books_backup AS SELECT * FROM books; -DESC books_backup; -- 注意默认值未复制 ``` -### 计算列应用 -**存储列示例**:自动计算总额 +描述新表,注意 `genre` 列的默认值未被复制: + ```sql -CREATE TABLE products ( - id INT, price FLOAT64, quantity INT, - total_price FLOAT64 AS (price * quantity) STORED -); -INSERT INTO products VALUES (1,10.5,3), (2,15.2,5); -SELECT * FROM products; +DESC books_backup; ++-------+-----------------+------+---------+-------+ +| Field | Type | Null | Default | Extra | ++-------+-----------------+------+---------+-------+ +| id | BIGINT UNSIGNED | NO | 0 | | +| title | VARCHAR | NO | "" | | +| genre | VARCHAR | NO | NULL | | ++-------+-----------------+------+---------+-------+ ``` -结果: + +查询新表,注意原始表的数据已被复制: + +```sql +SELECT * FROM books_backup; ++----+----------------+---------+ +| id | title | genre | ++----+----------------+---------+ +| 1 | Invisible Stars| General | ++----+----------------+---------+ ``` + +### 创建表 ... 列 AS STORED | VIRTUAL + +以下示例演示了一个带有存储型计算列的表,该列会根据 "price" 或 "quantity" 列的更新自动重新计算: + +```sql +-- 创建带有存储型计算列的表 +CREATE TABLE IF NOT EXISTS products ( + id INT, + price FLOAT64, + quantity INT, + total_price FLOAT64 AS (price * quantity) STORED +); + +-- 向表中插入数据 +INSERT INTO products (id, price, quantity) +VALUES (1, 10.5, 3), + (2, 15.2, 5), + (3, 8.7, 2); + +-- 查询表以查看计算列 +SELECT id, price, quantity, total_price +FROM products; + +--- +------+-------+----------+-------------+ | id | price | quantity | total_price | +------+-------+----------+-------------+ | 1 | 10.5 | 3 | 31.5 | | 2 | 15.2 | 5 | 76.0 | +| 3 | 8.7 | 2 | 17.4 | +------+-------+----------+-------------+ ``` -**虚拟列示例**:动态解析 JSON +在此示例中,我们创建一个名为 `student_profiles` 的表,其中包含一个名为 `profile` 的 Variant 类型列,用于存储 JSON 数据。我们还添加了一个名为 `age` 的虚拟计算列,它从 `profile` 列中提取 `age` 属性并将其转换为整数。 + ```sql +-- 创建带有虚拟型计算列的表 CREATE TABLE student_profiles ( id STRING, profile VARIANT, age INT NULL AS (profile['age']::INT) VIRTUAL ); -INSERT INTO student_profiles VALUES - ('d78236', '{"name":"Arthur","age":"16"}'), - ('t63512', '{"name":"Ernie"}'); -SELECT id, age FROM student_profiles; -``` -结果: -``` -+--------+------+ -| id | age | -+--------+------+ -| d78236 | 16 | -| t63512 | NULL | -+--------+------+ + +-- 向表中插入数据 +INSERT INTO student_profiles (id, profile) VALUES + ('d78236', '{"id": "d78236", "name": "Arthur Read", "age": "16", "school": "PVPHS", "credits": 120, "sports": "none"}'), + ('f98112', '{"name": "Buster Bunny", "age": "15", "id": "f98112", "school": "TEO", "credits": 67, "clubs": "MUN"}'), + ('t63512', '{"name": "Ernie Narayan", "school" : "Brooklyn Tech", "id": "t63512", "sports": "Track and Field", "clubs": "Chess"}'); + +-- 查询表以查看计算列 +SELECT * FROM student_profiles; + ++--------+------------------------------------------------------------------------------------------------------------+------+ +| id | profile | age | ++--------+------------------------------------------------------------------------------------------------------------+------+ +| d78236 | `{"age":"16","credits":120,"id":"d78236","name":"Arthur Read","school":"PVPHS","sports":"none"}` | 16 | +| f98112 | `{"age":"15","clubs":"MUN","credits":67,"id":"f98112","name":"Buster Bunny","school":"TEO"}` | 15 | +| t63512 | `{"clubs":"Chess","id":"t63512","name":"Ernie Narayan","school":"Brooklyn Tech","sports":"Track and Field"}` | NULL | ++--------+------------------------------------------------------------------------------------------------------------+------+ ``` \ No newline at end of file From d45bda91288812f31e10868f700c784e8d556d61 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 5 Aug 2025 04:40:45 +0000 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=8C=90=20Translate=2001-privileges.md?= =?UTF-8?q?=20to=20Simplified-Chinese?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../00-ddl/04-sequence/create-sequence.md | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/docs/cn/sql-reference/10-sql-commands/00-ddl/04-sequence/create-sequence.md b/docs/cn/sql-reference/10-sql-commands/00-ddl/04-sequence/create-sequence.md index cb9345bf1c..951d206966 100644 --- a/docs/cn/sql-reference/10-sql-commands/00-ddl/04-sequence/create-sequence.md +++ b/docs/cn/sql-reference/10-sql-commands/00-ddl/04-sequence/create-sequence.md @@ -5,14 +5,14 @@ sidebar_position: 1 import FunctionDescription from '@site/src/components/FunctionDescription'; - + -在 Databend 中创建一个新的序列。 +在 Databend 中创建一个新的序列(Sequence)。 -序列是一种用于自动生成唯一数值标识符的对象,通常用于为表中的行分配不同的标识符,例如用户 ID 列。通常,序列从指定的值开始,并按指定的量递增。 +序列(Sequence)是一种用于自动生成唯一数字标识符的对象,常用于为表中的行分配唯一标识符,例如用户 ID 列。通常,序列从指定值开始,并按指定量递增。 :::note -Databend 中的序列当前从 1 开始,并递增 1。虽然序列保证唯一值,但它们**不**确保连续性(即,没有间隙)。 +Databend 中的序列目前从 1 开始,并以 1 为步长递增。虽然序列保证值的唯一性,但**不**保证其连续性(即没有间隙)。 ::: ## 语法 @@ -21,30 +21,49 @@ Databend 中的序列当前从 1 开始,并递增 1。虽然序列保证唯一 CREATE [ OR REPLACE ] SEQUENCE [IF NOT EXISTS] ``` -| 参数 | 描述 | -| ------------ | -------------------- | +| 参数 | 说明 | +|--------------|-----------------------------------------| | `` | 要创建的序列的名称。 | +## 访问控制要求 + +| 权限 | 对象类型 | 说明 | +|:----------------|:------------|:----------------------| +| CREATE SEQUENCE | 全局 | 创建一个序列。 | + + +要创建一个序列,执行操作的用户或 [current_role](/guides/security/access-control/roles) 必须拥有 CREATE SEQUENCE [权限](/guides/security/access-control/privileges)。 + +:::note + +`enable_experimental_sequence_rbac_check` 设置用于控制序列级别的访问控制。默认情况下,此功能是禁用的。 +创建序列仅要求用户拥有超级用户权限,从而绕过详细的 RBAC 检查。 +启用后,在创建序列时将强制执行精细的权限验证。 + +这是一个实验性功能,未来可能会默认启用。 + +::: + ## 示例 -此示例展示了如何使用序列和 [NEXTVAL](/sql/sql-functions/sequence-functions/nextval) 函数来自动生成唯一标识符并将其分配给表中的行。 +此示例展示了如何使用序列和 [NEXTVAL](/sql/sql-functions/sequence-functions/nextval) 函数为表中的行自动生成并分配唯一标识符。 ```sql -- 创建一个名为 staff_id_seq 的新序列 CREATE SEQUENCE staff_id_seq; --- 创建一个名为 staff 的新表,其中包含 staff_id、name 和 department 列 +-- 创建一个名为 staff 的新表,包含 staff_id、name 和 department 列 CREATE TABLE staff ( staff_id INT, name VARCHAR(50), department VARCHAR(50) ); --- 将新行插入到 staff 表中,使用 staff_id_seq 序列的下一个值作为 staff_id 列 +-- 向 staff 表中插入新行,使用 staff_id_seq 序列的下一个值为 staff_id 列赋值 INSERT INTO staff (staff_id, name, department) VALUES (NEXTVAL(staff_id_seq), 'John Doe', 'HR'); --- 将另一行插入到 staff 表中,使用 staff_id_seq 序列的下一个值作为 staff_id 列 +-- 向 staff 表中插入另一行,使用 staff_id_seq 序列的下一个值为 staff_id 列赋值 INSERT INTO staff (staff_id, name, department) VALUES (NEXTVAL(staff_id_seq), 'Jane Smith', 'Finance'); @@ -56,4 +75,4 @@ SELECT * FROM staff; │ 2 │ Jane Smith │ Finance │ │ 1 │ John Doe │ HR │ └───────────────────────────────────────────────────────┘ -``` +``` \ No newline at end of file From 1adf5a968ddd5c650a3d57b3c048b3edbd9b1f34 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 5 Aug 2025 04:41:22 +0000 Subject: [PATCH 5/5] =?UTF-8?q?=F0=9F=8C=90=20Translate=2001-privileges.md?= =?UTF-8?q?=20to=20Simplified-Chinese?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../18-sequence-functions/nextval.md | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/docs/cn/sql-reference/20-sql-functions/18-sequence-functions/nextval.md b/docs/cn/sql-reference/20-sql-functions/18-sequence-functions/nextval.md index a6370899d5..a266609719 100644 --- a/docs/cn/sql-reference/20-sql-functions/18-sequence-functions/nextval.md +++ b/docs/cn/sql-reference/20-sql-functions/18-sequence-functions/nextval.md @@ -3,11 +3,11 @@ title: NEXTVAL --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + -从序列中检索下一个值。 +从序列(Sequence)中获取下一个值。 -## 句法 +## 语法 ```sql NEXTVAL() @@ -15,11 +15,29 @@ NEXTVAL() ## 返回类型 -Integer. +整数(Integer)。 + +## 访问控制要求 + +| 权限 | 对象类型 | 描述 | +|:----------------|:------------|:------------| +| ACCESS SEQUENCE | SEQUENCE | 访问序列。 | + +要访问序列,执行操作的用户或其角色必须拥有 ACCESS SEQUENCE [权限](/guides/security/access-control/privileges)。 + +:::note + +`enable_experimental_sequence_rbac_check` 设置控制序列级访问控制,默认禁用。 +创建序列仅需超级用户权限,跳过详细 RBAC 检查。 +启用后,在创建序列时将强制执行细粒度权限验证。 + +此为实验性功能,未来可能默认启用。 + +::: ## 示例 -此示例演示了 NEXTVAL 函数如何与序列一起使用: +以下示例展示 NEXTVAL 函数与序列的配合使用: ```sql CREATE SEQUENCE my_seq; @@ -36,24 +54,24 @@ SELECT └─────────────────────────────────────────────────────┘ ``` -此示例展示了如何使用序列和 NEXTVAL 函数来自动生成唯一标识符并将其分配给表中的行。 +以下示例演示如何利用序列和 NEXTVAL 函数为表中的行自动生成并分配唯一标识符: ```sql --- 创建一个名为 staff_id_seq 的新序列 +-- 创建名为 staff_id_seq 的新序列 CREATE SEQUENCE staff_id_seq; --- 创建一个名为 staff 的新表,其中包含自动生成的 staff_id +-- 创建名为 staff 的新表,staff_id 自动递增 CREATE TABLE staff ( staff_id INT DEFAULT NEXTVAL(staff_id_seq), name VARCHAR(50), department VARCHAR(50) ); --- 将具有自动生成的 staff_id 的新员工插入到 staff 表中 +-- 向 staff 表插入新员工,staff_id 自动生成 INSERT INTO staff (name, department) VALUES ('John Doe', 'HR'); --- 插入另一行 +-- 再插入一行 INSERT INTO staff (name, department) VALUES ('Jane Smith', 'Finance');