IntermediateINSERT, UPDATE, DELETE

Soft delete: mark as deleted instead of removing

The query

SQL
-- Soft delete: add deleted_at timestamp
ALTER TABLE products ADD COLUMN deleted_at TIMESTAMP;

-- Soft delete a product
UPDATE products
SET deleted_at = NOW()
WHERE product_id = 42;

-- Active products query (excludes soft-deleted)
SELECT * FROM products WHERE deleted_at IS NULL;

-- Create a view for convenience
CREATE OR REPLACE VIEW active_products AS
SELECT * FROM products WHERE deleted_at IS NULL;

-- Hard delete old soft-deleted records (cleanup job)
DELETE FROM products
WHERE deleted_at < NOW() - INTERVAL '90 days';
Tested against PostgreSQL 16

Note

Soft delete pattern preserves data integrity. Use IS NULL check in all queries. Views simplify this.

Tables referenced