You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/drizzle/0013_integridad_concurrente...

48 lines
1.6 KiB

-- Un usuario solo puede tener un carrito. Antes había únicamente un índice no
-- único y dos primeras peticiones simultáneas podían crear dos carritos.
--
-- La migración conserva el carrito más antiguo de cada usuario, copia en él
-- los elementos de los demás y elimina los duplicados antes de crear la guarda.
WITH canonicos AS (
SELECT usuario_id, min(creado_en) AS primera_fecha
FROM carrito
WHERE usuario_id IS NOT NULL
GROUP BY usuario_id
), elegidos AS (
SELECT c.usuario_id, min(c.id) AS carrito_id
FROM carrito c
INNER JOIN canonicos x
ON x.usuario_id = c.usuario_id AND x.primera_fecha = c.creado_en
GROUP BY c.usuario_id
)
INSERT INTO carrito_item (carrito_id, cancion_id, anadido_en)
SELECT e.carrito_id, ci.cancion_id, min(ci.anadido_en)
FROM carrito c
INNER JOIN elegidos e ON e.usuario_id = c.usuario_id
INNER JOIN carrito_item ci ON ci.carrito_id = c.id
WHERE c.id <> e.carrito_id
GROUP BY e.carrito_id, ci.cancion_id
ON CONFLICT (carrito_id, cancion_id) DO NOTHING;--> statement-breakpoint
WITH canonicos AS (
SELECT usuario_id, min(creado_en) AS primera_fecha
FROM carrito
WHERE usuario_id IS NOT NULL
GROUP BY usuario_id
), elegidos AS (
SELECT c.usuario_id, min(c.id) AS carrito_id
FROM carrito c
INNER JOIN canonicos x
ON x.usuario_id = c.usuario_id AND x.primera_fecha = c.creado_en
GROUP BY c.usuario_id
)
DELETE FROM carrito c
USING elegidos e
WHERE c.usuario_id = e.usuario_id AND c.id <> e.carrito_id;--> statement-breakpoint
DROP INDEX IF EXISTS "carrito_usuario";--> statement-breakpoint
CREATE UNIQUE INDEX "carrito_usuario_unico"
ON "carrito" ("usuario_id")
WHERE "usuario_id" IS NOT NULL;

Powered by TurnKey Linux.