zoukankan      html  css  js  c++  java
  • 在Sqlite中通过Replace来实现插入和更新

        你可能在批量处理一个事务的时候,想要批量插入一系列的数据,但是这些数据当添加完一次之后,重新添加的时候,你不想要重新添加,只是想将原有的数据进行更新,例如:我想要通过Excel将一系列的图书导入到数据库中,而这些图书在你下一次编辑之后,重新导入,只是对原有的数据进行修改。以上是一个业务的场景。

    在MSSQL中,你可以使用诸如:

    IF NOT EXISTS(SELECT * FROM Book WHERE ….) THEN INSERT INTO ... ELSE UPDATE SET ...

    这样的SQL语法表示。而在SQLite中,不支持这样的语法。

    而对应的,在Sqlite中可以使用 Replace Into 或者 Insert Or Replace Into 这样的语法格式。

    现在,我使用SQLite Developer的Sqlite客户端数据库管理工具,来创建数据表,对应字段如下:

    image

    然后,标签切换到“索引”栏:

    image

    这里我将Name(书名)和Author(作者)创建索引,并且规定为唯一索引。保存数据表。

    这样就意味着只要Name和Author对应是相同的,Replace into 对应的就变成 Update,如果不完成相同,就对应变成 Insert 语句。

    于是我在“查询数据”中,执行SQL语句:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    REPLACE INTO tbl_book
      (
        Name ,
        Author ,
        PublishDate ,
        pagecount ,
        Memo
      )
    VALUES
      (
        'WF高级程序设计' ,
        'Bruce Bukovics' ,
        date( ) ,
        454 ,
        'Test'
      ) ;

    第一次执行时,由于表中没有数据,所以命令转换为Insert;

    image

    当第二次执行时,由于表中已经存在相同的“Name”和“Author”的数据,于是不进行插入,而命令将转换为Update。

    因此,当你执行以下语句时:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    REPLACE INTO tbl_book
      (
        Name ,
        Author ,
        PublishDate ,
        pagecount ,
        Memo
      )
    VALUES
      (
        'WF高级程序设计' ,
        'Bruce Bukovics' ,
        date( ) ,
        500 ,   -- 页码总数改变
        'Test2' -- 备注改变
      ) ;

    执行结果:

    image

    页码和备注都改变了,说明这里执行了Update。

    然后我修改Name名称:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    REPLACE INTO tbl_book
      (
        Name ,
        Author ,
        PublishDate ,
        pagecount ,
        Memo
      )
    VALUES
      (
        'WPF揭秘' ,     -- 书名改变
        'Bruce Bukovics' ,
        date( ) ,
        500 ,   
        'Test2'
      ) ;

    执行结果:

    image

    插入了一条图书的记录,同样你也可以尝试改变Author,同样也是插入记录。

    这样,您就可以通过在表中创建唯一索引并且利用Replace达到Insert OR Update的目的。

    整体还是很简单,这个是我在做嵌入式项目中的一点心得:)

  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/adjk/p/5899465.html
Copyright © 2011-2022 走看看