SQLite - 引用rowid别名的外键。合法与否?

时间:2014-06-02 20:16:50

标签: sqlite foreign-keys foreign-key-relationship rowid

SQLite documentation中说:

  

不允许外键约束的父键使用   ROWID。父键只能使用命名列。

     

父键必须是父表中的一个或多个命名列,   不是rowid。

但这是否适用于rowid的别名?例如,如果您有一个INTEGER PRIMARY KEY列,那么在SQLite中该列实际上是rowid的别名:

  

如下所示,如果rowid表有主键,则会出现一个例外情况   它由单个列和该列的声明类型组成   在大写和小写的任何混合物中都是“INTEGER”,然后是列   成为rowid的别名。通常提到这样的列   作为“整数主键”。

(省略例外;此处不相关)

这里有一个类似的问题: sql - Why does referencing a SQLite rowid cause foreign key mismatch? - Stack Overflow

如果我采用该示例并将其修改为使用别名(我的整数主键列),它似乎可以工作:

sqlite> CREATE TABLE foo(a INTEGER PRIMARY KEY, name);
sqlite> create table bar(foo_rowid REFERENCES foo(a));
sqlite> INSERT INTO foo VALUES( NULL, "baz" );
sqlite> select * from foo;
a           name
----------  ----------
1           baz
sqlite> INSERT INTO bar (foo_rowid) VALUES(1);
sqlite> select * from bar;
foo_rowid
----------
1
sqlite>

但引用rowid的别名是否合法?感谢。

1 个答案:

答案 0 :(得分:11)

如果内部rowid不是命名列,则在VACUUM之后可能不会保留相同的值,这会破坏外键引用。

如果命名了rowid,则保证保留其值。 允许使用INTEGER PRIMARY KEY作为外键的父级,并且是通用的。