在SQLite文档中说:
外键约束的父键不允许使用rowid。父键必须只使用命名列。
父键必须是父表中的一个或多个命名列,
但是这适用于行的别名吗?例如,在SQLite中如果你有一个INTEGER PRIMARY KEY
列那么这个列实际上是行id的别名:
除了下面提到的一个例外,如果一个行表有主键它由单个列和该列的声明类型组成是"INTEGER"在任何混合的大小写,那么列成为队列的别名。这样一列通常是指作为"整型主键"
(异常省略;此处不相关)
这里有一个类似的问题:sql -为什么引用一个SQLite行会导致外键不匹配?- 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>
但是引用行别名合法吗?谢谢。
如果内部行不是命名列,则在VACUUM之后可能不会保留相同的值,这会破坏外键引用。
如果命名了行,则保证保留它的值。使用INTEGER主键作为外键的父键是允许的,并且是常见的。