createobjectstore 创建的是键值对集合而非传统表,需通过keypath或autoincrement定义主键,并用索引支持字段查询;keypath和autoincrement创建后不可更改,索引可后续添加。

在 IndexedDB 中,createObjectStore 并不是创建传统数据库“表”,而是定义一个**键值对集合(object store)**,它支持结构化数据存储,并可通过键路径(keyPath)和索引模拟表的主键、字段与查询能力。关键在于合理设计 keyPath、autoIncrement 和 index。
指定主键:用 keyPath 或自增 ID
object store 必须有唯一标识每条记录的方式:
-
显式主键字段:若数据自带唯一 ID(如
{ id: 1, name: "张三" }),可设keyPath: "id",插入时必须提供该字段 -
自动生成主键:设
autoIncrement: true,IDB 自动分配递增数字键,数据中无需包含 ID 字段 -
无主键字段也不自增:则每次
add()或put()必须显式传入键(作为第二个参数),类似手动指定主键
模拟“字段”:靠 JavaScript 对象结构 + 索引支持查询
object store 本身不限定字段,但可通过以下方式实现类似表结构的约束和检索:
- 写入数据时统一使用相同结构的对象(如始终含
name、age、createdAt字段) - 对常用查询字段建索引:
objectStore.createIndex("age", "age")支持按年龄范围查找 - 复合索引也支持:
objectStore.createIndex("byNameAndAge", ["name", "age"])
完整示例:创建用户存储空间
下面代码在数据库升级时创建名为 users 的 object store,以 id 为主键,同时为 email 和 status 建立唯一/非唯一索引:
const request = indexedDB.open("MyAppDB", 2);
request.onupgradeneeded = (event) => {
const db = event.target.result;
// 创建 users 存储空间,id 为键路径(要求数据含 id 字段)
const store = db.createObjectStore("users", { keyPath: "id" });
// email 字段必须唯一(类似 UNIQUE 约束)
store.createIndex("email", "email", { unique: true });
// status 字段支持非唯一查询(如查所有 "active" 用户)
store.createIndex("status", "status");
};
注意事项
object store 一旦创建,keyPath 和 autoIncrement 属性不可更改。如需调整结构,只能新建 store 并迁移数据。索引可在后续版本中随时添加,不影响已有数据。










