yumi-golang/migrations/065_yumi_game_king_direct_rewards.sql

62 lines
2.5 KiB
SQL

-- Yumi Game King: direct multi-resource rewards and stop/resume settlement safety.
--
-- Performance review:
-- 1. Both ALTERs target bounded configuration/delivery tables; no game-event ledger,
-- wallet ledger or ranking aggregate is scanned.
-- 2. reward_items_json is nullable during the online DDL. The two bounded UPDATE JOINs use
-- owner_type/owner_id and prize/rank primary keys to freeze existing pending orders
-- before operators can change their activity configuration.
-- 3. ever_enabled is backfilled from the indexed enabled flag plus three activity-scoped
-- existence probes. Each probe uses an activity_id primary/index prefix and stops at
-- the first row, avoiding full scans of event or draw history.
-- 4. Run during low traffic with adequate temporary disk. LOCK=NONE keeps ordinary reads
-- and writes available, but MySQL metadata locks can still wait behind long transactions.
ALTER TABLE `yumi_game_king_activity`
ADD COLUMN `ever_enabled` TINYINT(1) NOT NULL DEFAULT 0 AFTER `enabled`,
ALGORITHM=INPLACE, LOCK=NONE;
UPDATE `yumi_game_king_activity` AS activity
SET activity.`ever_enabled` = 1
WHERE activity.`enabled` = 1
OR EXISTS (
SELECT 1
FROM `yumi_game_king_user` AS aggregate
WHERE aggregate.`activity_id` = activity.`id`
LIMIT 1
)
OR EXISTS (
SELECT 1
FROM `yumi_game_king_draw_record` AS draw_record
WHERE draw_record.`activity_id` = activity.`id`
LIMIT 1
)
OR EXISTS (
SELECT 1
FROM `yumi_game_king_period_settlement` AS period_gate
WHERE period_gate.`activity_id` = activity.`id`
LIMIT 1
);
ALTER TABLE `yumi_game_king_delivery_item`
ADD COLUMN `reward_items_json` TEXT NULL AFTER `resource_group_id`,
ALGORITHM=INPLACE, LOCK=NONE;
UPDATE `yumi_game_king_delivery_item` AS delivery
JOIN `yumi_game_king_draw_record` AS draw_record
ON delivery.`owner_type` = 'DRAW'
AND delivery.`owner_id` = draw_record.`id`
JOIN `yumi_game_king_prize` AS prize
ON prize.`id` = draw_record.`prize_id`
SET delivery.`reward_items_json` = prize.`reward_items_json`
WHERE delivery.`reward_items_json` IS NULL;
UPDATE `yumi_game_king_delivery_item` AS delivery
JOIN `yumi_game_king_settlement_record` AS settlement
ON delivery.`owner_type` = 'SETTLEMENT'
AND delivery.`owner_id` = settlement.`id`
JOIN `yumi_game_king_rank_reward` AS rank_reward
ON rank_reward.`id` = settlement.`rank_reward_id`
SET delivery.`reward_items_json` = rank_reward.`reward_items_json`
WHERE delivery.`reward_items_json` IS NULL;