1

PRAGMA foreign_keys已启用。

foo没有明确INTEGER PRIMARY KEY的 .

bar有。foo_rowid INTEGER_FOREIGN KEY (foo_rowid) REFERENCES foo(rowid)

f infoo有 arowidx和行b inbar有 afoo_rowidx

如果VACUUMfrowid更改为y,是否将b更改foo_rowidy

VACUUM 命令可以更改任何没有显式 INTEGER PRIMARY KEY 的表中条目的 ROWID。

4

2 回答 2

1

不,它不适用于非主键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 完整。

于 2013-06-08T07:06:51.687 回答
1

这是不可能的,因为 rowid 不能被另一个表引用。如果一个列可以被外键引用,它就不能被VACUUM.

于 2013-06-09T23:17:57.867 回答