Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database SQLite';什么是关键关系?_Database_Sqlite_Foreign Keys_Rdbms - Fatal编程技术网

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。试试看。