跳到主要内容

主键生成

主键策略

策略本数据源的用法
手工赋值使用关闭 AutoID 的集合;重复 ID 不触发唯一键冲突异常。
自增使用 AutoID;2.6.2 基线不支持与手工 ID 混用。
UUID使用 VARCHAR 主键并关闭 AutoID。
序列不提供序列主键策略。
自定义使用自定义生成器,在插入前或后处理主键。

使用自动生成 ID

集合主键声明 AUTO_ID 后,插入时省略该字段:

CREATE TABLE auto_books (
id INT64 PRIMARY KEY AUTO_ID,
title VARCHAR(256),
book_intro FLOAT_VECTOR(2)
);

AutoBook 提供可写的 Long id 属性,下面的 Mapper 配置会在插入后回填该属性:

@Insert(value = "INSERT INTO auto_books (title, book_intro) VALUES (#{title}, #{bookIntro})",
useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
int insert(AutoBook item);

调用 mapper.insert(item) 后,通过 item.getId() 读取主键。这里使用单个实体参数,不额外加 @Param 包装。

keyColumn="id" 指定返回的主键列,可以省略。构造器 API 使用 KeyType.Auto 配置自动回填,见主键生成器

使用已有 ID

未启用 AUTO_ID 的集合,插入时必须提供主键值。INSERT 不检查已有数据中的重复主键:同一个 ID 再次 INSERT,不会作为唯一键冲突抛错。

例如,要将书籍 1001 的标题改为新值,应使用 UPSERT,不要通过“尝试 INSERT、捕获主键冲突”的方式判断它是否存在。

AUTO_ID 集合

在 Milvus 2.6.2 基线下,不支持向 AutoID 集合插入应用指定的 ID。自动编号与手工编号分别使用对应配置的集合,不要在 AutoID 集合中混用。

使用 UUID

集合采用 VARCHAR 主键且关闭 AutoID 时,可在实体映射中使用 KeyType.UUID32 或 KeyType.UUID36。dbVisitor 在 INSERT 前生成并赋值,字段长度分别至少预留 32 或 36 个字符。配置见主键生成器

选择回填来源

方法注解和 Mapper 文件均使用 useGeneratedKeys,保持默认回填来源。生成键和命令本身的结果集不是同一个结果;这里的插入不要设置 generatedKeySource="resultSet"

上面的例子展示了可用的生成键回填方式;需要指定返回列时使用 keyColumn

Mapper 文件的主键策略

可在 INSERT 中绑定已有主键,或通过 useGeneratedKeys 接收 AutoID。不要使用 generatedKeySource="resultSet",因为 INSERT 不返回用于回填的当前结果集。

Milvus 没有数据库序列,不能通过 selectKey 查询序列值来生成主键;需要预先确定 ID 时由应用赋值。AutoID 用法见上方示例。