-- 将 tb_iot_card.virtual_no 恢复为可选字段（可为空）
-- 背景：业务确认单卡导入时虚拟号非必填，不能强制要求
-- 步骤：1. 删除无条件唯一索引，2. 移除 NOT NULL 约束，3. 重建条件唯一索引（允许多条空值共存）

-- 删除当前无条件唯一索引
DROP INDEX IF EXISTS idx_iot_card_virtual_no;

-- 将 virtual_no 列改回允许 NULL
ALTER TABLE tb_iot_card ALTER COLUMN virtual_no DROP NOT NULL;

-- 重建条件唯一索引（仅对非空、非空字符串的值保证唯一；允许多条空值/NULL 共存）
CREATE UNIQUE INDEX idx_iot_card_virtual_no ON tb_iot_card(virtual_no)
    WHERE deleted_at IS NULL AND virtual_no IS NOT NULL AND virtual_no <> '';
