Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

579
Visualizações
¿Cómo activa el valor de actualización en el bucle for, Postgresql?

Tengo una tabla que contiene tareas. Cada tarea tiene una prioridad. Cuando inserto una nueva tarea, si la nueva tarea tiene la misma prioridad que las antiguas, las antiguas que tienen las prioridades más bajas deben ser degradadas.

Por ejemplo, tenemos 3 tareas con prioridades: 1, 2, 3. Si inserto una nueva tarea con prioridad 1, todas las tareas antiguas deben cambiar la prioridad a 2, 3, 4 antes de que se inserte la nueva tarea.

Para hacer eso, uso trigger:

 CREATE SEQUENCE task_id_seq; CREATE TABLE task ( task_id INTEGER NOT NULL DEFAULT nextval('task_id_seq'), name VARCHAR(255) NOT NULL, description TEXT, created_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP, deadline TIMESTAMP WITH TIME ZONE, priority INT2 NOT NULL, PRIMARY KEY (task_id), CONSTRAINT task__check_task_name CHECK(CHAR_LENGTH(name) >= 4), CONSTRAINT task__check_unique_task_name UNIQUE(name), CONSTRAINT task__check_unique_task_priority UNIQUE(priority) ); CREATE INDEX priority_index ON task(priority); CREATE OR REPLACE FUNCTION degrade_task_priorities() RETURNS trigger AS $degrade_priority_task_trigger$ DECLARE r task%rowtype; BEGIN FOR r in SELECT * FROM task WHERE task.priority >= NEW.priority LOOP --r.priority := r.priority + 1; UPDATE task SET priority = priority + 1; --WHERE task.priority In ( -- SELECT priority FROM task WHERE task.priority >= NEW.priority ORDER BY task.priority); --RETURN NEXT r; END LOOP; RETURN NEW; END $degrade_priority_task_trigger$ LANGUAGE plpgsql; CREATE TRIGGER insert_new_task_trigger BEFORE INSERT ON task FOR EACH ROW EXECUTE PROCEDURE degrade_task_priorities();

El problema es cuando trato de insertar 4 tareas nuevas con la misma prioridad 1, el resultado final son 4 registros con prioridad como estos: 1, 4, 6, 7. Debería haber sido 1,2,3,4.

Dudo que no entienda la forma en que el bucle y el disparador funcionan juntos. ¿Dónde lo hice mal?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Creo que no necesitas un bucle aquí:

 CREATE OR REPLACE FUNCTION degrade_task_priorities() RETURNS trigger AS $degrade_priority_task_trigger$ DECLARE r task%rowtype; BEGIN UPDATE task SET priority = priority + 1 WHERE task.priority >= NEW.PRIORITY; RETURN NEW; END $degrade_priority_task_trigger$ LANGUAGE plpgsql;
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda