【问题标题】:SQLite - Foreign key referencing rowid alias. Legal or not?SQLite - 引用 rowid 别名的外键。合法与否?
【发布时间】:2014-06-02 20:16:49
【问题描述】:

SQLite documentation 中写道:

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

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

但这适用于 rowid 的别名吗?例如,在 SQLite 中,如果您有一个 INTEGER PRIMARY KEY 列,那么该列本质上是 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 的别名是否合法?谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      相关资源
      最近更新 更多