databaseChangeLog: - changeSet: id: 0008-update-cart-status-constraint author: jjo changes: # 1) Eliminar el índice único antiguo (user_id, status) - sql: sql: | ALTER TABLE carts DROP INDEX uq_carts_user_active; # 2) Añadir columna generada 'active_flag' # Será 1 si status = 'ACTIVE', y NULL en cualquier otro caso - sql: sql: | ALTER TABLE carts ADD COLUMN active_flag TINYINT(1) GENERATED ALWAYS AS ( CASE WHEN status = 'ACTIVE' THEN 1 ELSE NULL END ); # 3) Crear el nuevo índice único: # solo limita (user_id, active_flag=1), # se permiten muchos registros con active_flag NULL (LOCKED, COMPLETED, etc.) - sql: sql: | CREATE UNIQUE INDEX uq_carts_user_active ON carts (user_id, active_flag); rollback: # 🔙 1) Eliminar el índice nuevo basado en active_flag - sql: sql: | ALTER TABLE carts DROP INDEX uq_carts_user_active; # 🔙 2) Eliminar la columna generada active_flag - sql: sql: | ALTER TABLE carts DROP COLUMN active_flag; # 🔙 3) Restaurar el índice único original (user_id, status) - sql: sql: | CREATE UNIQUE INDEX uq_carts_user_active ON carts (user_id, status);