SQLite and Javascript : Checking for existence of data before inserting OR letting SQLite throw an exception - Stack Overflow

My primary question is which approach is faster.Some briefingI'm developing an application using

My primary question is which approach is faster.

Some briefing

I'm developing an application using Mozilla.

I have this one module where I capture some data and store it in database. The data es in intermittently. No duplicates are to be stored. For discussion sake we can assume a table with just one column, and let's name that column is named 'keyword'. So if we get a keyword that's already in database we do not store it again. And yes, we have set this column as PRIMARY KEY and made it UNIQUE. :)

The query I have is:

1) Before I insert this new data into the database, shall I do a DB call and check if the keyword exists or not; if it doesn't exists put it into DB? Something like:

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

OR

2) I just insert and let the database handle the condition, effectively letting it throw an exception, which I catch.

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

I know catching an exception and not doing anything is bad! So I'm not looking for what is good and what is bad :) . What I want to understand is which approach would be the fastest. (Specifically in relation to Mozilla, JavaScript and SQLite but general ments are weled!)

Sidenotes: The SQL. syntax I've used is just for illustration purpose. You may assume that I create SQL statements, execute them and fetch the result, or assume it is a JavaScript library call which does all the dirty work.

This question is a bit like this one:

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

But I want to understand the performance related differences specifically, as the application I'm working on needs to be as fast as possible (which application doesn't? ;) )

My primary question is which approach is faster.

Some briefing

I'm developing an application using Mozilla.

I have this one module where I capture some data and store it in database. The data es in intermittently. No duplicates are to be stored. For discussion sake we can assume a table with just one column, and let's name that column is named 'keyword'. So if we get a keyword that's already in database we do not store it again. And yes, we have set this column as PRIMARY KEY and made it UNIQUE. :)

The query I have is:

1) Before I insert this new data into the database, shall I do a DB call and check if the keyword exists or not; if it doesn't exists put it into DB? Something like:

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

OR

2) I just insert and let the database handle the condition, effectively letting it throw an exception, which I catch.

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

I know catching an exception and not doing anything is bad! So I'm not looking for what is good and what is bad :) . What I want to understand is which approach would be the fastest. (Specifically in relation to Mozilla, JavaScript and SQLite but general ments are weled!)

Sidenotes: The SQL. syntax I've used is just for illustration purpose. You may assume that I create SQL statements, execute them and fetch the result, or assume it is a JavaScript library call which does all the dirty work.

This question is a bit like this one:

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

But I want to understand the performance related differences specifically, as the application I'm working on needs to be as fast as possible (which application doesn't? ;) )

Share Improve this question edited May 23, 2017 at 11:46 CommunityBot 11 silver badge asked Apr 6, 2009 at 8:51 xk0derxk0der 3,6904 gold badges29 silver badges36 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 6

Just tell your database to ignore duplicates (works only for columns that enforce unique values):

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

or create a column, that ignores duplicates.

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

Instead of ignore there are also those conflict clauses:

ROLLBACK
ABORT
FAIL
IGNORE
REPLACE

For more information, read the page about conflict clauses of SQLite and the documentation of the INSERT statement.


As to if it's faster using exceptions or checking for the existance of values: Exceptions are expensive when raised and zero-cost when not raised. This means if you expect to have many duplicates use the check and if only a small number of keywords are duplicates use exceptions. After all, exceptions should be exceptional.

Not sure about the specifics of the mozilla/javascript part of this question, but there is a third option 'insert or replace'. It acplishes what you want with no duplicates and gets rid of the need to check in code if the row already exists.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745628742a4636971.html

