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

时间:2011-11-23 17:38:08

标签: sql sqlite primary-key

这不会执行:

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

错误消息是:

  

11-23 11:05:05.298:ERROR / Database(31335):在准备'create table TestTable(名称文本,年龄整数,主键(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说这是不可能的,也是不可取的,但除此之外没有提供太多解释。

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

1 个答案:

答案 0 :(得分:34)

SQLite.org摘要:

  

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

     

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

只需将其用作主键即可。