PRAGMA foreign_keys已启用。
foo没有显式的INTEGER PRIMARY KEY
barfoo_rowid INTEGERFOREIGN KEY (foo_rowid) REFERENCES foo(rowid)关系。
foo中的f行有x的rowidbar中的b行有x的foo_rowid
如果VACUUM将f'srowid更改为y,是否将b'sfoo_rowid更改为y?
vacuum命令可以更改没有显式整数主键的任何表中条目的行ID。

最佳答案

不,它不适用于非主键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被留下了-这很有希望!然而,真空之后会发生什么?
sqlite> vacuum full;
sqlite> select rowid,* from test;
1|a
2|c
sqlite>

哦,它被重新编号了!
换言之,您必须创建真正的自动递增列才能使其工作,并在真空后保持id的完整性。

关于database - SQLite的VACUUM是否保留关键关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16996712/

10-10 11:05