如果我有多个数据库读取器,它们基本上是以“读取”模式打开数据库文件的 Sqlite 实例,那么对于以“创建”模式打开数据库的单个写入器来说,在所有读取器关闭数据库之前无法释放事务,这正常吗?
我试图弄清楚这是 sqlite 的正常行为,还是我正在使用的特定 sqlite 库的错误/限制。
我不明白为什么作者需要等待读者停止使用数据库文件,这对我来说没有意义,因为读者无法更改数据
如果我有多个数据库读取器,它们基本上是以“读取”模式打开数据库文件的 Sqlite 实例,那么对于以“创建”模式打开数据库的单个写入器来说,在所有读取器关闭数据库之前无法释放事务,这正常吗?
我试图弄清楚这是 sqlite 的正常行为,还是我正在使用的特定 sqlite 库的错误/限制。
我不明白为什么作者需要等待读者停止使用数据库文件,这对我来说没有意义,因为读者无法更改数据
我一直在阅读 SQLite 中的全文搜索文档,这一切都是有道理的,只是似乎没有为实际能够将 FTS 行与其他表中的行链接起来做出任何调整。我猜我不想将所有实体的列都放入我的 FTS 表中,因为我无法为其指定数据类型(或 STRICT),并且我不需要为 FTS 索引所有数据。所以我想使用 FK 关系从我的主实体表到其 FTS 表进行 1:1 链接,如下所示:
CREATE VIRTUAL TABLE usersFTS USING fts4(
keywords,
nicknames
);
-- Create the users table with an explicit foreign key reference to usersFTS
CREATE TABLE users(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
usersFTS_id INTEGER NOT NULL,
FOREIGN KEY (usersFTS_id) REFERENCES usersFTS (rowid)
);
-- ... then:
-- Insert into usersFTS and capture the generated rowid for Alice's meta
INSERT INTO usersFTS (keywords, nicknames) VALUES ('software developer linux open-source', 'Ally Alice');
-- Capture the generated rowid for Alice
SELECT last_insert_rowid(); -- Assume it returns 1
-- Insert into users using the captured rowid
INSERT INTO users (name, email, usersFTS_id) VALUES ('Alice', '[email protected]', 1);
-- ... so that:
SELECT usr.id, usr.name, usr.email, fts.keywords, fts.nicknames
FROM usersFTS fts
INNER JOIN users usr ON usr.usersFTS_id = fts.rowid
WHERE fts.keywords MATCH '"software developer"';
但这失败于以下INSERT
声明:
SQL 逻辑错误:外键不匹配 - “users”引用“usersFTS”
似乎虚拟表不能在正常的 FK 关系中引用其 rowid。那么,如何将我的全文搜索表中的一行链接到另一个包含该实体更多数据的表中的一行?有没有办法在 SQLite 中做到这一点并保持引用完整性?
我有一个 sqlite db,它已经增长到 30gb,而且我每天仍在向它推送数据。我有几个服务使用 libsqlite3 向它写入数据。很快它就会变得太大而无法在本地保存。对我来说,迁移到分布式设置的最佳方法是什么?我能想到的一种方法是 sshfs,但如果我的机器处于离线状态,它将不起作用。一个解决方案是将我最近使用的数据库部分缓存在本地,并将其余部分保存在其他地方,这将是完美的。大多数时候,我会使用最近推送的数据。我可以开始存档多年前的数据,但访问它需要手动操作。
我有一个存储磁道的表,我想为每个磁道添加扇区时间。每个磁道可以具有不同数量的扇区,同一磁道将始终具有相同数量的扇区,并且某些磁道不能存在扇区时间。
检索数据时,我也希望获得给定磁道的每个扇区的最低扇区时间。
我能想到的最好的想法是拥有一个带有sector1
, sector2
, ... 等的 json 对象。这没问题,但它需要检索数据的代码来了解其扇区数SELECT
,如下例所示。这意味着还需要存储“扇区数”。
CREATE TABLE test (track TEXT NOT NULL, sectors TEXT);
INSERT INTO test (track, sectors) VALUES ('track1', json_object('sector1', 10, 'sector2', 11, 'sector3', 12));
INSERT INTO test (track, sectors) VALUES ('track1', json_object('sector1', 11, 'sector2', 9, 'sector3', 12));
INSERT INTO test (track, sectors) VALUES ('track1', json_object('sector1', 10, 'sector2', 9, 'sector3', 12));
INSERT INTO test (track, sectors) VALUES ('track1', json_object('sector1', 12, 'sector2', 12, 'sector3', 4));
INSERT INTO test (track, sectors) VALUES ('track2', json_object('sector1', 12, 'sector2', 12, 'sector3', 3, 'sector4', 1));
INSERT INTO test (track) VALUES ('track1');
select * from test;
select min(DISTINCT json_extract(sectors, '$.sector1')), min(DISTINCT json_extract(sectors, '$.sector2')), min(DISTINCT json_extract(sectors, '$.sector3')) from test where track = 'track1';
是否有更好的方法来存储这样的数据并能够SELECT
像我上面所说的那样?
如果删除表末尾的行,自动增量将重置:
sqlite> CREATE TABLE my_table (
id INTEGER PRIMARY KEY
);
...
sqlite> SELECT * FROM my_table;
1
2
3
sqlite> DELETE FROM my_table WHERE id = 3;
sqlite> SELECT * FROM my_table;
1
2
sqlite> INSERT INTO my_table DEFAULT VALUES;
sqlite> SELECT * FROM my_table;
1
2
3
我想要返回最后一个命令
1
2
4
这可能吗?
基于Sqlite文档: https: //www.sqlite.org/datatype3.html#type_conversions_prior_to_comparison,特别是这个声明:
如果一个操作数具有 INTEGER、REAL 或 NUMERIC 关联性,而另一操作数具有 TEXT 或 BLOB 或无关联性,则 NUMERIC 关联性将应用于另一操作数。
我期望以下查询:
CREATE TABLE `invoice` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`amount` DOUBLE PRECISION DEFAULT NULL
);
insert into `invoice` (`amount`) values (4.0);
insert into `invoice` (`amount`) values (15.0);
insert into `invoice` (`amount`) values (4.0);
select *,
typeof(amount), amount = '4',
typeof(sum(amount)), sum(amount) = '4', sum(amount) = '4.0', sum(amount) = 4
from invoice
group by id;
sum(amount) = '4'
为每行返回相同的结果,amount = '4'
因为两个操作数类型在每次比较中都具有相同的类型(使用typeof()
, for non进行验证SUM()
,比较是否按预期工作)。
我有一列定义为字符变化(20)。但它接受超过 20 个字符。我已经搜索过,但找不到任何相关信息(也许我搜索错了)。有没有人遇到过这个问题并知道原因和/或修复方法?
当我在 Rust 中运行这段代码时
statement.read::<i64, _>("creation_utc").unwrap(),
我明白了,
错误 { code: None, message: Some("索引超出范围 (
creation_utc
)") }
但我已经多次验证该列是否在表中。是什么问题导致此错误以及如何解决此错误?
这是我的 GRASS GIS 数据库命令(使用 SQL Lite 驱动程序):
db.execute sql="UPDATE streams_order SET factor=next_stream WHERE number IS NOT NULL AND next_stream IN (SELECT number FROM streams_order)"
但我想要
db.execute sql="UPDATE streams_order SET factor=next_stream WHERE number IS NOT NULL AND next_stream NOT IN (SELECT number FROM streams_order)"
结果应该是:
+---------+--------------+--------+---------+
| stream | next_stream factor | number |
+-------------------------------------------+
370 -1
372 370 370 372
374 440
376 372 376
380 374 374 380
.............................................
它无法在没有任何错误的情况下工作:运行命令后“factor”列为空。如果我放进去效果很好。列类型均为 INT。
包含真实数据的沙箱在这里https://dbfiddle.uk/zg8_xJUz