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]