diff --git a/db/migrations/20260213132541_fix_schema_inconsistencies.sql b/db/migrations/20260213132541_fix_schema_inconsistencies.sql index b33138db8..7302ac5bf 100644 --- a/db/migrations/20260213132541_fix_schema_inconsistencies.sql +++ b/db/migrations/20260213132541_fix_schema_inconsistencies.sql @@ -1,7 +1,20 @@ -- +goose Up -- +goose StatementBegin +-- NOTE: This migration recreates two tables to fix schema inconsistencies. +-- On large production databases, the data copy may take some time as tables are locked during the transaction. +-- This is necessary because SQLite does not support altering table constraints directly. +-- Consider applying this migration during a maintenance window if the tables are large. + +-- Performance optimization: Temporarily disable foreign key constraints during schema rebuild +-- They are re-enabled automatically at the end of the transaction +PRAGMA foreign_keys = OFF; + +-- Increase cache size temporarily for faster data operations +PRAGMA cache_size = 10000; + -- Fix library_artist table: Remove contradictory 'default null' from 'not null' column +-- This is a cosmetic fix (NOT NULL takes precedence), but improves schema consistency CREATE TABLE library_artist_new ( library_id integer NOT NULL DEFAULT 1 @@ -20,6 +33,8 @@ DROP TABLE library_artist; ALTER TABLE library_artist_new RENAME TO library_artist; -- Fix scrobble_buffer table: Remove duplicate user_id from unique constraint +-- Original constraint had: UNIQUE (user_id, service, media_file_id, play_time, user_id) +-- Fixed constraint is: UNIQUE (user_id, service, media_file_id, play_time) CREATE TABLE scrobble_buffer_new ( user_id varchar NOT NULL @@ -44,11 +59,18 @@ ALTER TABLE scrobble_buffer_new RENAME TO scrobble_buffer; CREATE UNIQUE INDEX scrobble_buffer_id_ix ON scrobble_buffer (id); +-- Re-enable foreign key constraints (automatic but explicit for clarity) +PRAGMA foreign_keys = ON; + -- +goose StatementEnd -- +goose Down -- +goose StatementBegin +-- Apply same performance optimizations for rollback +PRAGMA foreign_keys = OFF; +PRAGMA cache_size = 10000; + -- Restore library_artist table with original schema (including the contradictory default null) CREATE TABLE library_artist_new ( @@ -92,4 +114,6 @@ ALTER TABLE scrobble_buffer_new RENAME TO scrobble_buffer; CREATE UNIQUE INDEX scrobble_buffer_id_ix ON scrobble_buffer (id); +PRAGMA foreign_keys = ON; + -- +goose StatementEnd