20
SQLite version 3.7.9 2011-11-01 00:52:41
sqlite> PRAGMA foreign_keys = 1;
sqlite> CREATE TABLE foo(name);
sqlite> CREATE TABLE bar(foo_rowid REFERENCES foo(rowid));
sqlite> INSERT INTO foo VALUES('baz');
sqlite> SELECT rowid, name FROM foo;
1|baz
sqlite> INSERT INTO bar (foo_rowid) VALUES (1);
Error: foreign key mismatch

为什么会出现这个错误?这是一个DML 错误,但我不知道出了什么问题,因为:

  • foo存在。
  • foo.rowid存在。
  • foo.rowid是的主键,foo因此受限于唯一性。
  • bar.foo_rowid是一列,这与是一列的事实相匹配foo.rowid
4

2 回答 2

26

SQLite 文档对外键非常清楚:

The parent key must be a named column or columns in the parent table, not the rowid.

(见这里。)

您不能rowid用于此,因此只需为表定义您自己的自动递增主键。

于 2013-06-08T17:59:56.340 回答
6

如果未在表中定义,则不能使用 rowid,但如果按如下方式定义:

CREATE TABLE IF NOT EXISTS Clase(
ROWID INTEGER NOT NULL,
nombre  VARCHAR(50) NOT NULL,
PRIMARY KEY(ROWID));

ROWID 列可用于进行外部引用,当您向表中插入记录时,ROWID 列的行为就像一个自增字段,这就是为什么那个 sqlite 建议不要有自增字段的原因。

注意:可以调用 ROWID 列,否则只有它必须是 INTEGER 类型和表的主键。

于 2015-12-04T16:12:49.493 回答