> # http://answers.oreilly.com/topic/1955-how-to-use-full-text-search-in-sqlite/
> Unlike traditional tables, the ROWID of an FTS table is stable through
> a vacuum (VACUUM in Appendix C), so it can be reliably referenced
> through a foreign key.

I'm not sure who wrote that but this page
http://www.sqlite.org/lang_createtable.html states explicitly (at the
very end): "The parent key of a foreign key constraint is not allowed
to use the rowid".


Pavel


On Sun, Nov 11, 2012 at 9:49 PM, Darren Spruell <[email protected]> wrote:
>
> I'm stuck on some errors related to my use of foreign key constraints
> in my application. The following illustrates:
>
> $ sqlite3
> SQLite version 3.7.9 --SOURCE-ID--
> Enter ".help" for instructions
> Enter SQL statements terminated with a ";"
> sqlite> PRAGMA foreign_keys = ON;
> sqlite> CREATE VIRTUAL TABLE comment USING fts4();
> sqlite> CREATE TABLE ip (
>    ...>             id INTEGER PRIMARY KEY, date_added DEFAULT CURRENT_DATE,
>    ...>             ip VARCHAR(15) NOT NULL UNIQUE, comment INTEGER NOT NULL,
>    ...>             FOREIGN KEY(comment) REFERENCES comment);
> sqlite> CREATE INDEX ipcommentindex ON ip(comment);
> sqlite> INSERT INTO comment VALUES ('this is a comment.');
> sqlite> SELECT rowid,content FROM comment;
> 1|this is a comment.
> sqlite> SELECT last_insert_rowid();
> 1
> sqlite> INSERT INTO ip (ip,comment) VALUES ('10.0.1.1',last_insert_rowid());
> Error: foreign key mismatch
> sqlite> INSERT INTO ip (ip,comment) VALUES ('10.0.1.1',1);
> Error: foreign key mismatch
>
>
> Thinking I understand the requirements for foreign key constraints, I
> don't know why my INSERT into ip table returns 'foreign key mismatch'
> error.
>
> When I leave foreign key constraints off, things work as I would expect:
>
>
> sqlite> CREATE VIRTUAL TABLE comment USING fts4();
> sqlite> CREATE TABLE ip (
>    ...>             id INTEGER PRIMARY KEY, date_added DEFAULT CURRENT_DATE,
>    ...>             ip VARCHAR(15) NOT NULL UNIQUE, comment INTEGER NOT NULL,
>    ...>             FOREIGN KEY(comment) REFERENCES comment);
> sqlite> CREATE INDEX ipcommentindex ON ip(comment);
> sqlite> INSERT INTO comment VALUES ('this is a comment.');
> sqlite> SELECT rowid,content FROM comment;
> 1|this is a comment.
> sqlite> SELECT last_insert_rowid();
> 1
> sqlite> INSERT INTO ip (ip,comment) VALUES ('10.0.1.1',last_insert_rowid());
> sqlite> SELECT * FROM ip;
> 1|2012-11-12|10.0.1.1|1
>
>
> I suspect the issue might stem from trying to use the rowid in the
> comment table as the parent key in the foreign key on the ip table,
> reading:
>
> # http://www.sqlite.org/foreignkeys.html
> The parent key is the column or set of columns in the parent table
> that the foreign key constraint refers to. This is normally, but not
> always, the primary key of the parent table. The parent key must be a
> named column or columns in the parent table, not the rowid.
>
> ...but then this kind of reads like it's supported:
>
> # http://answers.oreilly.com/topic/1955-how-to-use-full-text-search-in-sqlite/
> Unlike traditional tables, the ROWID of an FTS table is stable through
> a vacuum (VACUUM in Appendix C), so it can be reliably referenced
> through a foreign key.
>
>
> I'm struggling to find a clear way to achieve a foreign key
> constrained relation between these tables if a.) the FTS table can't
> define an INTEGER PRIMARY KEY column to function as the parent key for
> a child table, or b.) child tables can't reference the rowid on an FTS
> parent table as the parent key.
>
> Clue bat appreciated.
>
> --
> Darren Spruell
> [email protected]
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to