Files
BMS/bms-back/sql/price/price_set_detail_unique_alter.sql
T
2026-09-16 17:14:19 +08:00

23 lines
939 B
SQL

-- 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;