这并不执行:为什么你不能使用SQLite ROWID作为主键?
create table TestTable (name text, age integer, primary key (ROWID))
的错误信息是:
11月11日至23日:05:05.298:ERROR /数据库(31335):失败1(表TestTable的不具有指定的列ROWID)在准备'创建表TestTable(名称文本,年龄整数,主键(ROWID))'时在0x2ab378上。
然而,在创建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表示这是不可能的和不可取的,但除此之外不提供太多解释。
因此,既然'这是可能'的答案肯定不是/不可取的,那么问题是或多或少'为什么不',?
ROWNUM随记录更新而更改,ROWID根据排序或结果集的顺序而变化。所以RowNum很糟糕,因为每次对主服务器进行更改时都需要更新所有外键。 (大量开销),并且ROWID不好,因为直到结果集被创建和排序,ID才会存在。如果它不存在,则无法加入。 – xQbert
@xQbert如果ROWID被主键引用,它将如何根据结果集中的列顺序进行更改? – styler1972
您的表格中不存在ROWID describe testtable。你会看到ROWID不在那里。 ROWID是系统列和系统维护的值。您不能在系统列上拥有PK;您没有权限执行此操作。关于上述:我把它倒过来; ROWID可以根据更新与ROWNUM进行更改,ROWNUM根据where条款选择更改。 – xQbert