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等等).
小智 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
这里的很多人似乎把ROWNUM和ROWID 混为一谈。它们不是同一个概念,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)
| 归档时间: |
|
| 查看次数: |
25877 次 |
| 最近记录: |