schema: fix actor_profile FK by adding UNIQUE(actor_id), bump to v5

This commit is contained in:
otivm
2026-05-03 01:42:29 +00:00
parent 8e4e1df7f5
commit b1de03fe49
2 changed files with 100 additions and 28 deletions

View File

@@ -0,0 +1,61 @@
-- OTIVM player database FK repair script
-- File: data/repair_player_db_fk.sql
-- Applies to: player databases created under schema v3 or v4
-- Problem: actor_profile used composite PRIMARY KEY (actor_id, recorded_at)
-- without UNIQUE(actor_id), causing SQLite to reject FK references
-- from child tables (actor_parameters, events, etc.) to actor_id alone.
-- Fix: recreate actor_profile with UNIQUE(actor_id) added.
-- Uses the SQLite rename-recreate-copy-drop pattern.
-- Safe to run on any v3/v4 player database. Idempotent for data.
PRAGMA journal_mode = WAL;
PRAGMA foreign_keys = OFF;
BEGIN;
-- Clean up any partial previous repair attempt
DROP TABLE IF EXISTS actor_profile_old;
-- Step 1: Rename existing broken table
ALTER TABLE actor_profile RENAME TO actor_profile_old;
-- Step 2: Create corrected table with UNIQUE(actor_id)
CREATE TABLE actor_profile (
actor_id TEXT NOT NULL,
session_id TEXT NOT NULL,
background_id TEXT NOT NULL,
actor_name TEXT NOT NULL,
epoch TEXT NOT NULL DEFAULT 'roman_14bce',
schema_version INTEGER NOT NULL DEFAULT 5,
recorded_at TEXT NOT NULL,
session_anchor_at TEXT,
PRIMARY KEY (actor_id, recorded_at),
UNIQUE (actor_id)
);
-- Step 3: Copy all data from old table.
-- session_anchor_at is supplied as NULL for v3 databases that lack the column
-- (v3 predates session_anchor_at). For v4 databases that have the column,
-- the value would be NULL anyway (no player has dispatched on a broken save).
INSERT INTO actor_profile (
actor_id, session_id, background_id, actor_name,
epoch, schema_version, recorded_at, session_anchor_at
)
SELECT
actor_id, session_id, background_id, actor_name,
epoch, schema_version, recorded_at, NULL
FROM actor_profile_old;
-- Step 4: Drop the broken old table
DROP TABLE actor_profile_old;
-- Step 5: Record the repair in schema_changelog
INSERT OR IGNORE INTO schema_changelog VALUES
(5, 'OTIVM-V: Add UNIQUE(actor_id) to actor_profile to fix FK references', '2026-05-02T00:00:00Z');
-- Step 6: Bump schema version
PRAGMA user_version = 5;
COMMIT;
PRAGMA foreign_keys = ON;