Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

412
Vistas
PostgreSQL: actualización masiva con índice único

Tengo una tabla con un índice único en dos campos, lane_id y position.

Ahora, quiero actualizar la fila usando esta consulta:

 UPDATE "teams_ticket" SET "position" = ("teams_ticket"."position" + 1) WHERE ("teams_ticket"."lane_id" = 1 AND "teams_ticket"."position" >= 0)

Que termina con:

 duplicate key value violates unique constraint "teams_ticket_position_bfcce9fa_uniq"

Si tengo más de un billete.

¿Cómo puedo solucionar este problema?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Necesita restricciones deferrable (y en realidad diferirlas, temporalmente). Aplazable significa que las restricciones no se comprueban inmediatamente (por ejemplo, cuando se reescribe la tupla índice), sino al final de la transacción (o declaración), cuando se han actualizado todas las filas:

-- \i tmp.sql

 CREATE TABLE positions ( seq SERIAL PRIMARY KEY , position INTEGER NOT NULL UNIQUE DEFERRABLE ); INSERT INTO positions(position) SELECT generate_series(1,10) gs; BEGIN; SET CONSTRAINTS ALL DEFERRED; update positions SET position= position +1 WHERE seq <= 6 ; SELECT * FROM positions ; UPDATE positions SET position= position +1 WHERE seq > 6 ; SELECT * FROM positions ; UPDATE positions SET position= position +1 ; SELECT * FROM positions ; COMMIT;
over 4 years ago · Santiago Trujillo Denunciar

0

Puede usar el cursor para actualizarlos uno por uno.

 DO $$ DECLARE r record; BEGIN FOR r IN SELECT lane_id, position FROM teams_ticket WHERE lane_id=1 AND position >= 0 ORDER BY position DESC LOOP UPDATE teams_ticket SET position=position+1 WHERE position=r.position AND lane_id=r.lane_id; END LOOP; END$$;
over 4 years ago · Santiago Trujillo Denunciar

0

Puedes probar

 UPDATE teams_ticket t SET position = q.position + 1 FROM ( SELECT lane_id, position FROM teams_ticket WHERE lane_id = 1 AND position >= 0 ORDER BY lane_id, position DESC ) q WHERE t.lane_id = q.lane_id AND t.position = q.position
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda