相关疑难解决方法(0)

SQLite - UPSERT*不*INSERT或REPLACE

http://en.wikipedia.org/wiki/Upsert

在SQL Server上插入更新存储过程

在SQLite中有没有一些我没想到的聪明方法?

基本上,如果记录存在,我想更新四列中的三列,如果它不存在,我想用第四列的默认(NUL)值插入记录.

ID是主键,因此UPSERT只会有一条记录.

(我试图避免SELECT的开销,以确定我是否需要更新或插入显然)

建议?


我无法在SQLite网站上确认SQL CREATE的语法.我还没有构建一个演示来测试它,但它似乎不支持..

如果是,我有三列,所以它实际上看起来像:

CREATE TABLE table1( 
    id INTEGER PRIMARY KEY ON CONFLICT REPLACE, 
    Blob1 BLOB ON CONFLICT REPLACE, 
    Blob2 BLOB ON CONFLICT REPLACE, 
    Blob3 BLOB 
);
Run Code Online (Sandbox Code Playgroud)

但是前两个blob不会引起冲突,只有ID会因此我asusme Blob1和Blob2不会被替换(根据需要)


绑定数据时SQLite中的UPDATE是一个完整的事务,这意味着每个要更新的发送行都需要:Prepare/Bind/Step/Finalize语句,与允许使用重置函数的INSERT不同

语句对象的生命周期如下:

  1. 使用sqlite3_prepare_v2()创建对象
  2. 使用sqlite3_bind_接口将值绑定到主机参数.
  3. 通过调用sqlite3_step()运行SQL
  4. 使用sqlite3_reset()重置语句,然后返回步骤2并重复.
  5. 使用sqlite3_finalize()销毁语句对象.

更新我猜测与INSERT相比速度慢,但它与使用主键的SELECT相比如何呢?

也许我应该使用select来读取第4列(Blob3),然后使用REPLACE编写一条新记录,将原始的第4列与前3列的新数据混合在一起?

sql sqlite upsert

505
推荐指数
11
解决办法
28万
查看次数

使用sqlite3驱动程序在QSqlQuery中使用多个sql语句

我有一个包含几个SQL语句的文件,我想用它来初始化一个新的sqlite3数据库文件.显然,sqlite3只通过 sqlite3_exec()函数处理一个查询中的多个语句,而不是通过prepare/step/finalize函数处理.这一切都很好,但我想直接使用QtSQL api而不是c api.通过QSqlQuery加载到相同的初始化文件中只执行第一个语句,就像直接使用sqlite3 api中的prepare/step/finalize函数一样.有没有办法让QSqlQuery运行多个查询,而无需为每个语句单独调用query.exec()?

sqlite qt qt4 prepared-statement qtsql

8
推荐指数
1
解决办法
9729
查看次数

SQL:如果不存在,如何更新或插入?

我在下面有一个SQL插入,工作正常,但是我想检查DATE = xxxx,NAME = xxxx和JOB = xxx,如果它们存在则更新HOURS,否则插入新行.这可能用SQL吗?

"INSERT INTO TABLE (NAME, DATE, JOB, HOURS) VALUES ('BOB', '12/01/01', 'PM','30');
Run Code Online (Sandbox Code Playgroud)

尝试使用相同结果的下面的OR REPLACE,每次都会添加一个新行.

add_time = conn.prepareStatement("INSERT OR REPLACE INTO RESOURCE (NAME, DATE, JOB, HOURS) VALUES ('"+name+"', '" + date + "', '"+job+"','"+hours+"');");
Run Code Online (Sandbox Code Playgroud)

例如:

如果以下是在DB中,并且John想要更新他的小时数,那么它将检查名称,日期,作业是否与尝试插入的值相同以及它们是否仅仅是更新HOURS.否则,如果它们中没有一个存在(John可能有几个小时记录另一个DATE或JOB)插入一个新行.

其他人也会在下面的同一个数据库中记录他们的小时和不同的角色.

约翰| 12/12/2012 | 清洁剂| 20约翰| 12/12/2012 | 首席执行官 10吉姆| 12/10/2011 | 清洁剂| 五

sql sqlite

5
推荐指数
1
解决办法
3万
查看次数

如何使用SQLite.swift更新或插入

如果行已经存在,我想更新行的列,但如果它还不存在,那么我想插入一个新行.

相关问题

这种类型的问题通常适用于SQL

特别是SQLite

寻找SQLite.swift实现

我正在尝试通过使用SQLite.swift包装器来开发iOS 来节省开发时间.我选择了这个框架,因为它是在raywenderlich.com上推荐的.我认为有一个更新或插入语法的示例会很有用.

战略

这个答案中,Sam Saffron说:

如果你一般都在做更新,我会..

  1. 开始交易
  2. 做更新
  3. 检查rowcount
  4. 如果为0则执行插入操作
  5. 承诺

如果你通常做插入我会

  1. 开始交易
  2. 尝试插入
  3. 检查主键冲突错误
  4. 如果我们得到错误,请进行更新
  5. 承诺

这样你就可以避免选择,并且你在Sqlite上具有事务性.

这对我来说很有意义,所以在下面我的回答中,我提供了一个"通常做更新"的例子.

sqlite ios swift sqlite.swift

5
推荐指数
1
解决办法
7257
查看次数

将sqlite与string进行比较

我在我的SQL数据库中保存了数据.

现在我想用字符串比较这个保存的数据

像这样的东西:

String example = "house";
Run Code Online (Sandbox Code Playgroud)

现在我想检查,如果"house"已经在数据库中,带有if子句

这样的事情

if ( example == [SQL Data] ) {
}
else {
}
Run Code Online (Sandbox Code Playgroud)

现在,我该怎么做到这一点?

sql android

4
推荐指数
1
解决办法
2万
查看次数

标签 统计

sqlite ×4

sql ×3

android ×1

ios ×1

prepared-statement ×1

qt ×1

qt4 ×1

qtsql ×1

sqlite.swift ×1

swift ×1

upsert ×1