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 error,但我不知道出了什么问题,因为:
foo
存在。foo.rowid
存在。foo.rowid
是foo
的主键,因此仅限于唯一性。bar.foo_rowid
是一列,与foo.rowid
为一列的事实相符。答案 0 :(得分:16)
SQLite文档在外键上非常清楚:
The parent key must be a named column or columns in the parent table, not the rowid.
(见here。)
您不能使用rowid
,因此只需为表定义自己的自动递增主键。
答案 1 :(得分:3)
如果未在表中定义,则不能使用rowid,但如果按如下方式定义它:
CREATE TABLE IF NOT EXISTS Clase(
ROWID INTEGER NOT NULL,
nombre VARCHAR(50) NOT NULL,
PRIMARY KEY(ROWID));
ROWID列可用于创建外部引用,当您在表中插入记录时,ROWID列的行为类似于自动增量字段,这就是为什么sqlite建议不要使用自动增量字段。
注意:可以调用ROWID列,否则只有它必须是INTEGER类型和表的主键。