IIRC, there was a bug in enforcement compound foreign keys where one of columns is primary key and it was fixed. So if you take the latest SQLite version I guess you won't see this problem.
Pavel On Fri, Jun 10, 2011 at 11:12 AM, Max B <m...@alleged.net> wrote: > Hello, > > Please consider this (working) schema and this test data, on sqlite 3.7.4: > > CREATE TABLE TestTable ( > id integer primary key, > name varchar, > source_id integer not null, > parent_id integer, > foreign key(parent_id) references TestTable(id) > ); > > PRAGMA foreign_keys=1; > INSERT INTO TestTable VALUES (1, 'Parent', 1, null); > INSERT INTO TestTable VALUES (2, 'Child', 1, 1); > INSERT INTO TestTable VALUES (3, 'Bad', 1, 5); > > This schema is supposed to represent some object which can have an internal > parent/child hierarchy, enforced using the self-referential foreign key. The > first two inserts should work, and the third should fail with a foreign key > error, which it does. > > Next, I wanted to enforce that the source_id between the parent and child are > also identical: that is parents and children must come from the same source. > > So, I tweaked it to use a composite foreign key, and created the required > UNIQUE > index: > > CREATE TABLE TestTable ( > id integer primary key, > name varchar, > source_id integer not null, > parent_id integer, > foreign key(source_id, parent_id) references TestTable(source_id, id) > ); > > CREATE UNIQUE INDEX testindex on TestTable(source_id, id); > > PRAGMA foreign_keys=1; > INSERT INTO TestTable VALUES (1, 'Parent', 1, null); > INSERT INTO TestTable VALUES (2, 'Child', 1, 1); > INSERT INTO TestTable VALUES (3, 'Bad', 1, 5); > > In this situation, the third insert succeeds, in spite of it's parent id not > existing. sqlite fails to enforce the constraint. > > If I tweak the schema *slightly*, only replacing 'integer primary key' with > 'integer unique', I do get the expected behaviour: > > CREATE TABLE TestTable ( > id INTEGER UNIQUE, > name VARCHAR, > source_id INTEGER NOT NULL, > parent_id INTEGER, > FOREIGN KEY(source_id, parent_id) REFERENCES TestTable(source_id, id) > ); > > CREATE UNIQUE INDEX testindex ON TestTable(source_id, id); > > In this case, the third insert fails as expected. However, this is not > substantively different then the second schema, but one enforces the FK > properly > and the other doesn't. I looked at the opcodes for the second, but couldn't > figure out the logic error. > > If it matters, I'm doing this testing on Ubuntu 11.04, with sqlite 3.7.4. > > > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users