如何在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
相关产品推荐
相关产品推荐

