我在SQLite3的一个表中添加了一个“索引”列,允许用户通过重命名旧数据库并创建一个包含额外列的新数据库来轻松地对数据进行重新排序。
我遇到的问题是,当我索引旧值时,我需要在‘INSERT...SELECT’列中给每一行一个唯一的数字。
我在Oracle中搜索到一个有用的术语,叫做ROWNUM,但是SQLite3没有这个词。在SQLite中有没有类似的东西?
发布于 2012-09-02 18:24:26
您可以使用特殊的行名ROWID、OID或_ROWID_之一来获取列的行or。有关详细信息,请参阅http://www.sqlite.org/lang_createtable.html#rowid (行可以被称为ROWID的普通列隐藏,依此类推)。
发布于 2012-09-02 17:23:18
没有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 45AUTOINCREMENT的作用正如它的名字所暗示的那样:每增加一行,前一行的值就会递增1。
发布于 2019-03-22 16:38:36
这里的许多人似乎把ROWNUM和ROWID搞混了。它们是不同的概念,Oracle同时拥有这两个概念。
ROWID是数据库行的唯一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;https://stackoverflow.com/questions/12233091
复制相似问题