I have a question of interest:
I have 2 tables in mysql with InnoDb
.
table tbl_a
has a primary key, named a_id
;
table tbl_b
has a primary b_id
and a foreign key on tbl_a.a_id
with "ON DELETE NO ACTION
".
+-------------+---------------+---------------+
| Table Name | Primary Key | Foreign Key |
+-------------+---------------+---------------+
| tbl_a | a_id | |
| tbl_b | b_id | a_id |
+-------------+---------------+---------------+
why should I still use InnoDb and foreign keys, if i don't really use the magic of foreign keys in the end in anyway?
Is there still a point of using
innodb and foreign keys
instead of
myisam and no foreign keys.
If I just do "NO ACTION
" on deletes or updates?
I hope you got my point of interest 🙂
Best Answer
I think you're misunderstanding what
ON DELETE NO ACTION
means. It does not mean to suppress the foreign-key constraint.When you delete a record that is referred to by a foreign key, InnoDB has the ability to take an automatic action to rectify the situation:
CASCADE
, meaning, delete the referring record. (This would make sense for something likeuser_address.user_id
. If you hard-delete a user, you probably want to hard-delete all of the user's addresses as well.)SET NULL
, meaning, clear out the referring key. (This might make sense for something likefile.last_modified_by
. If you hard-delete a user, you might want the file's last-modified-by to become simply "unknown".)If you specify
NO ACTION
, you're telling InnoDB that you don't want it to take either of these actions. So InnoDB can't fix the situation for you; all it can do is reject theDELETE
and return an error.As a result,
ON DELETE NO ACTION
is actually the same asON DELETE RESTRICT
(the default).(Note: in some DBMSes, and in standard SQL,
ON DELETE NO ACTION
is a bit different fromON DELETE RESTRICT
: in those,ON DELETE NO ACTION
means "accept theDELETE
within the current transaction, but reject the whole transaction if I try to commit it before rectifying the problem". But InnoDB doesn't support deferred checks, so it treatsON DELETE NO ACTION
exactly the same asON DELETE RESTRICT
, and always rejects theDELETE
immediately.)See §§14.2.2.5 "FOREIGN KEY Constraints" and 13.1.17.2 "Using FOREIGN KEY Constraints" in the MySQL 5.6 Reference Manual.