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

10 sqlite foreign-keys foreign-key-relationship rowid

SQLite文档中,它说:

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

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

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

除了下面提到的一个例外,如果rowid表具有由单个列组成的主键,并且该列的声明类型在大写和小写的任何混合中都是"INTEGER",则该列将成为rowid的别名.这样的列通常被称为"整数主键".

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

这里有一个类似的问题: sql - 为什么引用SQLite rowid会导致外键不匹配?- 堆栈溢出

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

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>
Run Code Online (Sandbox Code Playgroud)

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

CL.*_*CL. 11

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

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