SQLite的VACUUM是否保留了关键关系?

时间:2013-06-08 06:20:41

标签: database sqlite foreign-keys rdbms

PRAGMA foreign_keys已启用。

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。

2 个答案:

答案 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无法更改该列。