表foo
没有明确的INTEGER PRIMARY KEY
。
表bar
foo_rowid INTEGER
FOREIGN KEY (foo_rowid) REFERENCES foo(rowid)
。
foo
中的行 f 在rowid
中有bar
x 和行 b 有foo_rowid
x 。
如果VACUUM将 f 的rowid
更改为 y ,是否会更改 b ' s foo_rowid
到 y ?
VACUUM命令可能会更改任何没有显式INTEGER PRIMARY KEY的表中条目的ROWID。
答案 0 :(得分:0)
不,它不适用于非主键rowid
。让我们创建没有主键的表:
$ sqlite3 test.db
SQLite version 3.7.16.2 2013-04-12 11:52:43
sqlite> create table test(name varchar(20));
sqlite> insert into test values('a'),('b'),('c');
sqlite> select rowid,* from test;
1|a
2|b
3|c
到目前为止一切顺利。我们删除一些东西:
sqlite> delete from test where rowid=2;
sqlite> select rowid,* from test;
1|a
3|c
哇,rowid被保留了 - 这很有希望!但是,在VACUUM之后会发生什么?
sqlite> vacuum full;
sqlite> select rowid,* from test;
1|a
2|c
sqlite>
哎呀,它重新编号!
换句话说,您必须创建真正的自动增量列才能使用,并在VACUUM之后保持您的ID不变。
答案 1 :(得分:0)
这是不可能的,因为a rowid cannot be referenced by another table。如果外键可以引用列,则VACUUM
无法更改该列。