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

sty*_*972 12 sql sqlite primary-key

这不会执行:

create table TestTable (name text, age integer, primary key (ROWID))
Run Code Online (Sandbox Code Playgroud)

错误消息是:

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

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

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

Eug*_*ene 34

来自SQLite.org:

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

只需将其用作主键即可.

  • [添加自动增量键会稍微改变行为](http://www.sqlite.org/autoinc.html).ROWID并不总是合适的,主要是要求单调增加值. (3认同)
  • 通过添加任何自动递增的主键,我实际上是使用ROWID作为主键。我一直在想,因为这很容易,所以我可以将rowid声明为主要的。显然,还有更多的事情要做。这就是我想出不同的想法,可耻的是:D (2认同)