autoIncrement 用于在无 keyPath 时自动生成递增数字主键,从 1 开始且不重用;设 keyPath 则 autoIncrement 失效,主键由数据自身提供;add() 后通过 event.target.result 可获取生成的 ID。

IndexedDB 的 autoIncrement 属性用于在创建对象存储(object store)时启用自动递增主键,它会让 IndexedDB 为每条新记录自动生成一个递增的数字 ID(通常是整数),无需手动指定 key。关键前提是:该对象存储必须**不使用外键(即 keyPath 不能是字符串路径)**,而是采用“in-line key 不可用、key 自动生成”的模式。
设置 autoIncrement 的正确方式
autoIncrement 是在调用 createObjectStore() 时通过 options 参数开启的,不是数据库或索引的属性:
- 必须配合 无 keyPath 使用(即不设
keyPath),否则 autoIncrement 会被忽略; - 如果设置了
keyPath(如{ keyPath: 'id' }),ID 就由数据自身提供,autoIncrement 失效; - 此时 add() 或 put() 传入的对象不能包含主键字段(否则会报错或覆盖行为异常);
- ID 从 1 开始,每次新增记录自动 +1,即使删除中间项也不会重用(例如删掉 ID=2 后,下一条仍是 ID=4)。
完整示例:创建并使用 autoIncrement 对象存储
以下是一个最小可运行示例:
// 打开/升级数据库
const request = indexedDB.open('mydb', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
// 创建对象存储,不设 keyPath,启用 autoIncrement
const store = db.createObjectStore('users', { autoIncrement: true });
// 可选:添加索引便于按其他字段查询
store.createIndex('byName', 'name', { unique: false });
};
request.onsuccess = () => {
const db = request.result;
const tx = db.transaction('users', 'readwrite');
const store = tx.objectStore('users');
// 添加数据:不传 key,也不含 id 字段
store.add({ name: 'Alice', email: 'a@example.com' }); // ID 自动为 1
store.add({ name: 'Bob', email: 'b@example.com' }); // ID 自动为 2
tx.oncomplete = () => console.log('添加完成');
};
如何获取插入后生成的 ID
add() 方法返回的 request 对象,在 success 事件中可通过 event.target.result 拿到新生成的 key:
立即学习“Java免费学习笔记(深入)”;
-
store.add(...).onsuccess = e => console.log(e.target.result);→ 输出 1、2、3… - 这个值就是写入后分配的 auto-increment ID,可用于后续关联操作;
- 注意:put() 行为类似,但如果传入已有 key(比如已存在 ID=5 的记录),则为更新而非新增。
常见误区与注意事项
容易出错的地方:
- 误在已有 keyPath 的 store 上设 autoIncrement —— 它不会生效;
- 向 autoIncrement store 中 add 带 id 的对象(如
{id: 100, name: 'X'})—— 不报错但 id 被忽略,仍按 1,2,3 分配; - 期望 ID 重用或连续不中断 —— IndexedDB 不保证物理连续,只保证单调递增;
- 跨浏览器兼容性没问题,autoIncrement 是 IndexedDB v1 规范的一部分,所有支持 IndexedDB 的浏览器都支持。


















