最直接有效的方式是删除整个数据库并重新创建。调用 deleteDatabase 删除后,用递增版本号 open 重建,在 onupgradeneeded 中不创建 object store 即可清空;或逐个调用各 object store 的 clear() 方法。

要清空 IndexedDB 数据库中的所有存储对象(object store),最直接有效的方式是删除整个数据库,然后重新创建。IndexedDB 本身不提供“清空数据库”的 API,但可以通过 deleteDatabase + 重建方式实现等效效果。
方法一:删除并重新打开数据库(推荐)
这是最可靠、兼容性好、语义清晰的做法。关键在于在 onupgradeneeded 中不创建任何 object store,或仅按需重建:
- 调用
window.indexedDB.deleteDatabase("your-db-name")删除数据库 - 立即用相同名称调用
indexedDB.open("your-db-name", newVersion)(版本号必须递增) - 在
onupgradeneeded回调中,不执行createObjectStore,或只创建你需要的空结构
示例代码:
const dbName = "myAppDB";
// 先删除
const deleteReq = indexedDB.deleteDatabase(dbName);
deleteReq.onsuccess = () => {
console.log("数据库已删除");
// 立即重建(版本号 +1)
const openReq = indexedDB.open(dbName, 1);
openReq.onupgradeneeded = (event) => {
const db = event.target.result;
// 不调用 db.createObjectStore → 所有 object store 都不存在
console.log("数据库已重建,无任何 object store");
};
openReq.onsuccess = (event) => {
console.log("清空完成,可开始使用新数据库");
};
};
方法二:逐个清空每个 object store(适用于不能删库的场景)
如果数据库正在被其他标签页使用,或你只想清数据但保留 schema 结构,可以遍历所有 object store 并调用 clear():
立即学习“前端免费学习笔记(深入)”;
- 先用
indexedDB.open打开数据库(指定当前版本) - 在
onupgradeneeded中获取event.target.result.objectStoreNames - 在
onsuccess后,对每个 object store 发起clear()请求
注意:必须在 versionchange 事务外操作(即不能在 onupgradeneeded 中 clear),且需确保没有其他连接正在写入。
注意事项
-
版本号必须递增:重建数据库时,第二个参数(version)要比原版本高,否则
onupgradeneeded不会触发 - 异步行为:deleteDatabase 和 open 都是异步操作,需通过事件回调控制流程,不可同步等待
- 多标签页影响:deleteDatabase 会等待所有已有连接关闭;若其他页面正打开该库,删除会延迟直到它们关闭
-
无“清空数据库”快捷 API:IndexedDB 标准未定义类似
db.clearAll()的方法,不要尝试查找不存在的接口



















