- 安装
- 文档
- 入门
- 连接
- 数据导入
- 客户端 API
- 概览
- ADBC
- C
- C++
- CLI
- Dart
- Go
- Java (JDBC)
- Julia
- Node.js (已弃用)
- Node.js (Neo)
- ODBC
- PHP
- Python
- R
- Rust
- Swift
- Wasm
- SQL
- 介绍
- 语句
- 概览
- ANALYZE
- ALTER TABLE
- ALTER VIEW
- ATTACH 和 DETACH
- CALL
- CHECKPOINT
- COMMENT ON
- COPY
- CREATE INDEX
- CREATE MACRO
- CREATE SCHEMA
- CREATE SECRET
- CREATE SEQUENCE
- CREATE TABLE
- CREATE VIEW
- CREATE TYPE
- DELETE
- DESCRIBE
- DROP
- EXPORT 和 IMPORT DATABASE
- INSERT
- LOAD / INSTALL
- PIVOT
- 性能分析
- SELECT
- SET / RESET
- SET VARIABLE
- SUMMARIZE
- 事务管理
- UNPIVOT
- UPDATE
- USE
- VACUUM
- 查询语法
- SELECT
- FROM 和 JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT 和 OFFSET
- SAMPLE
- 展开嵌套
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- 集合操作
- 预处理语句
- 数据类型
- 表达式
- 函数
- 概览
- 聚合函数
- 数组函数
- 位字符串函数
- Blob 函数
- 日期格式化函数
- 日期函数
- 日期部分函数
- 枚举函数
- 间隔函数
- Lambda 函数
- 列表函数
- 映射函数
- 嵌套函数
- 数值函数
- 模式匹配
- 正则表达式
- 结构体函数
- 文本函数
- 时间函数
- 时间戳函数
- 带时区时间戳函数
- 联合函数
- 实用函数
- 窗口函数
- 约束
- 索引
- 元查询
- DuckDB 的 SQL 方言
- 示例
- 配置
- 扩展
- 核心扩展
- 概览
- 自动补全
- Avro
- AWS
- Azure
- Delta
- DuckLake
- 编码
- Excel
- 全文搜索
- httpfs (HTTP 和 S3)
- Iceberg
- ICU
- inet
- jemalloc
- MySQL
- PostgreSQL
- 空间
- SQLite
- TPC-DS
- TPC-H
- UI
- VSS
- 指南
- 概览
- 数据查看器
- 数据库集成
- 文件格式
- 概览
- CSV 导入
- CSV 导出
- 直接读取文件
- Excel 导入
- Excel 导出
- JSON 导入
- JSON 导出
- Parquet 导入
- Parquet 导出
- 查询 Parquet 文件
- 使用 file: 协议访问文件
- 网络和云存储
- 概览
- HTTP Parquet 导入
- S3 Parquet 导入
- S3 Parquet 导出
- S3 Iceberg 导入
- S3 Express One
- GCS 导入
- Cloudflare R2 导入
- 通过 HTTPS / S3 使用 DuckDB
- Fastly 对象存储导入
- 元查询
- ODBC
- 性能
- Python
- 安装
- 执行 SQL
- Jupyter Notebooks
- marimo Notebooks
- Pandas 上的 SQL
- 从 Pandas 导入
- 导出到 Pandas
- 从 Numpy 导入
- 导出到 Numpy
- Arrow 上的 SQL
- 从 Arrow 导入
- 导出到 Arrow
- Pandas 上的关系型 API
- 多个 Python 线程
- 与 Ibis 集成
- 与 Polars 集成
- 使用 fsspec 文件系统
- SQL 编辑器
- SQL 功能
- 代码片段
- 故障排除
- 术语表
- 离线浏览
- 操作手册
- 开发
- 内部结构
- 为什么选择 DuckDB
- 行为准则
- 发布日历
- 路线图
- 站点地图
- 在线演示
CREATE SEQUENCE
语句用于创建新的序列号生成器。
示例
生成从 1 开始的升序序列
CREATE SEQUENCE serial;
从给定起始数字生成序列
CREATE SEQUENCE serial START 101;
使用 INCREMENT BY
生成奇数
CREATE SEQUENCE serial START WITH 1 INCREMENT BY 2;
生成从 99 开始的降序序列
CREATE SEQUENCE serial START WITH 99 INCREMENT BY -1 MAXVALUE 99;
默认情况下,不允许循环,否则将导致错误,例如:
Sequence Error:
nextval: reached maximum value of sequence "serial" (10)
CREATE SEQUENCE serial START WITH 1 MAXVALUE 10;
CYCLE
允许重复循环相同的序列
CREATE SEQUENCE serial START WITH 1 MAXVALUE 10 CYCLE;
创建和删除序列
序列的创建和删除方式与其他目录项类似。
覆盖现有序列
CREATE OR REPLACE SEQUENCE serial;
仅当序列尚不存在时才创建
CREATE SEQUENCE IF NOT EXISTS serial;
删除序列
DROP SEQUENCE serial;
如果序列存在则删除
DROP SEQUENCE IF EXISTS serial;
将序列用于主键
序列可以为表提供整数主键。例如:
CREATE SEQUENCE id_sequence START 1;
CREATE TABLE tbl (id INTEGER DEFAULT nextval('id_sequence'), s VARCHAR);
INSERT INTO tbl (s) VALUES ('hello'), ('world');
SELECT * FROM tbl;
该脚本生成以下表格
id | s |
---|---|
1 | hello |
2 | world |
序列也可以使用 ALTER TABLE
语句添加。以下示例添加了一个 id
列,并用序列生成的值填充它
CREATE TABLE tbl (s VARCHAR);
INSERT INTO tbl VALUES ('hello'), ('world');
CREATE SEQUENCE id_sequence START 1;
ALTER TABLE tbl ADD COLUMN id INTEGER DEFAULT nextval('id_sequence');
SELECT * FROM tbl;
此脚本生成与上一个示例相同的表格。
选择下一个值
要从序列中选择下一个数字,请使用 nextval
CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
nextval |
---|
1 |
在 INSERT
命令中使用此序列
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
选择当前值
您也可以查看序列的当前数字。请注意,在调用 currval
之前必须已经调用过 nextval
函数,否则会抛出序列化错误(sequence is not yet defined in this session
)。
CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
SELECT currval('serial') AS currval;
currval |
---|
1 |
语法
CREATE SEQUENCE
创建一个新的序列号生成器。
如果给定模式名称,则在指定模式中创建序列。否则,它将在当前模式中创建。临时序列存在于特殊模式中,因此在创建临时序列时可能不提供模式名称。序列名称必须与同一模式中任何其他序列的名称不同。
创建序列后,使用函数 nextval
对序列进行操作。
参数
名称 | 描述 |
---|---|
CYCLE 或 NO CYCLE |
CYCLE 选项允许序列在升序或降序序列分别达到 maxvalue 或 minvalue 时进行回绕。如果达到限制,生成的下一个数字将分别是 minvalue 或 maxvalue 。如果指定 NO CYCLE ,则序列达到其最大值后对 nextval 的任何调用都将返回错误。如果既未指定 CYCLE 也未指定 NO CYCLE ,则默认值为 NO CYCLE 。 |
增量 |
可选子句 INCREMENT BY increment 指定添加到当前序列值以创建新值的值。正值将生成升序序列,负值将生成降序序列。默认值为 1。 |
最大值 |
可选子句 MAXVALUE maxvalue 确定序列的最大值。如果未提供此子句或指定了 NO MAXVALUE ,则将使用默认值。升序序列的默认值分别为 2^63 - 1 和 -1(对于降序序列)。 |
最小值 |
可选子句 MINVALUE minvalue 确定序列可以生成的最小值。如果未提供此子句或指定了 NO MINVALUE ,则将使用默认值。升序序列的默认值分别为 1 和 -(2^63 - 1)(对于降序序列)。 |
名称 |
要创建的序列的名称(可选地可使用模式限定)。 |
起始值 |
可选子句 START WITH start 允许序列从任意位置开始。升序序列的默认起始值为 minvalue ,降序序列的默认起始值为 maxvalue 。 |
TEMPORARY 或 TEMP |
如果指定,序列对象仅为当前会话创建,并在会话退出时自动删除。在临时序列存在期间,同名的现有永久序列不可见(在此会话中),除非它们使用模式限定名称引用。 |
序列基于
BIGINT
算术,因此其范围不能超过八字节整数的范围(-9223372036854775808 到 9223372036854775807)。
限制
由于 DuckDB 依赖管理器的限制,DROP SEQUENCE
在某些特殊情况下会失败。例如,删除使用序列的列应该允许序列被删除,但目前这会返回错误
CREATE SEQUENCE id_sequence START 1;
CREATE TABLE tbl (id INTEGER DEFAULT nextval('id_sequence'), s VARCHAR);
ALTER TABLE tbl DROP COLUMN id;
DROP SEQUENCE id_sequence;
Dependency Error:
Cannot drop entry "id_sequence" because there are entries that depend on it.
table "tbl" depends on index "id_sequence".
Use DROP...CASCADE to drop all dependents.
这可以通过使用 CASCADE
修饰符来解决。以下命令会删除序列
DROP SEQUENCE id_sequence CASCADE;