http://en.wikipedia.org/wiki/Upsert
在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不同
语句对象的生命周期如下:
更新我猜测与INSERT相比速度慢,但它与使用主键的SELECT相比如何呢?
也许我应该使用select来读取第4列(Blob3),然后使用REPLACE编写一条新记录,将原始的第4列与前3列的新数据混合在一起?
我有一个包含几个SQL语句的文件,我想用它来初始化一个新的sqlite3数据库文件.显然,sqlite3只通过 sqlite3_exec()函数处理一个查询中的多个语句,而不是通过prepare/step/finalize函数处理.这一切都很好,但我想直接使用QtSQL api而不是c api.通过QSqlQuery加载到相同的初始化文件中只执行第一个语句,就像直接使用sqlite3 api中的prepare/step/finalize函数一样.有没有办法让QSqlQuery运行多个查询,而无需为每个语句单独调用query.exec()?
我在下面有一个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
我正在尝试通过使用SQLite.swift包装器来开发iOS 来节省开发时间.我选择了这个框架,因为它是在raywenderlich.com上推荐的.我认为有一个更新或插入语法的示例会很有用.
在这个答案中,Sam Saffron说:
如果你一般都在做更新,我会..
- 开始交易
- 做更新
- 检查rowcount
- 如果为0则执行插入操作
- 承诺
如果你通常做插入我会
- 开始交易
- 尝试插入
- 检查主键冲突错误
- 如果我们得到错误,请进行更新
- 承诺
这样你就可以避免选择,并且你在Sqlite上具有事务性.
这对我来说很有意义,所以在下面我的回答中,我提供了一个"通常做更新"的例子.
我在我的SQL数据库中保存了数据.
现在我想用字符串比较这个保存的数据
像这样的东西:
String example = "house";
Run Code Online (Sandbox Code Playgroud)
现在我想检查,如果"house"已经在数据库中,带有if子句
这样的事情
if ( example == [SQL Data] ) {
}
else {
}
Run Code Online (Sandbox Code Playgroud)
现在,我该怎么做到这一点?