【问题标题】:SQLite and Javascript : Checking for existence of data before inserting OR letting SQLite throw an exceptionSQLite 和 Javascript:在插入或让 SQLite 引发异常之前检查数据是否存在
【发布时间】:2009-04-06 08:51:36
【问题描述】:

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

一些简报

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

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

我的查询是:

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 相关,但欢迎通用 cmets!)

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

这个问题有点像这个:

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

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

【问题讨论】:

    标签: javascript exception sqlite mozilla


    【解决方案1】:

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

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

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

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

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

    回滚 中止 失败 忽视 代替

    如需了解更多信息,请阅读page about conflict clauses of SQLitedocumentation of the INSERT statement


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

    【讨论】:

      【解决方案2】:

      不确定这个问题的 mozilla/javascript 部分的细节,但有第三个选项“插入或替换”。它在没有重复的情况下完成了您想要的操作,并且如果该行已经存在,则无需签入代码。

      【讨论】:

        猜你喜欢
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        • 2010-10-07
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 2015-10-10
        相关资源
        最近更新 更多