我想我正在使用最新版本的 Sqlite 和 C++。我有一张包含数据的表,我需要按照插入顺序返回这些数据。
我是否可以保证这些列始终会按照此顺序返回?
也许我必须添加另一列来设置顺序并使用 ORDER BY:
我有一个 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
我尝试使用来自gras gis的内部连接进行查询(但在该社区中,这个问题被认为是题外话,所以它似乎只涉及SQL lite):
db.execute sql="UPDATE A SET A.next2=B.next_stream
FROM stream_order2 AS A
INNER JOIN stream_order2 AS B ON A.factor=B.stream"
我必须这样做,因为我想将 next2 的值设置为表中对应于等于因子值的流编号的下一个流的值。db.execute 抛出错误。
然后我更新了命令并删除了 A. 语句。现在错误是:
Error in sqlite3_prepare():
near "FROM": syntax error
我尝试在ON后删除A.,但这没有帮助,我不认为这是问题所在。
我遇到了一种情况,我想根据第二列的值按升序或降序对列进行排序(本质上,如果 A 列是奇数,则按升序对 B 列进行排序,否则按降序排序)。例子:
A | 乙 |
---|---|
1 | 1 |
1 | 2 |
1 | 3 |
2 | 4 |
2 | 5 |
2 | 6 |
3 | 7 |
3 | 8 |
3 | 9 |
将被排序为
A | 乙 |
---|---|
1 | 1 |
1 | 2 |
1 | 3 |
2 | 6 |
2 | 5 |
2 | 4 |
3 | 7 |
3 | 8 |
3 | 9 |
这是否可以在单个 SQL 查询中实现,或者我是否必须在数据库之外解决这个问题?我有大约 60 个不同的 A 值,因此为每个可能的 A 值编写单独的查询并不是一个可行的选择。
我尝试使用“ORDER BY b if (A%2=1, ASC, DESC)”,这(毫不奇怪)不起作用。