From da5f686d986bf9f7ac304c41ac4e36b698748b97 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 10 Oct 2025 04:22:53 +0000 Subject: [PATCH 1/3] [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 4b4ceb2a37..3c243361c6 100644 --- a/.translation-init +++ b/.translation-init @@ -1 +1 @@ -Translation initialization: 2025-09-28T10:54:57.348199 +Translation initialization: 2025-10-10T04:22:52.845761 From b0b37359123a8b896ff86aa640827a5bbcfa92b6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 10 Oct 2025 04:24:28 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=8C=90=20Translate=2010-ddl-create-ta?= =?UTF-8?q?ble.md=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 | 299 ++++++------------ 1 file changed, 104 insertions(+), 195 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 0c9faede92..8f2e942116 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,32 +1,33 @@ +--- title: CREATE TABLE sidebar_position: 1 --- import FunctionDescription from '@site/src/components/FunctionDescription'; - + import EEFeature from '@site/src/components/EEFeature'; -对许多数据库来说,创建表是最复杂的操作之一,因为你可能需要: +在许多数据库中,创建表是最复杂的操作之一,因为你可能需要: -- 手动指定引擎 -- 手动指定索引 -- 甚至指定数据分区或数据分片 +- 手动指定引擎 +- 手动指定索引 +- 甚至指定数据分区或分片 -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 查询结果作为数据插入。 另请参阅: -- [CREATE TEMP TABLE](10-ddl-create-temp-table.md) -- [CREATE TRANSIENT TABLE](10-ddl-create-transient-table.md) -- [CREATE EXTERNAL TABLE](10-ddl-create-table-external-location.md) +- [CREATE TEMP TABLE](10-ddl-create-temp-table.md) +- [CREATE TRANSIENT TABLE](10-ddl-create-transient-table.md) +- [CREATE EXTERNAL TABLE](10-ddl-create-table-external-location.md) ## CREATE TABLE @@ -34,7 +35,12 @@ Databend 的设计目标是易于使用,在创建表时不需要进行任何 CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ] [ . ] ( [ NOT NULL | NULL ] - [ { DEFAULT } ] + [ { DEFAULT + | { AUTOINCREMENT | IDENTITY } + [ { ( , ) + | START INCREMENT } ] + [ { ORDER | NOORDER } ] + } ] [ AS () STORED | VIRTUAL ] [ COMMENT '' ], ... @@ -44,16 +50,14 @@ CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ] [ . ] :::note -- 有关 Databend 中可用的数据类型,请参阅 [数据类型](../../../00-sql-reference/10-data-types/index.md)。 - -- Databend 建议在命名列时尽量避免使用特殊字符。但是,如果在某些情况下必须使用特殊字符,别名应使用反引号括起来,例如:CREATE TABLE price(\`$CA\` int); - -- Databend 会自动将列名转换为小写。例如,如果你将一列命名为 _Total_,它在结果中将显示为 _total_。 - ::: +- 关于 Databend 支持的数据类型,参见 [数据类型](../../../00-sql-reference/10-data-types/index.md)。 +- 建议列名避免特殊字符;如必须使用,请用反引号包裹,例如:CREATE TABLE price(\`$CA\` int); +- Databend 会自动将列名转为小写。例如列名 _Total_ 在结果中显示为 _total_。 +::: ## CREATE TABLE ... LIKE -创建一个与现有表具有相同列定义的表。现有表的列名、数据类型及其非空约束将被复制到新表中。 +按已有表的列定义创建新表,复制列名、数据类型及非 NULL 约束,但不复制数据及其他属性(如 `CLUSTER BY`、`TRANSIENT`、`COMPRESSION`)。 语法: @@ -62,23 +66,19 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name LIKE [db.]origin_table_name ``` -此命令不包含原始表中的任何数据或属性(例如 `CLUSTER BY`、`TRANSIENT` 和 `COMPRESSION`),而是使用默认系统设置创建一个新表。 - :::note 解决方法 -- 在使用此命令创建新表时,可以显式指定 `TRANSIENT` 和 `COMPRESSION`。例如, +可显式指定 `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 查询结果填充数据,不继承原表的任何属性(如 CLUSTER BY、TRANSIENT、COMPRESSION)。 语法: @@ -87,90 +87,100 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name AS SELECT query ``` -此命令不包含原始表中的任何属性(例如 CLUSTER BY、TRANSIENT 和 COMPRESSION),而是使用默认系统设置创建一个新表。 - :::note 解决方法 -- 在使用此命令创建新表时,可以显式指定 `TRANSIENT` 和 `COMPRESSION`。例如, +可显式指定 `TRANSIENT` 或 `COMPRESSION`: ```sql create transient table t_new as select * from t_old; - create table t_new compression='lz4' as select * from t_old; ``` - ::: ## 列的可空性 -在 Databend 中,默认情况下**所有列都是可空的(NULL)**。如果需要一个不允许 NULL 值的列,请使用 NOT NULL 约束。更多信息,请参阅 [NULL 值和 NOT NULL 约束](../../../00-sql-reference/10-data-types/index.md)。 +默认情况下,**所有列都允许 NULL**。如需禁止 NULL,请使用 NOT NULL 约束。详见 [NULL 值与 NOT NULL 约束](../../../00-sql-reference/10-data-types/index.md)。 ## 列默认值 -`DEFAULT ` 在未提供显式表达式时为列设置默认值。默认表达式可以是: +`DEFAULT ` 为列设置默认值,支持: + +- 固定常量,如 `Marketing` +- 无入参的标量表达式,如 `1 + 1`、`NOW()`、`UUID()` +- 序列动态值,如 `NEXTVAL(staff_id_seq)` + - NEXTVAL 必须独立使用,不支持 `NEXTVAL(seq1) + 1` + - 需具备相应序列权限 + +## 自增列 -- 一个固定常量,例如下面示例中 `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) 等操作。 + + +使用 `AUTOINCREMENT` 或 `IDENTITY` 创建自增列,自动生成顺序数字,常用于唯一标识。 + +**语法:** ```sql -CREATE SEQUENCE staff_id_seq; +{ AUTOINCREMENT | IDENTITY } + [ { ( , ) + | START INCREMENT } ] + [ { ORDER | NOORDER } ] +``` + +**参数:** -CREATE TABLE staff ( - staff_id INT DEFAULT NEXTVAL(staff_id_seq), -- 如果未提供值,则从序列 'staff_id_seq' 中分配下一个数字 - name VARCHAR(50), - department VARCHAR(50) DEFAULT 'Marketing' -- 如果未提供值,则默认为 'Marketing' +- `start_num`:起始值(默认 1) +- `step_num`:步长(默认 1) +- `ORDER`:保证单调递增(可能有间隙) +- `NOORDER`:不保证顺序(默认) + +**要点:** + +- 内部由序列实现 +- 删除列时关联序列一并删除 +- 未指定值时自动生成 +- `AUTOINCREMENT` 与 `IDENTITY` 等价 + +**示例:** + +```sql +CREATE TABLE users ( + user_id BIGINT AUTOINCREMENT, + order_id BIGINT AUTOINCREMENT START 100 INCREMENT 10, + username VARCHAR ); --- 当 COPY INTO 中不包含 staff_id 时,staff_id 会自动生成 -COPY INTO staff(name, department) FROM @stage ... +INSERT INTO users (username) VALUES ('alice'), ('bob'), ('charlie'); --- staff_id 从暂存文件中加载 -COPY INTO staff FROM @stage ... -COPY INTO staff(staff_id, name, department) FROM @stage ... +SELECT * FROM users; ``` ## 计算列 -计算列(Computed Column)是使用标量表达式从表中的其他列生成的列。当用于计算的任何列中的数据更新时,计算列将自动重新计算其值以反映更新。 +计算列通过标量表达式由其他列生成,支持两种类型: -Databend 支持两种类型的计算列:存储型(Stored)和虚拟型(Virtual)。存储型计算列物理存储在数据库中并占用存储空间,而虚拟型计算列不进行物理存储,其值在访问时动态计算。 +- **STORED**:值持久化存储,依赖列变更时自动更新 +- **VIRTUAL**:查询时实时计算,节省存储 -Databend 支持两种创建计算列的语法选项:一种使用 `AS ()`,另一种使用 `GENERATED ALWAYS AS ()`。两种语法都允许指定计算列是存储型还是虚拟型。 +**语法:** ```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name -( - [ NOT NULL | NULL] AS () STORED | VIRTUAL, - [ NOT NULL | NULL] 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, - ... -) + [ NOT NULL | NULL ] AS () { STORED | VIRTUAL } + [ NOT NULL | NULL ] GENERATED ALWAYS AS () { STORED | VIRTUAL } ``` -以下是创建存储型计算列的示例:每当 "price" 或 "quantity" 列的值更新时,"total_price" 列将自动重新计算并更新其存储值。 +**示例:** ```sql -CREATE TABLE IF NOT EXISTS products ( +-- STORED:物理存储,立即更新 +CREATE TABLE products ( id INT, price FLOAT64, quantity INT, total_price FLOAT64 AS (price * quantity) STORED ); -``` - -以下是创建虚拟型计算列的示例:"full_name" 列根据 "first_name" 和 "last_name" 列的当前值动态计算。它不占用额外的存储空间。每当访问 "first_name" 或 "last_name" 的值时,将计算并返回 "full_name" 列。 -```sql -CREATE TABLE IF NOT EXISTS employees ( +-- VIRTUAL:查询时计算,无存储开销 +CREATE TABLE employees ( id INT, first_name VARCHAR, last_name VARCHAR, @@ -178,35 +188,27 @@ CREATE TABLE IF NOT EXISTS employees ( ); ``` -:::tip STORED 还是 VIRTUAL? -在选择存储型计算列和虚拟型计算列时,请考虑以下因素: - -- 存储空间:存储型计算列会占用表中额外的存储空间,因为它们的计算值是物理存储的。如果你的数据库空间有限或希望最小化存储使用,虚拟型计算列可能是更好的选择。 - -- 实时更新:当依赖的列更新时,存储型计算列会立即更新其计算值。这确保了在查询时始终能获得最新的计算值。而虚拟型计算列在查询期间动态计算其值,这可能会略微增加处理时间。 - -- 数据完整性和一致性:存储型计算列在写入操作时更新其计算值,从而保持即时的数据一致性。然而,虚拟型计算列在查询时动态计算其值,这意味着在写入操作和后续查询之间可能存在短暂的不一致。 - ::: +:::tip +频繁查询且对性能敏感时选 **STORED**;计算成本可接受且需节省空间时选 **VIRTUAL**。 +::: ## MySQL 兼容性 -Databend 的语法与 MySQL 的主要区别在于数据类型和一些特定的索引提示。 +Databend 语法与 MySQL 的差异主要在数据类型及部分索引提示。 ## 访问控制要求 -| 权限 | 对象类型 | 描述 | -|:----------|:--------------|:-----------------------| -| CREATE | Global, Table | 创建表。 | - - -要创建表,执行操作的用户或 [current_role](/guides/security/access-control/roles) 必须具有 CREATE [权限](/guides/security/access-control/privileges#table-privileges)。 +| 权限 | 对象类型 | 描述 | +|:-------|:-----------|:---------| +| CREATE | 全局、表 | 创建表 | +创建表时,用户或 [current_role](/guides/security/access-control/roles) 需具备 CREATE [权限](/guides/security/access-control/privileges#table-privileges)。 ## 示例 ### 创建表 -创建一个列带有默认值的表(在本例中,`genre` 列的默认值为 'General'): +创建带默认值的表: ```sql CREATE TABLE books ( @@ -216,108 +218,43 @@ CREATE TABLE books ( ); ``` -描述该表以确认其结构和 `genre` 列的默认值: +查看表结构: ```sql 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 | -+----+----------------+---------+ -| 1 | Invisible Stars| General | -+----+----------------+---------+ ``` -### 创建表 ... Like +### CREATE TABLE ... LIKE -创建一个新表(`books_copy`),其结构与现有表(`books`)相同: +按结构创建新表: ```sql CREATE TABLE books_copy LIKE books; ``` -检查新表的结构: - -```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 +### CREATE TABLE ... AS -创建一个新表(`books_backup`),其中包含现有表(`books`)的数据: +创建并复制数据: ```sql CREATE TABLE books_backup AS SELECT * FROM books; ``` -描述新表,注意 `genre` 列的默认值未被复制: - -```sql -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, @@ -325,50 +262,22 @@ CREATE TABLE IF NOT EXISTS products ( 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; +INSERT INTO products VALUES (1,10.5,3),(2,15.2,5),(3,8.7,2); ---- -+------+-------+----------+-------------+ -| id | price | quantity | total_price | -+------+-------+----------+-------------+ -| 1 | 10.5 | 3 | 31.5 | -| 2 | 15.2 | 5 | 76.0 | -| 3 | 8.7 | 2 | 17.4 | -+------+-------+----------+-------------+ +SELECT * FROM products; ``` -在此示例中,我们创建一个名为 `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 (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"}'); +INSERT INTO student_profiles VALUES + ('d78236','{"id":"d78236","name":"Arthur Read","age":"16"}'), + ('f98112','{"name":"Buster Bunny","age":"15","id":"f98112"}'), + ('t63512','{"name":"Ernie Narayan","id":"t63512"}'); --- 查询表以查看计算列 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 470e529e6e1e0b04e9681f28e504d5723b08f516 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 10 Oct 2025 04:25:03 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=8C=90=20Translate=2010-ddl-create-ta?= =?UTF-8?q?ble.md=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 | 73 +++++++++++++------ 1 file changed, 49 insertions(+), 24 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 951d206966..cae54d6622 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,65 +5,62 @@ sidebar_position: 1 import FunctionDescription from '@site/src/components/FunctionDescription'; - + 在 Databend 中创建一个新的序列(Sequence)。 -序列(Sequence)是一种用于自动生成唯一数字标识符的对象,常用于为表中的行分配唯一标识符,例如用户 ID 列。通常,序列从指定值开始,并按指定量递增。 - -:::note -Databend 中的序列目前从 1 开始,并以 1 为步长递增。虽然序列保证值的唯一性,但**不**保证其连续性(即没有间隙)。 -::: +序列(Sequence)是一种自动生成唯一数字标识符的对象,通常用于为表行分配不同的值(例如用户 ID)。虽然序列保证值的唯一性,但**不**保证连续性(即可能出现间隙)。 ## 语法 ```sql -CREATE [ OR REPLACE ] SEQUENCE [IF NOT EXISTS] +CREATE [ OR REPLACE ] SEQUENCE [ IF NOT EXISTS ] + [ START [ = ] ] + [ INCREMENT [ = ] ] ``` -| 参数 | 说明 | -|--------------|-----------------------------------------| -| `` | 要创建的序列的名称。 | +| 参数 | 描述 | 默认值 | +|----------------|------------------------------------------------|--------| +| `` | 要创建的序列名称。 | - | +| `START` | 序列的初始值。 | 1 | +| `INCREMENT` | 每次调用 NEXTVAL 时的增量值。 | 1 | ## 访问控制要求 -| 权限 | 对象类型 | 说明 | -|:----------------|:------------|:----------------------| -| CREATE SEQUENCE | 全局 | 创建一个序列。 | - +| 权限 | 对象类型 | 描述 | +|:----------------|:---------|:---------------| +| CREATE SEQUENCE | 全局 | 创建序列。 | -要创建一个序列,执行操作的用户或 [current_role](/guides/security/access-control/roles) 必须拥有 CREATE SEQUENCE [权限](/guides/security/access-control/privileges)。 +要创建序列,执行操作的用户或 [current_role](/guides/security/access-control/roles) 必须拥有 CREATE SEQUENCE [权限](/guides/security/access-control/privileges)。 :::note -`enable_experimental_sequence_rbac_check` 设置用于控制序列级别的访问控制。默认情况下,此功能是禁用的。 -创建序列仅要求用户拥有超级用户权限,从而绕过详细的 RBAC 检查。 -启用后,在创建序列时将强制执行精细的权限验证。 +`enable_experimental_sequence_rbac_check` 设置控制序列级别的访问控制,默认禁用。 +此时创建序列仅需用户拥有超级用户权限,绕过详细的 RBAC 检查。 +启用后,将在创建序列时执行细粒度权限验证。 -这是一个实验性功能,未来可能会默认启用。 +该功能为实验性质,未来可能默认开启。 ::: ## 示例 -此示例展示了如何使用序列和 [NEXTVAL](/sql/sql-functions/sequence-functions/nextval) 函数为表中的行自动生成并分配唯一标识符。 +### 基本序列 + +使用默认设置创建序列(从 1 开始,步长为 1): ```sql --- 创建一个名为 staff_id_seq 的新序列 CREATE SEQUENCE staff_id_seq; --- 创建一个名为 staff 的新表,包含 staff_id、name 和 department 列 CREATE TABLE staff ( staff_id INT, name VARCHAR(50), department VARCHAR(50) ); --- 向 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 列赋值 INSERT INTO staff (staff_id, name, department) VALUES (NEXTVAL(staff_id_seq), 'Jane Smith', 'Finance'); @@ -75,4 +72,32 @@ SELECT * FROM staff; │ 2 │ Jane Smith │ Finance │ │ 1 │ John Doe │ HR │ └───────────────────────────────────────────────────────┘ +``` + +### 自定义起始值与步长 + +创建从 1000 开始、步长为 10 的序列: + +```sql +CREATE SEQUENCE order_id_seq START = 1000 INCREMENT = 10; + +CREATE TABLE orders ( + order_id BIGINT, + order_name VARCHAR(100) +); + +INSERT INTO orders (order_id, order_name) +VALUES (NEXTVAL(order_id_seq), 'Order A'); + +INSERT INTO orders (order_id, order_name) +VALUES (NEXTVAL(order_id_seq), 'Order B'); + +SELECT * FROM orders; + +┌──────────────────────────────────┐ +│ order_id │ order_name │ +├────────────────┼─────────────────┤ +│ 1000 │ Order A │ +│ 1010 │ Order B │ +└──────────────────────────────────┘ ``` \ No newline at end of file