Why does referencing a SQLite rowid cause foreign key mismatch?
Asked Answered
A

2

25
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

Why does this error occur? It is a DML error, but I don't know what's wrong because:

  • foo exists.
  • foo.rowid exists.
  • foo.rowid is the primary key of foo and therefore constrained to uniqueness.
  • bar.foo_rowid is one column, which matches the fact that foo.rowid is one column.
Ammon answered 8/6, 2013 at 17:53 Comment(0)
A
37

SQLite documentation is quite clear on foreign keys:

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

(See here.)

You can't use rowid for this, so just define your own auto incrementing primary key for the table.

Aixlachapelle answered 8/6, 2013 at 17:59 Comment(3)
And it's even possible to name that PK rowid.Litt
I have an error saying: foreign key mismatch - "child_table" referencing "parent_table" . I did what u said but still not working ..Staub
On the other hand, If a table contains a column of type INTEGER PRIMARY KEY, then that column becomes an alias for the ROWID. from sqlite.org/autoinc.htmlCarioca
A
9

You can not use rowid if not defined in your table, but if you define it as follows:

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

The ROWID column can be used to make foreign references, and when you insert a record into the table, the ROWID column behaves like an autoincrement field, it is why that sqlite recommended don't have autoincrement fields.

Note: The ROWID column can be called otherwise only it has to be of type INTEGER and primary key of the table.

Anthelion answered 4/12, 2015 at 16:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.