相关疑难解决方法(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万
查看次数

sqlite将数据从一个表复制到另一个表

SQLITE

我有两个表"Source"和"Destination"具有相同的字段.ID和COUNTRY虽然它们都有其他不常见的字段.

我需要将Source.Country值复制到Destination.Country,其中连接是ID

对于我的生活,我不能让Sqlite这样做.

在SQL Server等中,这是一个非常简单的任务.

想法?

sql sqlite

67
推荐指数
4
解决办法
9万
查看次数

如果有两个或更多条件,如何在SQLite中使用REPLACE命令

我想更新一行,如果它存在于表中,否则在单个查询中将其插入SQLite中.从SQLite文档中我发现我们可以使用REPLACE命令来实现这一目标.

REPLACE如果有两个或更多条件,我想知道如何使用:

示例:
如果我有TABLE1包含以下记录的表:

  Name   Type   InitialValue  FinalValue
   A      1          20           40
   B      2          23           50
   A      3          40           60
   C      3          54           70 
Run Code Online (Sandbox Code Playgroud)

这里的组合NameType将是独一无二的.

我想设置initialvalue = 50finalvalue = 90 在那里name = AType = 3 如果它存在,否则将其插入.

我正在使用此命令,但它给出了此错误:

REPLACE INTO table1(Name,Type,InitialValue,FinalValue)VALUES('A',3,50,90)WHERE Name ='A'AND Type = 3;

错误是:

"WHERE"附近:语法错误无法执行语句

我怎样才能实现目标?请帮忙.

sqlite

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

使用python和sqlite进行网页抓取。如何有效地存储抓取的数据?

我想定期(例如每小时)抓取一些特定的网页。我想用python做。抓取的结果应插入到SQLite表中。新信息将被删除,但是“旧”信息将再次被删除,因为python脚本将每小时运行一次。

更准确地说,我想抓取一个体育比赛结果页面,随着比赛的进行,越来越多的比赛结果发布在同一页面上。因此,对于每个新的抓取,我只需要将新结果输入到SQLite表中,因为较早的结果已经在一小时(甚至更早)之前就被抓取了(并插入到表中)。

当第二次被抓取时,我也不想插入相同的结果两次。因此,应该有某种机制来检查是否已刮取一个结果。可以在SQL级别完成吗?因此,我刮了整个页面,INSERT为每个结果创建一个语句,但是只有那些INSERT成功执行的语句才在数据库中不存在。我在想类似UNIQUE关键字之类的东西。

还是我对性能的考虑太多了,应该在DROP TABLE每次开始抓取然后再次从头开始抓取所有内容之前,通过每次操作来解决此问题?我不会谈论太多数据。一年大约有100场比赛的记录(=比赛)。

基本上,我只会对某种最佳实践方法感兴趣。

python sqlite web-scraping

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

插入或替换旧值的总和

我正在使用PhoneGap构建库存应用程序.我有一个模块库存用于库存管理.

股票表查询

CREATE TABLE STOCK (
    sto_id INTEGER PRIMARY KEY AUTOINCREMENT,
    pro_id INTEGER FOREIGNKEY REFERENCES PRODUCT(pro_id) UNIQUE,
    quantity TEXT
)
Run Code Online (Sandbox Code Playgroud)

INSERT或REPLACE查询

INSERT OR REPLACE INTO STOCK (pro_id,quantity) VALUES ("1","5");
Run Code Online (Sandbox Code Playgroud)

这个查询没有一个问题,它的工作完美,但我想用新的更新OLD VALUES的SUM.

例:

pro_id quantity   
1       5
Run Code Online (Sandbox Code Playgroud)

这是现有的记录,所以现在我将查询新的交易,然后有3个数量 quantity should be (5 (old) + 3 (new) ) = 8.

所以在更新记录后它看起来像.

pro_id quantity   
1       8
Run Code Online (Sandbox Code Playgroud)

我怎么能解决这个问题呢.或者让我知道我是否走错路.谢谢.

sql sqlite cordova

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

Python - 批量选择然后从一个DB插入到另一个DB

我正在寻找一些关于如何使用sqlite3在Python中执行此操作的帮助

基本上我有一个下载DB(temp)然后需要将它的记录插入第二个相同的DB(主数据库)的进程..同时忽略/绕过任何可能的重复键错误

我在考虑两个场景,但我不确定如何在Python中做到这一点

选项1:

这当然不起作用,因为我不确定如何正确地做到:)

选项2(我更喜欢,但不知道该怎么做):

  • SELECT和INSERT在1个语句中

另外,我在DB中有4个表,每个表都有不同的列,我可以跳过命名INSERT语句中的列吗?

就重复键而言,我已阅读过我可以使用'ON DUPLICATE KEY'来处理例如.

INSERT INTO table1 VALUES (:column1, :column2) ON DUPLICATE KEY UPDATE set column1=column1
Run Code Online (Sandbox Code Playgroud)

python sql insert bulk

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

On Duplicate Key在SQLite中不起作用

在我的表中,id是主键,但此代码在sqlite3中不起作用:

insert into text (id,text) VALUES(150574,'Hello') ON DUPLICATE KEY UPDATE 'text' = 'good'
Run Code Online (Sandbox Code Playgroud)

请帮我.

sqlite primary-key duplicates

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

java.sql.SQLException:接近"ON":语法错误

嘿伙计们,我已经搜索了许多其他答案,我仍然无法弄清楚这个问题.

statement.executeUpdate("CREATE TABLE IF NOT EXISTS recentlyWatched (fileName STRING NOT NULL, fileLocation STRING, viewCount INTEGER, PRIMARY KEY (fileName))");

Class.forName("org.sqlite.JDBC");
        connection = DriverManager.getConnection("jdbc:sqlite:media.db");
        statement = connection.createStatement();
        statement.executeUpdate("INSERT INTO recentlyWatched (fileName, fileLocation, viewCount) VALUES ('"
                + fileName + "', '"
                + fileLocation + "', 0) ON DUPLICATE KEY UPDATE viewCount = '1'");
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多方法来解决这个问题,每当我尝试插入一条记录时都会感到茫然,我得到"java.sql.SQLException:near"ON":语法错误".

更新

最终代码看起来像这样

statement.executeUpdate("INSERT OR IGNORE INTO recentlyWatched (fileName, fileLocation, viewCount) VALUES ('"
                + fileName + "', '"
                + fileLocation + "', 0)");
        statement.executeUpdate("UPDATE recentlyWatched SET viewCount = viewCount + …
Run Code Online (Sandbox Code Playgroud)

java sql sqlite

-1
推荐指数
1
解决办法
2562
查看次数

标签 统计

sqlite ×7

sql ×5

python ×2

bulk ×1

cordova ×1

duplicates ×1

insert ×1

java ×1

primary-key ×1

upsert ×1

web-scraping ×1