10

我正在向 SQLite3 中的表添加一个“索引”列,以允许用户通过重命名旧数据库并使用额外的列在其位置创建一个新数据库来轻松地重新排序数据。

我遇到的问题是,当我插入...选择旧值时,我需要在“索引”列中给每一行一个唯一的数字。

我所做的搜索在 Oracle 中发现了一个有用的术语,称为 ROWNUM,但 SQLite3 没有。SQLite 中是否有等价的东西?

4

4 回答 4

13

您可以使用其中一个特殊的行名称ROWIDOID_ROWID_获取列的 rowid。有关更多详细信息,请参见http://www.sqlite.org/lang_createtable.html#rowid(并且这些行可以被调用的普通列隐藏ROWID等等)。

于 2012-09-02T10:24:26.203 回答
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。

于 2012-09-02T09:23:18.387 回答
7

这里的许多人似乎将ROWNUMROWID混淆了。它们不是同一个概念,Oracle 两者都有。

ROWID是数据库 ROW 的唯一 ID。它几乎是不变的(在导入/导出期间更改,但在不同的 SQL 查询中是相同的)。

ROWNUM是查询结果中的行号对应的计算字段。第一行始终为 1,第二行始终为 2,依此类推。它绝对没有链接到任何表行,并且同一表行可能具有非常不同的 rownums,具体取决于查询方式。

Sqlite 有一个 ROWID 但没有 ROWNUM。我发现的唯一等价物是ROW_NUMBER()函数(参见http://www.sqlitetutorial.net/sqlite-window-functions/sqlite-row_number/)。

你可以通过这样的查询来实现你想要的:

insert into new 
    select *, row_number() over () 
    from old;
于 2019-03-22T08:38:36.320 回答
1

我相信您想在 SQLite 中使用约束 LIMIT 。 SELECT * FROM TABLE可以返回数千条记录。但是,您可以通过添加LIMIT关键字来限制这一点。

SELECT * FROM TABLE LIMIT 5; 将返回您查询中返回的表中的前 5 条记录 - 如果可用

于 2020-03-08T16:07:45.010 回答