这不会执行:
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说这是不可能的,也是不可取的,但除此之外没有提供太多解释。
所以,既然'这可能'的答案绝对没有/不可取,那么问题或多或少是'为什么不'?
答案 0 :(得分:34)
SQLite.org摘要:
在SQLite中,表行通常具有64位有符号整数ROWID 这在同一个表中的所有行中是唯一的。 (
WITHOUT ROWID
表是例外。)如果表包含INTEGER PRIMARY KEY类型的列,那么 column成为ROWID的别名。然后,您可以访问ROWID 使用四个不同名称中的任何一个,原来的三个名字(
ROWID
,_ROWID_
或OID
)或给予INTEGER PRIMARY KEY的名称 柱。所有这些名称都是彼此的别名,并且同样有效 在任何情况下都很好。
只需将其用作主键即可。