PRAGMA foreign_keys
已启用。
表foo
没有显式的INTEGER PRIMARY KEY
。
表bar
与foo_rowid INTEGER
有FOREIGN KEY (foo_rowid) REFERENCES foo(rowid)
关系。foo
中的f行有x的rowid
和bar
中的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/