es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Introduce una secuencia en orden descendente.

Creé una secuencia que debería introducirse en una tabla ordenada por otra columna en orden descendente.

La secuencia la creé de la siguiente manera:

CREAR SECUENCIA seq_athlete_id
INCREMENTO DE 1
COMENZAR CON 1001
NO CICLO
PROPIEDAD DE tb_athlete.id;

Asigné esto a la tabla:

CREAR TABLA olympic.tb_athlete (
  id CARÁCTER ENTERO NO NULO,
  athlete_id CARÁCTER(7) NO NULO,
  nombre CARÁCTER VARIANDO(50) NO NULO,
  país CARÁCTER VARIANDO(3) NO NULO,
  substitute_id CARÁCTER(7) VALOR POR DEFECTO NULO,
  RESTRICCIÓN pk_athlete CLAVE PRIMARIA (athlete_id),
  RESTRICCIÓN fk_athlete_substitute CLAVE EXTRANJERA (substitute_id) REFERENCIAS olympic.tb_athlete (athlete_id)
);

Y después intenté introducirlo con este código:

SELECCIONAR setval(‘seq_athlete_id’::text,
(SELECCIONAR athlete_id
DE tb_athlete
ORDENAR POR athlete_id DESC)::bigint);

Pero devuelve un error “se devolvió más de una fila mediante una subconsulta utilizada como expresión”.

Porque necesito introducir el id en orden opuesto a athlete_id, es decir, athlete_id debería ir de máximo a mínimo e id de mínimo a máximo.

¿Cómo puedo introducir un orden para aplicar esta secuencia?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para introducir la secuencia en el orden de la tabla ordenada por otra columna en orden descendente, debes modificar la definición de la secuencia y ajustar la forma en que estableces el valor para la secuencia.

    Primero, recrea la secuencia de la siguiente manera:

    CREATE SEQUENCE seq_athlete_id
      INCREMENT BY 1
      START WITH 1001
      NO CYCLE
      OWNED BY tb_athlete.id DESC;
    

    Ten en cuenta que agregamos DESC al final de la cláusula OWNED BY, lo que significa que la secuencia es propiedad de la columna tb_athlete.id en orden descendente.

    A continuación, modifica la declaración SELECT que establece el valor para la secuencia:

    SELECT setval('seq_athlete_id',
                  (SELECT min(id)
                   FROM tb_athlete) - 1,
                  false);
    

    Esta declaración establece el valor de la secuencia como el valor mínimo de la columna id menos uno. El parámetro false al final indica que la secuencia no debe incrementarse en uno después de establecer su valor.

    Por defecto, las secuencias en Postgres están ordenadas en orden ascendente, pero puedes cambiar esto especificando la opción DESC al definir la secuencia o modificando su definición utilizando la instrucción ALTER SEQUENCE. Para establecer el valor de la secuencia basado en el orden de otra columna en la tabla, puedes utilizar una subconsulta para obtener el valor mínimo o máximo de esa columna, dependiendo de si deseas que la secuencia comience desde el valor más alto o más bajo.

Comments are closed.