我正在向SQLite3中的表添加一个“索引”列,以允许用户轻松地对数据进行重新排序,方法是重命名旧数据库并使用额外列创建一个新数据库。
我遇到的问题是,当我INSERT ... SELECT旧值时,我需要在'index'列中为每一行赋一个唯一的数字。
我确实在Oracle中发现了一个名为ROWNUM的有用术语,但SQLite3没有。在SQLite中有相同的东西吗?
答案 0 :(得分:11)
您可以使用其中一个特殊行名ROWID
,OID
或_ROWID_
来获取列的rowid。有关详细信息,请参阅http://www.sqlite.org/lang_createtable.html#rowid(并且可以通过名为ROWID
的普通列隐藏行等等。
答案 1 :(得分:8)
没有SQLite没有直接等同于Oracle的ROWNUM。
如果我正确理解您的要求,您应该能够以这种方式基于旧表的排序添加编号列:
create table old (col1, col2);
insert into old values
('d', 3),
('s', 3),
('d', 1),
('w', 45),
('b', 5465),
('w', 3),
('b', 23);
create table new (colPK INTEGER PRIMARY KEY AUTOINCREMENT, col1, col2);
insert into new select NULL, col1, col2 from old order by col1, col2;
新表包含:
.headers on
.mode column
select * from new;
colPK col1 col2
---------- ---------- ----------
1 b 23
2 b 5465
3 d 1
4 d 3
5 s 3
6 w 3
7 w 45
AUTOINCREMENT
按照其名称暗示:每增加一行,前一个'值增加1。
答案 2 :(得分:2)
这里的许多人似乎将 ROWNUM 与 ROWID 混合在一起。它们的概念不同,Oracle两者都有。
ROWID 是数据库ROW的唯一ID。它几乎是不变的(在导入/导出过程中有所变化,但在不同的SQL查询中相同)。
ROWNUM 是与查询结果中的行号相对应的计算字段。第一行始终为1,第二行始终为2,依此类推。它绝对不会链接到任何表行,并且同一表行的行数可能会非常不同,具体取决于查询方式。
Sqlite具有ROWID,但没有ROWNUM。我发现的唯一等效项是 ROW_NUMBER()函数(请参见http://www.sqlitetutorial.net/sqlite-window-functions/sqlite-row_number/)。
您可以通过以下查询来实现所需的目标:
insert into new
select *, row_number() over ()
from old;
答案 3 :(得分:0)
select rowid, * from exampleTable
sqlite已经为你添加了rowid,不需要两次做同样的事情。请注意,在大量插入后,sidite将重新使用rowid,当旧的插入被删除时。
答案 4 :(得分:0)
我相信您想在SQLite中使用限制LIMIT。
Class 'Iterable' does not define '__getitem__', so the '[]' operator cannot be used on its instances
可以返回数千条记录。
但是,您可以通过添加SELECT * FROM TABLE
关键字来限制这一点。
LIMIT
将返回查询中返回的表中的前5条记录-如果有