Database SQLite';什么是关键关系?
已启用 表Database SQLite';什么是关键关系?,database,sqlite,foreign-keys,rdbms,Database,Sqlite,Foreign Keys,Rdbms,已启用 表foo没有显式INTEGER主键 表bar具有foo\u rowid INTEGER和外键(foo\u rowid)引用foo(rowid) foo中的f行具有x的rowid,而bar中的b行具有x的foo\u rowid 如果将f的rowid更改为y,是否将b的foo_rowid更改为y? VACUUM命令可以更改任何表中没有显式整数主键的项的rowid 不,它不适用于非主键rowid。让我们创建不带主键的表: $ sqlite3 test.db SQLite version 3.7
foo
没有显式INTEGER主键
表bar
具有foo\u rowid INTEGER
和外键(foo\u rowid)引用foo(rowid)
foo
中的f行具有x的rowid
,而bar
中的b行具有x的foo\u rowid
如果将f的rowid
更改为y,是否将b的foo_rowid
更改为y?
VACUUM命令可以更改任何表中没有显式整数主键的项的rowid
不,它不适用于非主键
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完整。这是不可能的,因为。如果一列可以被外键引用,它不能被
VACUUM
更改。这个答案只表明VACUUM
可以更改rowid
s;我的问题是:如果发生这种情况,它是否会更改外键以匹配?这是否意味着如果我创建一个非自动递增的主键整数列,那么在执行真空
操作后,该列中的值仍然可以更改?否,任何物理列(您定义为create TABLE语句一部分的列)不能通过真空更改。您确实可以在外键约束中引用rowid。试试看。