📖 Scenario: You are managing a small library database. It has two tables: Authors and Books. Each book is linked to an author. When an author is deleted, all their books should also be deleted automatically.
🎯 Goal: Create the tables with a foreign key that uses ON DELETE CASCADE. Then delete an author and see that their books are also removed.
📋 What You'll Learn
Create a table called Authors with columns AuthorID (primary key) and Name (text).
Create a table called Books with columns BookID (primary key), Title (text), and AuthorID (foreign key referencing Authors.AuthorID with ON DELETE CASCADE).
Insert exactly two authors with AuthorID 1 and 2, and their names 'Alice' and 'Bob'.
Insert exactly three books: two books by author 1 and one book by author 2.
Delete the author with AuthorID 1 and observe that their books are also deleted.
💡 Why This Matters
🌍 Real World
Many applications use foreign keys with cascading deletes to keep related data consistent automatically, such as deleting a customer and all their orders.
💼 Career
Understanding cascading deletes is important for database design and maintenance roles, ensuring data integrity and simplifying cleanup tasks.
Progress0 / 4 steps
1
Create the Authors and Books tables
Write SQL statements to create a table called Authors with columns AuthorID as an integer primary key and Name as text. Also create a table called Books with columns BookID as an integer primary key, Title as text, and AuthorID as an integer foreign key referencing Authors.AuthorID with ON DELETE CASCADE.
SQL
Hint
Use CREATE TABLE statements. For the foreign key in Books, add ON DELETE CASCADE to automatically delete books when their author is deleted.
2
Insert authors into Authors table
Write SQL INSERT statements to add two authors into the Authors table: one with AuthorID 1 and Name 'Alice', and another with AuthorID 2 and Name 'Bob'.
SQL
Hint
Use two INSERT INTO Authors statements with the exact AuthorID and Name values.
3
Insert books into Books table
Write SQL INSERT statements to add three books into the Books table: two books with BookID 1 and 2, titles 'Book A' and 'Book B' by author 1, and one book with BookID 3, title 'Book C' by author 2.
SQL
Hint
Use three INSERT INTO Books statements with the exact BookID, Title, and AuthorID values.
4
Delete an author and observe cascade delete
Write an SQL DELETE statement to remove the author with AuthorID 1 from the Authors table. This should automatically delete all books by that author because of the ON DELETE CASCADE foreign key.
SQL
Hint
Use a DELETE FROM Authors WHERE AuthorID = 1 statement to remove the author with ID 1.
Practice
(1/5)
1. What does CASCADE DELETE do in a database?
easy
A. Creates a backup of rows before deletion
B. Prevents deletion of parent rows if child rows exist
C. Deletes only the parent row without affecting child rows
D. Automatically deletes related child rows when a parent row is deleted
Solution
Step 1: Understand CASCADE DELETE behavior
CASCADE DELETE means when you delete a parent row, all related child rows linked by foreign keys are also deleted automatically.
Step 2: Compare options with this behavior
Automatically deletes related child rows when a parent row is deleted matches this behavior exactly. Options A, B, and D describe different or incorrect behaviors.
Final Answer:
Automatically deletes related child rows when a parent row is deleted -> Option D
Quick Check:
CASCADE DELETE = auto-remove child rows [OK]
Hint: CASCADE means child rows go away with parent [OK]
Common Mistakes:
Thinking CASCADE prevents deletion
Confusing CASCADE with backup
Assuming child rows stay after parent deletion
2. Which SQL syntax correctly previews rows that will be deleted by CASCADE when deleting from orders table with customer_id = 5?
easy
A. SELECT * FROM customers WHERE id = 5;
B. DELETE FROM order_items WHERE customer_id = 5;
C. SELECT * FROM order_items WHERE order_id IN (SELECT id FROM orders WHERE customer_id = 5);
D. SELECT * FROM orders WHERE customer_id = 5;
Solution
Step 1: Identify child rows linked to parent rows
To preview cascade deletes, select child rows where foreign key matches parent rows to be deleted. Here, order_items link to orders by order_id.
Step 2: Use subquery to find parent rows with customer_id = 5
The subquery selects orders with customer_id = 5. The outer query selects order_items with those order_ids.
Final Answer:
SELECT * FROM order_items WHERE order_id IN (SELECT id FROM orders WHERE customer_id = 5); -> Option C
Quick Check:
Preview child rows with IN + subquery [OK]
Hint: Use IN with subquery to find child rows [OK]
Common Mistakes:
Trying to delete instead of preview
Selecting wrong table without join
Using wrong column in WHERE clause
3. Given tables departments and employees with employees.department_id referencing departments.id with CASCADE DELETE, what rows will this query return?
SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments WHERE name = 'Sales');
medium
A. All employees who work in the Sales department
B. All departments named Sales
C. All employees regardless of department
D. No rows, syntax error
Solution
Step 1: Understand the subquery
The subquery selects department ids where the name is 'Sales'.
Step 2: Outer query filters employees by those department ids
Employees with department_id matching those ids are returned.
Final Answer:
All employees who work in the Sales department -> Option A
Quick Check:
IN subquery filters child rows correctly [OK]
Hint: IN with subquery filters child rows by parent condition [OK]
Common Mistakes:
Confusing employees with departments
Assuming syntax error
Ignoring the subquery effect
4. You wrote this query to preview cascade deletes:
SELECT * FROM order_items WHERE order_id = (SELECT id FROM orders WHERE customer_id = 10);
Why might this query cause an error?
medium
A. Subquery returns multiple rows but '=' expects one value
B. Table order_items does not exist
C. Missing WHERE clause in subquery
D. Incorrect column name order_id
Solution
Step 1: Analyze subquery result
The subquery selects all order ids for customer_id 10, which can be multiple rows.
Step 2: Check operator usage
The outer query uses '=' which expects a single value, causing an error if multiple rows returned.
Final Answer:
Subquery returns multiple rows but '=' expects one value -> Option A
Quick Check:
Use IN for multiple subquery results [OK]
Hint: Use IN, not =, when subquery returns many rows [OK]
Common Mistakes:
Using '=' with multi-row subquery
Assuming table or column names are wrong
Ignoring subquery result count
5. You want to preview all child rows that will be deleted when deleting customers with country = 'USA'. The schema has customers and orders (orders.customer_id references customers.id with CASCADE). Which query correctly previews all orders to be deleted?
hard
A. SELECT * FROM customers WHERE country = 'USA';
B. SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE country = 'USA');
C. DELETE FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE country = 'USA');
D. SELECT * FROM orders WHERE country = 'USA';
Solution
Step 1: Identify parent rows to delete
Customers with country = 'USA' are the parent rows to be deleted.
Step 2: Find child rows linked to those parents
Orders with customer_id matching those customers will be deleted by CASCADE.
Step 3: Write query to preview child rows
Use IN with subquery selecting customer ids from customers where country = 'USA'.
Final Answer:
SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE country = 'USA'); -> Option B
Quick Check:
Preview child rows with IN + subquery [OK]
Hint: Preview child rows with IN and parent filter subquery [OK]
Common Mistakes:
Selecting from wrong table
Using DELETE instead of SELECT
Filtering child table by parent's column directly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.