Introduction

In modern applications, deleting data permanently from a database is often risky. Once data is deleted, it cannot be recovered easily, which can lead to serious problems like data loss, compliance issues, or accidental deletions.

This is where Soft Delete comes in. Soft delete allows you to mark data as deleted instead of actually removing it from the database. This approach is widely used in production systems because it ensures data safety, auditability, and easy recovery.

In this article, you will learn how to implement soft delete in SQL without losing data using simple language, real-world examples, and best practices.

What is Soft Delete?

Soft delete means marking a record as deleted instead of physically removing it from the database.

Instead of:

DELETE FROM users WHERE id = 1;

We use:

UPDATE users SET is_deleted = TRUE WHERE id = 1;

The record still exists in the database but is hidden from normal queries.

Why Use Soft Delete?

Basic Approach to Soft Delete

Add a column to your table:

ALTER TABLE users ADD COLUMN is_deleted BOOLEAN DEFAULT FALSE;

Now, instead of deleting records, update this flag.

Step 1: Modify Delete Operation

Replace DELETE queries with UPDATE:

UPDATE users SET is_deleted = TRUE WHERE id = 1;

Step 2: Update Select Queries

Always filter out deleted records:

SELECT * FROM users WHERE is_deleted = FALSE;

Step 3: Restore Deleted Data

Soft delete allows easy recovery:

UPDATE users SET is_deleted = FALSE WHERE id = 1;

Step 4: Use Deleted Timestamp (Recommended)

Instead of boolean, use timestamp for better tracking:

ALTER TABLE users ADD COLUMN deleted_at TIMESTAMP NULL;

Soft delete:

UPDATE users SET deleted_at = NOW() WHERE id = 1;

Fetch active records:

SELECT * FROM users WHERE deleted_at IS NULL;

Step 5: Use Index for Performance

To improve query performance:

CREATE INDEX idx_users_deleted_at ON users(deleted_at);

Step 6: Apply Soft Delete in Relationships

For related tables:

Example:

If user is deleted, mark related records instead of removing them.

Step 7: Use Views for Cleaner Queries

Create a view for active records:

CREATE VIEW active_users AS
SELECT * FROM users WHERE deleted_at IS NULL;

Now use:

SELECT * FROM active_users;

Step 8: Automate with ORM (Optional)

Many ORMs support soft delete:

Example (concept):

Real-World Example

Scenario: E-commerce website

This ensures:

Common Mistakes

Difference Between Hard Delete and Soft Delete

FeatureHard DeleteSoft Delete
Data RemovalPermanentTemporary
RecoveryNot possiblePossible
PerformanceFasterSlightly slower
SafetyLowHigh

Best Practices

Advanced Tip: Permanent Cleanup

You can still delete old data permanently:

DELETE FROM users WHERE deleted_at IS NOT NULL AND deleted_at < NOW() - INTERVAL '30 days';

This keeps database clean while maintaining safety.

Conclusion

Soft delete is a powerful and essential technique in modern database design. It helps prevent data loss, improves reliability, and allows easy recovery of deleted records.

By following this guide, you can implement soft delete in SQL effectively and safely. Whether you are building a small application or a large enterprise system, soft delete ensures your data remains secure and manageable.