标签: sqlite

在 SQLite 上写入一行需要多少次磁盘搜索?

据我所知,硬盘每旋转一圈可以有一次磁盘搜索,因此我很想知道将一行写入 SQLite 表需要多少磁盘搜索,包括锁定等。假设没有索引在桌子上(甚至不是主键)。我假设有一个磁盘试图将一行写入文件?如您所知,我想将性能与将相同数据写入平面文件进行比较。

sqlite csv

7
推荐指数
1
解决办法
389
查看次数

仅当记录不存在时如何插入记录?

我有一张PaymentInformation桌子

ID   NAME       Start       End
1    Tina       1/7/2014    1/17/2014
2    Alice      3/7/2014    3/17/2014 
3    John       5/7/2014    5/17/2014 
4    Michelle   7/7/2014    7/17/2014 
Run Code Online (Sandbox Code Playgroud)

我正在动态构建我的 SQL 查询,如下所示:

SQLiteDataBaseQueryHolder3 = "INSERT INTO " + SQLiteHelper.TABLE2_NAME + "(" +
                            "name, Start, End" +
                            ")VALUES('" +
                            tempName + "'" +
                            ",'" +start + "'" +
                            ",'" + end + "" +
                            "')" +
                            " WHERE NOT EXISTS ( SELECT * FROM " +SQLiteHelper.TABLE2_NAME +" WHERE name = '"+
                            tempName+"' AND Start = '"+Start+"')"
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果(为了可读性而格式化): …

sqlite insert duplication

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

SQLite - 计数如何在没有 GROUP BY 的情况下工作?

有一个像这样的表:

first_name    last_name
------------------------
jack          frost
john          wayne
betty         white
null          jackson
Run Code Online (Sandbox Code Playgroud)

这个查询:

first_name    last_name
------------------------
jack          frost
john          wayne
betty         white
null          jackson
Run Code Online (Sandbox Code Playgroud)

MySQL 和 Postgres 甚至不会运行它。他们以某种方式知道这需要 GROUP BY。

SQLite 生成单行结果:jack 3

MySQL 和 Postgres 如何知道这需要 GROUP BY?为什么还需要 GROUP BY?

为什么 SQLite 的结果是一行?我本来期望输出是这样的:

jack 3
john 3
betty 3
null 3
Run Code Online (Sandbox Code Playgroud)

sqlite aggregate

7
推荐指数
2
解决办法
8099
查看次数

如何在 SQLite 中使用 CREATE TABLE ... AS 和主键

来自 CREATE TABLE http://www.sqlite.org/lang_createtable.html 的SQLite 文档:

使用 CREATE TABLE AS 创建的表没有 PRIMARY KEY 并且没有任何类型的约束。

那么有没有什么通用的方法来创建带有主键和其他索引信息的表?

sqlite

6
推荐指数
1
解决办法
9179
查看次数

如何从命令行在 sqlite3 中指定超时?

我有几个基本脚本,它们在填充我的 sqlite3 数据库时踢出一些信息,但大约有一半的时间命令立即失败:

$ sqlite3 outgoing.db "select * from edges where worker is not null;"
Error: database is locked
$ sqlite3 outgoing.db "select * from edges where worker is not null;"
Error: database is locked
$ sqlite3 outgoing.db "select * from edges where worker is not null;"
1014->9000|1014|9000||-1.0|2
1014->9001|1014|9001||-1.0|2
...
Run Code Online (Sandbox Code Playgroud)

如果我添加.timeout 1;到命令的开头,我只会收到一个语法错误;如何.通过命令行以非交互方式向sqlite 传递特殊参数?

sqlite

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

与属性的多对多关系

我正在做一个需要图书数据库的项目。问题如下:

一本书可以与多个人(作者、编辑、翻译者等)相关。那么一个人可能会以不同的角色为不同的书籍做出贡献。

Book1 PersonA (author), PersonB(editor)
Book2 PersonC (author), PersonB(translator), PersonD(editor)
Book3 PersonE (author), PersonA(editor)
Run Code Online (Sandbox Code Playgroud)

我有一张BOOKS桌子(bookID, bookTitle),一张PEOPLE桌子(personID, personName)和一张ROLES桌子(roleID, roleName)。然后我需要一种方法来关联这些表,然后查询它们。我想到了一个具有以下行结构的连接表:

bookId personID roleID
Run Code Online (Sandbox Code Playgroud)

这是处理这个问题的最佳方式吗(在所有这些表上插入、更新和删除条目时)?如果没有,有哪些替代方案?

注意:我使用的是 SQLite3。

PS:我希望我对术语的使用是正确的。

sqlite database-design

6
推荐指数
1
解决办法
600
查看次数

如何强制执行“每组一个”约束?

我有一个x这样定义的表:

