-- Prevent duplicate FIXED details within one version (same product_country snapshot row) -- MySQL allows multiple NULLs in UNIQUE, so DISCOUNT rows (product_country_id null) are OK. SET NAMES utf8mb4; SET @db := DATABASE(); -- Clean exact duplicates before adding unique key (keep min psd_id) DELETE d1 FROM prc_price_set_detail d1 INNER JOIN prc_price_set_detail d2 ON d1.psv_id = d2.psv_id AND d1.product_country_id = d2.product_country_id AND d1.psd_id > d2.psd_id WHERE d1.psv_id IS NOT NULL AND d1.product_country_id IS NOT NULL; SET @has := ( SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'prc_price_set_detail' AND INDEX_NAME = 'uk_psd_psv_product_country' ); SET @sql := IF(@has = 0, 'ALTER TABLE prc_price_set_detail ADD UNIQUE KEY uk_psd_psv_product_country (psv_id, product_country_id)', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;