objectStore.put() 更新记录需键匹配:有keyPath时对象须含对应属性;自增主键须显式传键值;必须用readwrite事务;异步操作需监听onsuccess/onerror验证结果。

用 objectStore.put() 更新已存在的记录,关键在于传入的键(key)与数据库中某条记录的主键(或索引键)完全匹配。只要键存在,put() 就会覆盖原记录;否则就插入新记录。
确保使用正确的键值
put() 的行为由你传入的数据对象和 objectStore 的键路径(keyPath)或 keyGenerator 决定:
- 如果 objectStore 设有 keyPath(如
keyPath: 'id'),那么你传入的对象必须包含该属性,且其值要与待更新记录的id一致; - 如果 objectStore 使用 自增主键(
autoIncrement: true),你就不能靠对象自身提供键,必须显式传入第二个参数——即你要更新的那条记录的主键值,例如:store.put(newData, existingId); - 若用 out-of-line 键(不存于对象内),则必须始终通过第二个参数指定键,否则会报错或插入新记录。
确认事务权限和状态
更新操作必须在具有读写权限的事务中进行:
- 打开 objectStore 时,事务需以
"readwrite"模式开启,例如:db.transaction("users", "readwrite"); - 确保数据库已成功打开、版本升级完成,且 objectStore 确实存在;
- 避免在事务提交后调用
put(),否则会触发InvalidStateError。
检查是否真的更新成功
put() 是异步操作,需监听其请求的 onsuccess 和 onerror:
- 成功回调中,可通过
event.target.result获取写入后的主键值(对自增 store 有意义); - 若想验证更新结果,可在
put()后立即用get()查询该键,比对字段值; - 注意:IDB 不返回“影响行数”,也没有“未找到键则跳过”的选项——键存在即更新,不存在即新增,这是它的默认语义。
常见错误示例与修正
比如你想更新 id 为 100 的用户,但写了:
store.put({ name: "Alice", email: "a@b.com" }); // ❌ 缺少 id,可能插入新记录或报错
正确写法取决于 schema:
- 有 keyPath:
store.put({ id: 100, name: "Alice", email: "a@b.com" }); - 自增主键:
store.put({ name: "Alice", email: "a@b.com" }, 100);










