MySQL on delete cascade. Test Example

后端 未结 2 1704
谎友^
谎友^ 2020-12-01 12:32

I am wondering about this test question. I prepared the example myself and tested it but I still feel unsure of the answer.

With the following:

CREAT         


        
相关标签:
2条回答
  • 2020-12-01 12:47

    Answer d. is correct, if and only if the storage engine actually supports and enforces foreign key constraints.

    If the tables are created with Engine=MyISAM, then neither b. or d. is correct.

    If the tables are created with Engine=InnoDB, then d. is correct.

    NOTE:

    This is true for InnoDB if and only if FOREIGN_KEY_CHECKS = 1; if FOREIGN_KEY_CHECKS = 0, then a DELETE from the parent table (foo) will not remove rows from the child table (foo2) that reference a row removed from the parent table.

    Verify this with the output from SHOW VARIABLES LIKE 'foreign_key_checks' (1=ON, 0=OFF) (The normal default is for this to be ON.)

    The output from SHOW CREATE TABLE foo will show which engine the table uses.

    The output from SHOW VARIABLES LIKE 'storage_engine' will show the default engine used when a table is created and the engine is not specified.

    0 讨论(0)
  • 2020-12-01 12:55

    You do have a relationship between two tables, it's in the foo2 creation command: ... foo_id int references foo(id) on delete cascade.

    According to the MySQL Foreign Key Constraints reference:

    CASCADE: Delete or update the row from the parent table, and automatically delete or update the matching rows in the child table. Both ON DELETE CASCADE and ON UPDATE CASCADE are supported.

    Also, according to the MySQL Foreign Keys reference:

    For storage engines other than InnoDB, it is possible when defining a column to use a REFERENCES tbl_name(col_name) clause, which has no actual effect, and serves only as a memo or comment to you that the column which you are currently defining is intended to refer to a column in another table.

    So since the foreign key is from the child table to the parent table, it makes foo a parent table and foo2 a child table, so deleting a row from foo will cascade deletions to foo2, providing you use InnoDB or some other storage engine that supports it.

    0 讨论(0)
提交回复
热议问题