On Fri, Dec 21, 2012 at 6:04 AM, Richard Hipp <d...@sqlite.org> wrote:

> On Thu, Dec 20, 2012 at 3:05 PM, Levi Haskell (BLOOMBERG/ 731 LEXIN) <
> lhask...@bloomberg.net> wrote:
>
> > Tested, works perfectly. Thanks!
> >
> > Two questions/observation:
> >
> > 1. Should there be a way to determine the parent key w/o looking at or
> > parsing the schema DDL commands?
> >
> > For example:
> > SQLite version 3.7.16 2012-12-20 01:15:20
> >
> > Enter ".help" for instructions
> > Enter SQL statements terminated with a ";"
> > sqlite> create table p(a, b, primary key(a, b), unique(b, a));
> > sqlite> create table c(x, y, foreign key(x, y) references p);
> > sqlite> insert into p values (1, 2);
> > sqlite> insert into c values (1, 2), (2, 1);
> > sqlite> pragma foreign_key_check(c);
> > c|2|p|0
> >
>
> The fourth column is the foreign_key_id.  If you look at the output of
> PRAGMA foreign_key_list(c), you'll find all the information about parent
> table and the columns that map between parent and child, for that id.
>
>
> >
> > Now I know that the second record is in violation but I don't know what
> > key/index the foreign key actually refers to (and no other combination of
> > existing pragmas will tell me).
> >
> > 2. While I do like your API far better than what I originally proposed, I
> > found that returning no result in case of success may lead to confusion
> > since unknown pragmas behave the same way. So if I run "pragma
> > foreign_key_check;" and get empty result it can mean any of the
> following:
> >
> > 1. There are no foreign key violations - good!
> > 2. My version of SQLite does not support this pragma yet
> > 3. (In case of using the shell) I made a typo in the pragma name
> >
>
> The pragma throws an error if you enter the name of a table that does not
> exist.  That handles case 3.  To verify 2, that the version of SQLite you
> are using support foreign_key_check, simply use the name of a table that
> does not exist and verify that you get an error back:
>
>       PRAGMA foreign_key_check('no-such-table');  --- expect an error
>
Or check sqlite_version() >= 3.7.16 ?


>
>
>
>
> >
> > While I don't have a better suggestion now, I just wanted to point it out
> > to you.
> >
> > Again thanks a lot!
> > - Levi
> >
> > ----- Original Message -----
> > From: d...@sqlite.org
> > To: LEVI HASKELL (BLOOMBERG/ 731 LEXIN), sqlite-users@sqlite.org
> > At: Dec 19 2012 21:10:52
> >
> >
> >
> > On Wed, Dec 12, 2012 at 2:29 PM, Levi Haskell (BLOOMBERG/ 731 LEXIN) <
> > lhask...@bloomberg.net> wrote:
> >
> >> My suggestion would be to have check_integrity command verify
> referential
> >> integrity as well only if it's executed while the foreign key
> enforcement
> >> is enabled on the connection.
> >>
> >
> > The latest SQLite from trunk (not the 3.7.15.1 patch release, but the
> code
> > that is destined to become 3.7.16) has a new pragma:
> >
> >     PRAGMA foreign_key_check;
> >     PRAGMA foreign_key_check(TABLE);
> >
> > The second from checks all of the REFERENCES clauses in TABLE.  The first
> > form checks the keys on all tables in the database.
> >
> > The result of the pragma is a table, with one row per mismatched key.
>  The
> > row contains the name of the child table, the rowid of the child table,
> the
> > name of the parent table, and the "foreign key index" which is an integer
> > that describes the foreign key in PRAGMA foreign_key_list(CHILD).  If the
> > foreign_key_check pragma returns an empty set, that means that all of the
> > keys are correct.
> >
> > PRAGMA foreign_key_check works regardless of whether or not foreign keys
> > are currently enabled or disabled.
> >
> >
> > --
> > D. Richard Hipp
> > d...@sqlite.org
> >
> >
>
>
> --
> D. Richard Hipp
> d...@sqlite.org
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>



-- 
˙uʍop-ǝpısdn sı ɹoʇıuoɯ ɹnoʎ 'sıɥʇ pɐǝɹ uɐɔ noʎ ɟı
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to