MySQL - On Delete Cascade



The MySQL ON DELETE CASCADE Constraint

The MySQL ON DELETE CASCADE constraint ensures that when a row in the parent table is deleted, all related rows in the child table are automatically deleted as well. This constraint helps maintain referential integrity between two tables that are connected through a foreign key relationship.

If we do not use this constraint, the database server will, by default, prevent us from deleting data in a table if it is referenced by other tables.

Example

Creating the Parent Table −

First, let us create the parent table with the name PERSONS using the following query −

CREATE TABLE PERSONS(
   P_ID int primary key,
   P_NAME varchar(40),
   P_AGE int
);

Now, let us insert some values into the above created table using the INSERT statement as shown below −

INSERT INTO PERSONS VALUES 
(1, "Priya", 29),
(2, "Sarah", 20),
(3, "Varun", 26),
(4, "Dev", 25),
(5, "Ram", 31),
(6, "Aarohi", 34);

The PERSONS table obtained is as shown below −

P_ID P_NAME P_AGE
1 Priya 29
2 Sarah 20
3 Varun 26
4 Dev 25
5 Ram 31
6 Aarohi 34

Creating the Child Table −

Now, let us create a child table named Films_watched with the ON DELETE CASCADE constraint. In this table, the P_ID column is a foreign key referencing the P_ID column in the Persons table −

CREATE TABLE Films_watched (
   P_ID INT,
   F_NO INT,
   F_NAME varchar(40),
   PRIMARY KEY(P_ID,F_NO),
   FOREIGN KEY(P_ID)
   REFERENCES PERSONS(P_ID)
   ON DELETE CASCADE
);

Now, we are inserting rows into the Films_watched table −

INSERT INTO Films_watched VALUES 
(1, 130, "RRR"),
(2, 131, "Bahubali"),
(3, 132, "Pushpa"),
(3, 133, "KGF"),
(3, 134, "Salaar"),
(6, 135, "Karthikeya");

The Films_watched table produced is as follows −

P_ID F_NO F_NAME
1 130 RRR
2 131 Bahubali
3 132 Pushpa
3 133 KGF
3 134 Salaar
6 135 Karthikeya

Deleting a Record from the Parent Table −

As we can see in the above table, we have three films that has been watched by the person with P_ID = 3. Here, we are deleting the person with P_ID = 3 from the PERSONS (parent) table −

DELETE FROM PERSONS WHERE P_ID = 3;

Following is the output obtained −

Query OK, 1 row affected (0.01 sec)

After this deletion, let us check the data in both the Persons and Films_watched tables.

Querying Data from the Persons Table −

To see the remaining records in the Persons table, use the following SELECT query −

SELECT * FROM PERSONS;

We can see in the table below, the row with P_ID = 3 is deleted −

P_ID P_NAME P_AGE
1 Priya 29
2 Sarah 20
4 Dev 25
5 Ram 31
6 Aarohi 34

Querying Data from the Films_watched Table −

Lastly, you can check the data in the Films_watched table −

SELECT * FROM Films_watched;

Output

We can see in the output below that all related records with P_ID = 3 have been automatically deleted −

P_ID F_NO F_NAME
1 130 RRR
2 131 Bahubali
6 135 Karthikeya
Advertisements