Matthew, sorry, InnoDB does not support deferred constraint checking. It is in the long-term TODO.
Best regards, Heikki Tuuri Innobase Oy http://www.innodb.com Foreign keys, transactions, and row level locking for MySQL InnoDB Hot Backup - a hot backup tool for InnoDB which also backs up MyISAM tables Order MySQL technical support from https://order.mysql.com/ ----- Original Message ----- From: "Matthew Bogosian" <[EMAIL PROTECTED]> Newsgroups: mailing.database.myodbc Sent: Saturday, January 24, 2004 4:11 AM Subject: Re: Postponing Integrity Checking... > On Fri, 23 Jan 2004, Paul DuBois wrote: > > >At 17:32 -0800 1/23/04, Matthew Bogosian wrote: > >>Although this does the trick (kind of), this just turns off integrity > >>checking for that session, right? When I turn it back on, any > >>statement that would have failed but didn't is still in a failed > >>state. In other > > > >Right. You're not supposed to use it in order to do something that can > >screw up your tables. > > But I *can*, and that's the point. I want to use the database to protect > me from myself (or my company's application from its DBAs, etc.). > > >I guess I don't see the point of what you're trying to do. If you > >think you may be doing something that violates a foreign key > >constraint, *and* you want to roll it back if so, then just let the > >error occur within the transaction and roll it back if it does. > > Yes, I want all the constraints to be maintained. But the change I want > to make violates one of them, but only temporarily. > > I'm sorry for not conveying what I mean more clearly. Here's a simpler > question. Given: > > CREATE TABLE test_parent > ( > id INTEGER NOT NULL PRIMARY KEY > ) TYPE = INNODB; > > CREATE TABLE test_child > ( > id INTEGER NOT NULL PRIMARY KEY, > > parent_id INTEGER NOT NULL, > INDEX (parent_id), > FOREIGN KEY (parent_id) REFERENCES test_parent (id) ON DELETE > CASCADE > ) TYPE = INNODB; > > INSERT INTO test_parent VALUES (1); > INSERT INTO test_child VALUES (50, 1); > > How do I execute the following UPDATE statements such that I can ensure > that all integrity constraints are maintained upon the completion of the > last one? > > UPDATE test_parent SET id = 6 WHERE id = 1; > UPDATE test_child SET parent_id = 6 WHERE parent_id = 1; > > >>words, I could screw up and so something like: > >> > >> SET FOREIGN_KEY_CHECKS = 0; > >> BEGIN; > >> UPDATE test_parent SET id = 6 WHERE id = 1; > >> UPDATE test_child SET parent_id = 782 WHERE parent_id = 1; > >> COMMIT; > >> SET FOREIGN_KEY_CHECKS = 1; > >> > >>MySQL wouldn't complain in this case, I'd just have a child row who's > >>parent ID pointed to a non-existent parent (ID 782). Ideally, upon > >>reaching the COMMIT there'd be some way for me to have an error (and > >>have the transaction be rolled back). Here's what happens now: > > > >That doesn't make sense. Once you commit, you've committed. You can't > >commit and then roll back. > > Sorry, I was using the word "commit" to mean transaction barrier. What I > meant was to indicate that I am done with the transaction with a desire > to commit the changes, but only if the integrity constraints were > maintained. > > -- > MySQL General Mailing List > For list archives: http://lists.mysql.com/mysql > To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED] > -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]