SQLite -外键引用rowid别名.不管合法与否



在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主键作为外键的父键是允许的,并且是常见的。

相关内容

  • 没有找到相关文章