Are we confusing immediate constraints (checked per statement) with DEFERRED constraints (checked at COMMIT time) again?
> -----Original Message----- > From: sqlite-users-bounces at mailinglists.sqlite.org [mailto:sqlite-users- > bounces at mailinglists.sqlite.org] On Behalf Of R Smith > Sent: Tuesday, 5 April, 2016 06:58 > To: sqlite-users at mailinglists.sqlite.org > Subject: Re: [sqlite] FOREIGN KEY constraint failed > > > > On 2016/04/04 10:43 PM, Domingo Alvarez Duarte wrote: > > Thanks for reply ! > > > > I already sent a proposal to Richard to add a pragma "PRAGMA DEBUG_MODE" > and > > when set throw any kind of error to stderr/sqlite3_(hook) this way ther > is no > > need to store temporary conditions to show later. > > > > And of course sqlite knows which table/field failed to flag the error, > it > > doesn't throw a dice to do it. > > The thing you are missing, is that there might be thousands of FK > violations throughout a transaction, all of which (or most of which) > might get resolved before the end of the transaction, and as such is > absolutely useless to inspect/record/notify/whatever. > > Let's assume there are one thousand violations, and three of them did > not get resolved, such as violation number 322, no. 567 and no. 828. > If you "ask the user" or the program via API about every one of the 1000 > violations, surely the time-waste will be intense, and even if you can > live with the time-waste, how will the application/user ever know that > violation no. 435, for instance, is going to definitely get resolved so > that it might report back to the API some form of "OK, we can accept > this one" or record for its own purposes the violation to "deal with > later" when in fact at some point it gets resolved without necessarily a > second check and certainly not a second failure to revisit it? > > It is extremely rare that the "Last violation" (number 1000 in our > example above) is going to end up being THE ONE, or even "one of" the > offenders. Perhaps only in cases where there is only 1 FK violation in > the entire scope of the transaction, and those cases are rarest (such as > a single insert/delete) and if it does happen, you already know the > exact item causing violation, so the API to disclose its identity is > superfluous. > > The only way this feature is feasible is keeping a complete list of > violations internally and a mechanism to revisit them marking the > resolve (if any). The mechanism itself will be heavy and the memory > footprint of the list can run into gigabytes easily, even for a mediocre > database, seeing as a transaction updating 10 rows may easily need to > check hundreds of FK constraints and recursed constraints. > > As Mr. Bee pointed out - we see this question asked often, lots of > people would like to have it implemented. This may be true, but that's > simply because, without investigation, the concept/implementation seems > easy to lots of people. It only seems that way though. > > Cheers, > Ryan > > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users