相关推荐

  • HLS最全知识库

    HLS最全知识库副标题-FPGA高层次综合HLS(二)-Vitis HLS知识库高层次综合(High-level Synthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。对于AMD Xi

    1小时前
    00
  • 我用AI监控了奥特曼,当他一发推特AI就会自动给我打电话。

    上周我真的扛不住了。奥特曼这个孙贼,发了个X说,“要发一个礼拜的好东西”。我信了他的邪,明明出差1周,每天早上9点不到就要起来参加活动,但是晚上根本不敢睡觉,天天蹲到凌晨3点半,蹲到他们那边时间中午12点多,我才敢去睡觉。真的,那一整周,我

    1小时前
    00
  • 国产之光!!让你的Docker管理更优雅!

    大家好,我是热爱开源的了不起!我们都知道,Docker是个好东西,能帮我们把应用打包成容器,方便部署和管理。但问题来了,Docker的命令行操作对新手来说有点复杂,一不小心就容易出错。而且,有时候我们只是想简单地管理一下容器,却得记住一堆命

    1小时前
    00
  • 20 万 POC,直接拿来用,这不是测试,这是拒绝服务!!!

    之前看到很多人分享 github 上的一个项目,自动收录全网 nuclei 模板文件,目前已经 19 万了,如果直接拿来对目标进行漏洞探测,无疑会对目标造成巨大伤害,意味着可能要对目标发起十九万次请求以上,可以说是一次小型的 DDoS 攻击

    1小时前
    00
  • Prometheus配置docker采集器

    Prometheus 配置 Docker 采集器Prometheus 是一个开源的监控系统和时间序列数据库,广泛用于容器化环境中。通过监控 Docker 容器,用户可以实时获取服务性能、资源使用情况等信息。本文将介绍如何为 Docker 容

    51分钟前
    00
  • ascend pytorch 踩坑.

    在910b上安装pytorch 和 pytorch_npu, 因为后续准备装vllm, 所以torch_npu是特殊的版本.代码语言:shell复制pip install torch==2.5.1 --extra-index pip in

    49分钟前
    00
  • 开源在线考试系统

    看到调问已经开始扩展在线考试的场景,试了一下,发现在线考试的基本能力都已经支持了。主要是考试中的各种计分功能,包括对每道题的选项设置分值计算、考试时间限制等,和官方了解了一下,考试中的其他各项能力也在逐步完善,有需求可以随时

    48分钟前
    00
  • Power BI 无公式实现帕累托图表

    帕累托分析(Pareto Analysis),也被称为8020法则、关键少数法则,是一种常用的管理工具,用于识别和处理影响业务的主要因素。看到李伟坚老师在Excel使用Vega实现了花式帕累托(参考:Excel 零公式实现高级帕累托图表)

    46分钟前
    00
  • 深度学习在DOM解析中的应用:自动识别页面关键内容区块

    爬虫代理摘要本文介绍了如何在爬取东方财富吧()财经新闻时,利用深度学习模型对 DOM 树中的内容区块进行自动识别和过滤,并将新闻标题、时间、正文等关键信息分类存储。文章聚焦爬虫整体性能瓶颈,通过指标对比、优化策略、压测数据及改进结果,展示了

    38分钟前
    10
  • 推荐一个轻量级的监控平台并且支持移动端

    简介XUGOU 是基于Cloudflare构建的轻量化监控平台,专精于系统资源监控与可视化状态页面服务。该平台提供英文简体中文双语支持,满足全球化部署需求。面向开发者及中小团队,项目致力于提供高可用性的监控解决方案。核心功能与实现平台功能

    33分钟前
    00
  • 拥抱国产化:转转APP的鸿蒙NEXT端开发尝鲜之旅

    本文由转转技术团队赵卫兵分享,原题“鸿蒙新篇章:转转 APP 的 HarmonyOS Next 开发之旅”,下文进行了排版优化和内容修订。1、引言2023 年在华为开发者大会(HDC.Together)上,除了面向消费者的 HarmonyO

    27分钟前
    00
  • maxwell遇到的一则问题

    结论和原因maxwell的元数据库里面没有存储全部的schema数据(就是少数据了),导致相关表的DDL校验失败。PS:我这里maxwell的作用只是采集库表修改情况的统计粗粒度指标,因为之前maxwell在运行报错的时候,直接修改了pos

    25分钟前
    00
  • windows新建open ai密钥

    api链接 openai的api需要付费才能使用但好像系统变量不知道为啥用不了打印出来,获取到的是None可以用了

    20分钟前
    00
  • 1.54G 雨晨 26100.3775 Windows 11 IoT 企业版 LTSC 24H2 极速版

    精简AERO外主题并增加一套壁纸主题(默认启用)误杀导致功能界面空白、因WMIC被默认移除系统可能会多次重启。 拒止连接 www.5909 拒止连接 www.mnpc 拒止连接 quark 拒止

    16分钟前
    00
  • 雨晨 26200.5516 Windows 11 IoT 企业版 LTSC 2024 轻装版

    简述:以下为YCDISM (雨晨作品自2025年03月25日起通用介绍,若无重大更改不再额外敖述) 全程由最新YCDISM2025脱机装载26100.1742_zh-cn_windows_11_

    13分钟前
    00
  • Java&Activiti7实战:轻松构建你的第一个工作流

    本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!

    11分钟前
    00
  • 用Xshell8配置密钥登陆

    1.首先在服务端查看root.sshauthorized_keys是否存在,这是存储公钥的文件,若不存在需新建此文件 2. 打开Xshell8,选择"新建",选择"新建用户密钥生成向导" 给用户

    10分钟前
    00
  • 人工智能应用领域有哪些

    人工智能应用领域有哪些一、引言随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面,成为推动社会进步的重要力量。从医疗健康到金融服务,从教育学习到智能制造,人工智能以其独特的技术优势,为各行各业带来了前所未有的变革。本文旨在

    10分钟前
    10
  • windows切换系统版本

    powershell 管理员身份打开 输入 irm massgrave.devget | iex 输入数字 对应后面写着 change windows edition新的会话框中选择想要的版本即可 获取windows 密钥 官方提供的

    8分钟前
    00
  • win11家庭版改为专业版

    找到“我的电脑”--“设置”--“系统”--“激活”--“更改密钥” 输入密钥“G49HN-9YQCT-684C3-R7T3F-3DBQB 即可成功。

    3分钟前
    00

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信