Bug #2799 | Multi-table DELETE and Foreign Key (bad affected rows) | ||
---|---|---|---|
Submitted: | 14 Feb 2004 16:18 | Modified: | 19 Feb 2004 11:35 |
Reporter: | Rinat Nasibullin | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: InnoDB storage engine | Severity: | S2 (Serious) |
Version: | 4.0.18 | OS: | Windows (Win NT) |
Assigned to: | CPU Architecture: | Any |
[14 Feb 2004 16:18]
Rinat Nasibullin
[15 Feb 2004 4:48]
Rinat Nasibullin
I am sorry, the problem 2 is problem in phpMyAdmin.
[15 Feb 2004 4:51]
Rinat Nasibullin
I am sorry, the problem 2 is problem in phpMyAdmin, when it deleting tables one by one.
[16 Feb 2004 0:03]
Heikki Tuuri
Hi! The fact that MySQL wrongly reports 'affected rows' if those rows are deleted by ON DELETE CASCADE, is a known design deficiency, and will be addressed in a future version. That is why I am changing the status of this bug report to 'deferred'. Starting from 4.0.18, you have to do SET FOREIGN_KEY_CHECKS=0; DROP DATABASE xyz; SET FOREIGN_KEY_CHECKS=1; if there are foreign keys defined in database xyz. This is to protect you from inadvertently breaking the foreign key constraints. I agree that if there are no rows in the child table(s), or all foreign key constraints refer the SAME database, then DROP DATABASE should succeed without a need to turn the foreign key checks off. Regards, Heikki
[17 Feb 2004 0:58]
Rinat Nasibullin
Dont't forget to pay attention to the last line in "test.sql" ! :)
[17 Feb 2004 6:10]
Heikki Tuuri
Hi! The multi-table DELETE deleted only 1 row in my test. Should it delete more? Regards, Heikki heikki@hundin:~/mysql-4.0/client> ./mysql test Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 4.0.19-debug-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> CREATE TABLE `t1` ( -> `id` int( 11 ) NOT NULL AUTO_INCREMENT , -> PRIMARY KEY ( `id` ) -> ) TYPE = InnoDB AUTO_INCREMENT =2; Query OK, 0 rows affected (0.00 sec) mysql> mysql> INSERT INTO `t1` -> VALUES ( 1 ) ; Query OK, 1 row affected (0.00 sec) mysql> mysql> CREATE TABLE `t2` ( -> `id` int( 11 ) NOT NULL default '0', -> UNIQUE KEY `id` ( `id` ) , -> CONSTRAINT `t1_id_fk` FOREIGN KEY ( `id` ) REFERENCES `t1` ( `id` ) -> ) TYPE = InnoDB; Query OK, 0 rows affected (0.00 sec) mysql> mysql> INSERT INTO `t2` -> VALUES ( 1 ) ; Query OK, 1 row affected (0.00 sec) mysql> mysql> CREATE TABLE `t3` ( -> `id` int( 11 ) NOT NULL default '0', -> KEY `id` ( `id` ) , -> CONSTRAINT `t2_id_fk` FOREIGN KEY ( `id` ) REFERENCES `t2` ( `id` ) -> ) TYPE = InnoDB; Query OK, 0 rows affected (0.01 sec) mysql> mysql> INSERT INTO `t3` -> VALUES ( 1 ) ; Query OK, 1 row affected (0.00 sec) mysql> mysql> DELETE t3,t2,t1 -> FROM t1,t2,t3 -> WHERE t1.id =1 AND t2.id = t1.id AND t3.id = t2.id;# Affected rows:1 Query OK, 1 row affected (0.02 sec) mysql> select * from t3; Empty set (0.00 sec) mysql> select * from t2; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec) mysql> select * from t1; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec) mysql>
[17 Feb 2004 9:41]
Rinat Nasibullin
There should be three affected rows, i.e. all tables after multi-table DELETE query should be empty. The multi-table DELETE query don't work true, when the tables have this relations (with foreign keys): t3.id -> t2.id -> t1.id If delete tables in order by t3, t2, t1, then all should be ok. MySQL this understand? :) SHOW INNODB STATUS: --begin----------------------------------- ===================================== 040217 20:41:09 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 55 seconds ---------- SEMAPHORES ---------- OS WAIT ARRAY INFO: reservation count 238, signal count 238 Mutex spin waits 75, rounds 1200, OS waits 15 RW-shared spins 440, OS waits 220; RW-excl spins 4, OS waits 3 ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 040217 20:40:27 Transaction: TRANSACTION 0 24246, ACTIVE 0 sec, OS thread id 404 updating or deleting, thread declared inside InnoDB 496 mysql tables in use 3, locked 3 7 lock struct(s), heap size 1024, undo log entries 1 MySQL thread id 18, query id 18357 localhost 127.0.0.1 root deleting from reference tables DELETE t3, t2, t1 FROM t1, t2, t3 WHERE t1.id =1 AND t2.id = t1.id AND t3.id = t2.id Foreign key constraint fails for table test/t3: , CONSTRAINT `t2_id_fk` FOREIGN KEY (`id`) REFERENCES `t2` (`id`) Trying to delete or update in parent t... --end----------------------------------
[17 Feb 2004 9:45]
Heikki Tuuri
Sinisa, can you check if the behavior is right in that multi-table DELETE? At least, it seems to swallow the FOREIGN KEY error generated there, and does not roll back the full statement. Regards, Heikki
[18 Feb 2004 11:51]
MySQL Verification Team
This bug happens only if foreign key constrants exist. MySQL optimizer simply re-orders tables in the order that suits best the join procedure. This results in error that is not reported. I also think that multi-table deletes / updates should not be used with tables being related with foreign key constraints. I will write about this to our docs dept. I have now fixed this so that error is reported and statement is rolled back. I will soon post also a similar fix for multi-table updates.
[19 Feb 2004 11:35]
MySQL Verification Team
patch is pushed.