You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DuckDB中创建自增主键

DuckDB实现自增主键的方法

DuckDB没有提供MySQL风格的AUTO_INCREMENT关键字,有两种成熟方案可以实现完全等价的自增主键能力,和你给出的MySQL示例逻辑完全对齐。


方案1:使用内置SERIAL类型(推荐,写法最简洁)

这是最贴近MySQL使用习惯的方案,DuckDB提供了SERIAL(4字节整数,对应MySQL的int类型自增)、BIGSERIAL(8字节大整数,适合超大数据量表)两种自增类型语法糖,会自动创建关联的隐式序列、设置默认自增值,直接作为主键即可。
对应你的Persons表,写法如下:

CREATE TABLE Persons (
    Personid SERIAL PRIMARY KEY,
    LastName VARCHAR(255) NOT NULL,
    FirstName VARCHAR(255),
    Age INT
);

使用方式和MySQL完全一致:插入数据时不需要指定Personid字段,数据库会自动生成从1开始、步长为1的不重复整数值作为主键。示例插入语句:

INSERT INTO Persons(LastName, FirstName, Age) 
VALUES ('Wang', 'Er', 26), ('Li', 'Si', 31);

执行查询后可以看到Personid自动生成了1、2两个连续主键值。


方案2:手动创建序列(支持自定义自增规则)

如果你需要自定义自增的起始值、步长,或者需要多个字段共用同一个序列,可以手动创建SEQUENCE对象,再把字段默认值设置为序列的下一个取值即可。
示例写法:

-- 先创建自定义序列,比如设置从1000开始自增,步长为2
CREATE SEQUENCE person_pk_seq START 1000 INCREMENT 2;

CREATE TABLE Persons (
    Personid INT NOT NULL DEFAULT nextval('person_pk_seq') PRIMARY KEY,
    LastName VARCHAR(255) NOT NULL,
    FirstName VARCHAR(255),
    Age INT
);

注意事项

  • 和所有数据库的自增主键逻辑一致:如果插入操作报错、事务回滚,已经消耗的序列值不会回退,可能出现主键断号,属于正常现象,和MySQL的AUTO_INCREMENT表现完全相同。
  • 除非明确需要,不要手动给自增主键字段插入显式值,否则可能导致后续序列生成的值和手动插入的值冲突,触发主键重复报错。
  • 单表数据量预计超过20亿行时,建议用BIGSERIAL替代SERIAL,避免4字节整数溢出。

内容的提问来源于stack exchange,提问作者Mark Payne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:27:17