-- Conserva cada puntuación y su fecha. El like es independiente y empieza desmarcado. CREATE TEMP TABLE valoraciones_antes_de_likes ON COMMIT DROP AS SELECT usuario_id, cancion_id, puntuacion, creada_en, actualizada_en FROM valoracion; --> statement-breakpoint ALTER TABLE "valoracion" ADD COLUMN "like" boolean DEFAULT false NOT NULL; --> statement-breakpoint ALTER TABLE "valoracion" ALTER COLUMN "puntuacion" DROP NOT NULL; --> statement-breakpoint ALTER TABLE "valoracion" RENAME COLUMN "puntuacion" TO "value"; --> statement-breakpoint ALTER TABLE "valoracion" RENAME COLUMN "creada_en" TO "date"; --> statement-breakpoint -- Recoge cualquier like recibido durante la transición sin sobrescribir valoraciones. INSERT INTO "valoracion" ("usuario_id", "cancion_id", "date", "like", "value") SELECT "usuario_id", "cancion_id", "creado_en", true, NULL FROM "me_gusta" ON CONFLICT ("usuario_id", "cancion_id") DO UPDATE SET "like" = true; --> statement-breakpoint -- Verifica la copia antes de retirar la tabla provisional. Toda la migración es transaccional. DO $$ BEGIN IF EXISTS ( SELECT usuario_id, cancion_id, puntuacion, creada_en, actualizada_en FROM valoraciones_antes_de_likes EXCEPT SELECT usuario_id, cancion_id, "value", "date", actualizada_en FROM valoracion ) THEN RAISE EXCEPTION 'Las valoraciones históricas deben permanecer intactas'; END IF; IF EXISTS ( SELECT 1 FROM "me_gusta" m LEFT JOIN "valoracion" v ON v.usuario_id = m.usuario_id AND v.cancion_id = m.cancion_id WHERE v."like" IS DISTINCT FROM true ) THEN RAISE EXCEPTION 'Faltan likes por trasladar'; END IF; END $$; --> statement-breakpoint DROP TABLE "me_gusta";