-- +goose Up -- Apply legacy forces staging data into `forces_present`. -- Expected flow before this migration: -- 1) Run previous migration that creates `forces_old_import`. -- 2) Import old dump rows into `forces_old_import`. -- This migration maps old integer IDs into BINARY(16) UUID-style IDs, -- then upserts into `forces_present` with `is_active` forced to 1. START TRANSACTION; INSERT INTO forces_old_id_map (old_id, new_id) SELECT s.id AS old_id, UNHEX(REPLACE( LOWER(CONCAT( LPAD(HEX(FLOOR(CAST(UNIX_TIMESTAMP(UTC_TIMESTAMP(3)) * 1000 AS UNSIGNED) / 65536)), 8, '0'), '-', LPAD(HEX(MOD(CAST(UNIX_TIMESTAMP(UTC_TIMESTAMP(3)) * 1000 AS UNSIGNED), 65536)), 4, '0'), '-', '7', LPAD(HEX(FLOOR(RAND() * 4096)), 3, '0'), '-', LPAD(HEX(FLOOR(RAND() * 16384) + 32768), 4, '0'), '-', LPAD(HEX(FLOOR(RAND() * 281474976710656)), 12, '0') )), '-', '' )) AS new_id FROM forces_old_import s LEFT JOIN forces_old_id_map m ON m.old_id = s.id WHERE m.old_id IS NULL; INSERT INTO forces_present ( id, name, is_active, created_at, updated_at ) SELECT m.new_id, LEFT(COALESCE(NULLIF(TRIM(s.name), ''), CONCAT('Forces ', s.id)), 128) AS name, 1 AS is_active, UTC_TIMESTAMP() AS created_at, UTC_TIMESTAMP() AS updated_at FROM forces_old_import s JOIN forces_old_id_map m ON m.old_id = s.id ON DUPLICATE KEY UPDATE name = VALUES(name), is_active = 1, updated_at = UTC_TIMESTAMP(); COMMIT; -- +goose Down -- Data migration is intentionally non-reversible. -- Keep imported data and ID mapping as audit trail. SELECT 1;