javascript - SQLite 和 Javascript : Checking for existence of data before inserting OR letting SQLite throw an exception

标签 javascript exception sqlite mozilla

我的主要问题是哪种方法更快。

一些简报

我正在使用 Mozilla 开发应用程序。

我有一个模块,我可以在其中捕获一些数据并将其存储在数据库中。数据间歇性地进来。不得存储重复项。为了便于讨论,我们可以假设一个表只有一列,我们将该列命名为“关键字”。因此,如果我们得到一个已经存在于数据库中的关键字,我们就不会再次存储它。是的,我们已将此列设置为 PRIMARY KEY 并使其唯一。 :)

我的查询是:

1) 在我将这个新数据插入数据库之前,我是否应该进行数据库调用并检查关键字是否存在?如果它不存在将其放入数据库?像这样的东西:

function insert_keyword(keyword)
{
   if(!SQL.exists(keyword))
   {
       SQL.insert(keyword);
   } 
}

2) 我只是插入并让数据库处理该条件,有效地让它抛出一个我捕获的异常。

function insert_keyword(keyword)
{
    try {
       SQL.insert(keyword);
    }
    catch (e)
    {
       // keyword exists!
    }
}

我知道捕获异常而不做任何事情是不好的!所以我不是在寻找什么是好的,什么是坏的 :) 。我想了解的是哪种方法最快。 (特别是与 Mozilla、JavaScript 和 SQLite 相关的内容,但欢迎提出一般性意见!)

旁注: 我使用的SQL. 语法仅用于说明目的。您可能会假设我创建了 SQL 语句、执行它们并获取结果,或者假设它是一个 JavaScript 库调用来完成所有脏活。

这个问题有点像这个:

Should I check for DB constraints in code or should I catch exceptions thrown by DB

但我想具体了解与性能相关的差异,因为我正在处理的应用程序需要尽可能快(哪个应用程序不需要?;))

最佳答案

只需告诉您的数据库忽略重复项(仅适用于强制执行唯一值的列):

INSERT OR IGNORE INTO table(keyword) VALUES("someWord");

或者创建一个忽略重复项的列。

CREATE TABLE someTable(keyword PRIMARY KEY ON CONFLICT IGNORE);

除了忽略还有那些冲突条款:

ROLLBACK
ABORT
FAIL
IGNORE
REPLACE

有关详细信息,请阅读 page about conflict clauses of SQLitedocumentation of the INSERT statement .


至于使用异常或检查值的存在是否更快:异常在引发时代价高昂,而在不引发时成本为零。这意味着如果您希望有很多重复项,请使用检查;如果只有少量关键字重复,则使用异常(exception)。毕竟,异常(exception)应该是异常(exception)。

关于javascript - SQLite 和 Javascript : Checking for existence of data before inserting OR letting SQLite throw an exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/720656/

相关文章:

objective-c - iPhone 中的 Sqlite3 数据库被锁定 - 如何避免?

Android SqlCipher 性能问题

javascript - 如何链接到具有特定过滤器的投资组合页面?

SQLite 查询中的 javascript for 循环

javascript - 如何模拟这个以继续 async.each() 调用

c++ - Google C++ 风格指南的无异常(exception)规则; STL?

.net - 扩展方法中的 ArgumentNullException 或 NullReferenceException?

c++ - 使用 gtest 检查构造函数的正确初始化值

javascript - 使用 Deezer API 向未登录用户播放完整音乐

javascript - 了解 Service Worker 范围