CREATE TABLE x (
    xid INTEGER NOT NULL PRIMARY KEY,
    yid INTEGER NOT NULL REFERENCES y(yid),
    is_principal BOOLEAN NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

该定义遗漏了一个必须满足的约束x。用英语来说,这个约束可以这样描述:

字段中可能有一行或多行具有给定值yid,但其中必须始终有一行is_principal字段为TRUE1

我正在寻找一种方法来强制执行此约束。

(如果重要的话,我对适用于 SQLite3 和 PostgreSQL 的解决方案特别感兴趣。)

编辑:为了清楚起见,上面的描述并不排除 table 中存在y其值yid在 table 中根本没有提及的行x。对于 的此类值,yid根本没有任何价值xid,无论是本金价值还是其他价值。仅对于yid 表中出现的 x那些值,表中必须有且只有一行x具有is_principal = TRUE


1表达相同约束的另一种方法是以下两个查询应始终产生相同的输出:

SELECT DISTINCT yid FROM x                    ORDER BY yid; …
Run Code Online (Sandbox Code Playgroud)

postgresql sqlite database-design constraint

6
推荐指数
1
解决办法
3910
查看次数

直接将 csv gzip 文件导入 SQLite 3

我想将 15GB 文件逗号分隔的 gzip 压缩文件导入 Sqlite 3,而不必使用临时文件。

我想运行如下命令:

zcat input/surgical_code.csv.gz | tail -n +2 | sqlite3 db.sqlite ".import /dev/stdin surgical_code"
Run Code Online (Sandbox Code Playgroud)

这会解压缩文件,跳过标题并尝试导入。

问题是我无法在与 SQlite3 相同的引用命令上指定.mode cvs.separator ","

有任何想法吗?

使用$(echo -e 'line1\nline2')对我不起作用:

gzcat input/surgical_code.csv.gz | tail -n +2 | sqlite3 db.sqlite $(echo -e '.mode csv \n .separator \",\"\n.import /dev/stdin')
Run Code Online (Sandbox Code Playgroud)

Error: mode should be one of: ascii column csv html insert line list tabs tcl

sqlite import csv

6
推荐指数
2
解决办法
3798
查看次数

为什么使用相关子查询的不正确 JOIN 会慢得多

我在做一些相当轻量级的数据按摩/清洁跑进其中使用相关子查询(可能是错误的)JOIN的一个版本跑了太大的问题很多比我相信这是正确的慢。我不问如何查询(我相信现在我已经得到了正确的),但我想知道为什么慢版是如此缓慢。

问题

该域是一个相当简单的数据库,用于管理彩票辛迪加(记录会员付款、玩的游戏和获胜)。在转向新引擎 (SQLite) 时,我正在尝试清理数据并改进表的结构。

现有_Winnings表格记录了赢得的金额和日期以及“游戏类型”(可以玩多个游戏):

CREATE TABLE [_Winnings](
    [ID]                integer primary key not null,
    [WinDate]           date,
    [Amount]            integer,
    [GameType]          integer references _Games(ID)
);
CREATE INDEX [_WinningsIndex] on _Winnings(GameType) ;
Run Code Online (Sandbox Code Playgroud)

主要问题是没有链接(除了获胜日期)到实际玩的游戏。这些记录已经被迁移,现在保存在一个EventHistory表中:

CREATE TABLE [EventHistory](
    [ID]                integer primary key not null,
    [EventType]         integer references Events(ID),
    [GameType]          integer references Games(ID),
    [EventDate]         date
);
CREATE INDEX [EventHistoryEventIndex] on EventHistory(EventType) ;
CREATE INDEX [EventHistoryGameIndex]  on EventHistory(GameType) ;
CREATE INDEX [EventHistoryDateIndex]  on EventHistory(EventDate) ;
Run Code Online (Sandbox Code Playgroud)

三个表_Games, …

sqlite performance subquery query-performance

6
推荐指数
1
解决办法
133
查看次数

WHERE 子句中未使用的列

我在我们的代码库中找到了这个查询:

DELETE FROM "Foo"
WHERE ("Foo"."Id", "Foo"."CreatedAt")
IN (SELECT "f"."Id", "f"."CreatedAt"
    FROM "Foo" AS "f"
    WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

它删除当前时间之前创建的记录。

这给出了相同的结果:

DELETE FROM "Foo"
WHERE "Foo"."CreatedAt"
IN (SELECT "f"."CreatedAt"
    FROM "Foo" AS "f"
    WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

我不知道为什么Foo.Id将 包含在WHERE子句中 - 也许是各种重构留下的垃圾(例如,它可能已用于批量删除ORDER BY "f"."Id" LIMIT 1000)。但因为这是一场PK,我不愿意删除它,因为也许它的存在是有原因的。

是否有理论/性能原因将其放在那里,或者这两个查询是否等效?

(这同时针对 postgres 和 sqlite。)

postgresql sqlite query subquery relational-theory

6
推荐指数
1
解决办法
773
查看次数