IndexedDB的add方法用于向对象仓库插入唯一键记录,需在readwrite事务中调用;键存在时抛ConstraintError,成功返回键值,适用于用户注册等需唯一性保障场景。

在HTML5的IndexedDB中,Add方法用于向对象仓库(Object Store)插入新记录,且要求记录的键值不能已存在。它与put方法的区别在于:add会拒绝重复键,而put会覆盖。操作需在事务上下文中进行,不能直接调用。
1. 获取数据库连接并开启事务
先通过indexedDB.open()打开数据库,成功后在upgradeneeded或success事件中获取数据库实例;再调用transaction()方法指定对象仓库名和读写模式(必须为"readwrite")。
- 事务模式必须是"readwrite",否则add会抛出ReadOnlyError
- 若对象仓库不存在,需在upgradeneeded中用createObjectStore()创建
- 事务生命周期仅限于当前事件循环,建议在onsuccess或oncomplete中处理结果
2. 获取对象仓库并调用add方法
从事务中用objectStore()获取目标仓库引用,然后调用add()传入要插入的数据对象。该方法返回一个IDBRequest对象,可用于监听成功或失败。
- 数据对象若含有效键路径(keyPath),则自动提取键值;否则需显式传入key参数
- 例如:store.add({id: 5, name: "张三"}),其中id为声明的keyPath时,键即为5
- 若键已存在,add会触发request.onerror,错误名为"ConstraintError"
3. 处理add的返回结果
通过监听IDBRequest的onsuccess或onerror事件判断操作结果。成功时,event.target.result返回新插入记录的键值;失败时检查error.name确定具体原因。
立即学习“前端免费学习笔记(深入)”;
- 不要依赖同步返回值——add是异步操作,result只在success事件中可用
- 常见错误包括:ReadOnlyError(事务不可写)、DataError(键无效)、ConstraintError(键冲突)
- 可结合Promise封装add,提升代码可读性,例如:new Promise((res, rej) => { req.onsuccess = () => res(req.result); req.onerror = () => rej(req.error); })
4. 注意事项与典型场景
add适用于“确保唯一性”的插入场景,如用户注册、订单号生成等。不适用于更新或去重插入。
- 如果不确定键是否存在,应先用get查询,或直接使用put(允许覆盖)
- 批量插入建议复用同一事务,避免频繁开启/关闭事务影响性能
- 键可以是number、string、Date、Array等可排序类型,但不能是undefined或function


















