SQLITE相当于Oracle的ROWNUM?

Rac*_*ion 7 sqlite insert-select

我正在向SQLite3中的表添加一个"索引"列,以允许用户轻松地重新排序数据,方法是重命名旧数据库并使用额外列创建一个新数据库.

我遇到的问题是,当我INSERT ... SELECT旧值时,我需要在'index'列中为每一行赋一个唯一的数字.

我在Oracle中发现了一个名为ROWNUM的有用术语,但SQLite3却没有.在SQLite中有相同的东西吗?

Joh*_*uhn 11

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

  • 不完全是.Oracles ROWNUM适用于查询的*result*.`SELECT rownum FROM tbl WHERE rownum> 3`什么都不会找到(因为第一行将是真的得到rownum 1).但这不是OP的要求.他只需要一个独特的价值. (8认同)

小智 9

没有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;
Run Code Online (Sandbox Code Playgroud)

新表包含:

.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
Run Code Online (Sandbox Code Playgroud)

AUTOINCREMENT就是它的名字所暗示的:每一个额外的行都有前一个'增加1的值.


小智 6

这里的很多人似乎把ROWNUMROWID 混为一谈。它们不是同一个概念,Oracle 两者都有。

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

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

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

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

insert into new 
    select *, row_number() over () 
    from old;
Run Code Online (Sandbox Code Playgroud)