Bug #12449 DELETE from table references itself
| Submitted: | 9 Aug 2005 4:37 | Modified: | 16 Sep 2005 13:21 |
|---|---|---|---|
| Reporter: | Vadim Tkachenko | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S2 (Serious) |
| Version: | all | OS: | Any (all) |
| Assigned to: | Marko Mäkelä | CPU Architecture: | Any |
[9 Aug 2005 5:55]
Heikki Tuuri
Vadim, 'row-by-row' in this case means that BEFORE deleting the row, InnoDB checks if it is referenced. It is referenced by itself -> a foreign key error. I will document this more clearly in the manual. Workaround: SET FOREIGN_KEY_CHECKS=0 during the delete. Regards, Heikki
[10 Aug 2005 19:31]
Peter Zaitsev
Heikki, What does standard says about this case ? The customer complaint was the behavior is different from what over databases have. Also from common sense it looks like a bug to me. I can understand it might be to hard to fix right now but if it is a bug it should not be dismissed but fixed in the future.
[11 Aug 2005 15:11]
Heikki Tuuri
This is a special case of 'deferred constraint checking. It is in the TODO.
[4 Sep 2005 22:08]
Heikki Tuuri
Assigning Marko to improve the manual about this.
[16 Sep 2005 13:21]
Marko Mäkelä
I have tried to address this in the documentation, <http://dev.mysql.com/doc/mysql/en/innodb-foreign-key-constraints.html>: "Until InnoDB implements deferred constraint checking, some things will be impossible, such as deleting a record that refers to itself via a foreign key."
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.053 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: CREATE TABLE Employee ( empId INT NOT NULL, lastName VARCHAR(32) NULL, firstName VARCHAR(32) NULL, mgrId INT NULL, PRIMARY KEY (empId), FOREIGN KEY (mgrId) REFERENCES Employee (empId) ) type=InnoDB; insert into Employee values (1, 'lastEngOne', 'firstEngOne', 1); delete from Employee where empId = 1; ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails But MySQL doc says: Like MySQL in general, in an SQL statement that inserts, deletes, or updates many rows, InnoDB checks UNIQUE and FOREIGN KEY constraints row-by-row. According to the SQL standard, the default behavior should be that constraints are only checked after the WHOLE SQL statement has been processed. How to repeat: Try script.