【发布时间】:2012-09-02 02:57:44
【问题描述】:
我正在向 SQLite3 中的表添加一个“索引”列,以允许用户通过重命名旧数据库并使用额外的列在其位置创建一个新数据库来轻松地重新排序数据。
我遇到的问题是,当我插入...选择旧值时,我需要在“索引”列中为每一行指定一个唯一编号。
我在 Oracle 中搜索到了一个有用的术语,叫做 ROWNUM,但 SQLite3 没有。 SQLite 中有没有等价的东西?
【问题讨论】:
标签: sqlite insert-select
我正在向 SQLite3 中的表添加一个“索引”列,以允许用户通过重命名旧数据库并使用额外的列在其位置创建一个新数据库来轻松地重新排序数据。
我遇到的问题是,当我插入...选择旧值时,我需要在“索引”列中为每一行指定一个唯一编号。
我在 Oracle 中搜索到了一个有用的术语,叫做 ROWNUM,但 SQLite3 没有。 SQLite 中有没有等价的东西?
【问题讨论】:
标签: sqlite insert-select
您可以使用特殊行名ROWID、OID 或_ROWID_ 之一来获取列的rowid。有关详细信息,请参阅http://www.sqlite.org/lang_createtable.html#rowid(并且这些行可以被称为ROWID 的普通列隐藏等等)。
【讨论】:
SELECT rownum FROM tbl WHERE rownum > 3 将一无所获(因为这将是真实的第一行获取 rownum 1)。但这不是 OP 的要求。他只需要一个独特的价值。
没有 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。
【讨论】:
这里的许多人似乎将 ROWNUM 与 ROWID 混淆了。它们不是同一个概念,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;
【讨论】:
我相信您想在 SQLite 中使用约束 LIMIT。
SELECT * FROM TABLE 可以返回数千条记录。
但是,您可以通过添加 LIMIT 关键字来限制这一点。
SELECT * FROM TABLE LIMIT 5;
将返回查询中返回的表中的前 5 条记录 - 如果可用
【讨论】: