为什么不能将SQLite ROWID用作主键?

问题描述 投票:11回答:1

这不会执行:

create table TestTable (name text, age integer, primary key (ROWID))

错误消息是:

11-23 11:05:05.298:ERROR / Database(31335):在准备'create table TestTable(name text,age integer,primary key(ROWID))'时,0x2ab378上的失败1(表TestTable没有名为ROWID的列)。

但是,在创建TestTable之后,这准备并执行得很好:

create table TestTable (name text, age integer);

insert into TestTable (name, age) values ('Styler', 27);

select * from TestTable where ROWID=1;

我可能会将ROWID视为需要自动增量主键和外键的解决方案,这些主键永远不会被用作应用层上的数据。由于ROWID默认是从select结果集中隐藏的,因此将它与主键相关联同时将其与应用程序逻辑隐藏起来会很不错。 OracleBlog: ROWNUM and ROWID说这是不可能的,也是不可取的,但除此之外没有提供太多解释。

所以,既然'这可能'的答案绝对不是/不可取的,那么问题或多或少是'为什么不'?

sql sqlite primary-key
1个回答
34
投票

SQLite.org摘要:

在SQLite中,表行通常具有64位有符号整数ROWID,它在同一个表中的所有行中是唯一的。 (WITHOUT ROWID表是例外。)

如果表包含INTEGER PRIMARY KEY类型的列,则该列将成为ROWID的别名。然后,您可以使用四个不同的名称中的任何一个来访问ROWID,原始的三个名称(ROWID_ROWID_OID)或给予INTEGER PRIMARY KEY列的名称。所有这些名称都是彼此的别名,并且在任何情况下都能同样有效。

只需将其用作主键即可。

© www.soinside.com 2019 - 2024. All rights reserved.