Estoy usando PostgreSQL para mi Codeigniter sitio web. Estoy usando grocery crud para agregar, editar y eliminar las operaciones. Durante la realización de un editar o agregar, quiero cambiar el nombre de un archivo cargado dinámicamente basándose en la identificación de los contenidos. Yo soy capaz de hacer esto usando grocery crud del callback_after_upload función.

Quiero un lado el número de id de contenido, mientras que la adición de un nuevo contenido. Traté de usar nextval() función, pero la secuencia se incrementa con ella. ¿Cómo se puede obtener el último valor de la secuencia, sin el uso de nextval() función?

O hay una manera sencilla de que puedo hacer esto?

  • En realidad, esta es obsoleta e innecesariamente ineficiente, demasiado. Usted puede hacer esto con viaje de ida y vuelta al servidor. He añadido una respuesta.
  • Es todavía vale la pena mencionar que, y mu de demostración de una nextval llamada que se utiliza en una instrucción insert, porque a diferencia de INSERT ... RETURNING ambos trabajarán a través de la generación de consultas a motores y otras cosas dolorosas que no pueden entender la RETURNING extensión :S
  • Gracias por la info.
  • Si su consulta generador no entiende el RETURNING cláusula (que ha estado alrededor por años!), puede ser obsoleto como bien o muy pobres muleta que está buscando reemplazo. Aún así, es bueno tener a la solución de reserva a_horse siempre. Nada que discutir.
InformationsquelleAutor i_nomad | 2012-11-15

6 Comentarios

  1. 34

    RETURNING

    Hoy en día en PostgreSQL (8.2 o posterior) puede hacer esto con un solo viaje de ida y a la base de datos:

    INSERT INTO tbl(filename)
    VALUES ('my_filename')
    RETURNING tbl_id;

    tbl_id ser un serial columna. Más información en el manual de.

    Explícitamente el valor de fetch

    Si filename debe incluir tbl_id (redundante), usted puede todavía utilizar una sola consulta.

    Uso lastval() o el más específico currval():

    INSERT INTO tbl (filename)
    VALUES ('my_filename' || lastval())  -- or currval('tbl_tbl_id_seq')
    RETURNING tbl_id;

    El manual sobre el lastval():

    Esta función es idéntica a currval, excepto que en lugar de tomar
    el nombre de la secuencia como un argumento obtiene el valor de la última
    secuencia utilizada por nextval en el actual período de sesiones.

    Si usted tiene (o puede tener) múltiples secuencias vinculadas a la tabla (incluso por la vía de los factores desencadenantes o de otros efectos secundarios) el seguro forma es utilizar currval('tbl_tbl_id_seq').

    Nombre de la secuencia

    La literal de cadena 'tbl_tbl_id_seq' en mi ejemplo se supone que el real nombre de la secuencia y se echa a regclass, que levanta una excepción si no de la secuencia de ese nombre se puede encontrar en la actual search_path.

    tbl_tbl_id_seq es el generado automáticamente el valor predeterminado para una tabla tbl con una serie de columnas tbl_id. Pero no hay garantías. Una columna predeterminado, se puede obtener valores de cualquier secuencia, si así se define. Y si el nombre predeterminado es tomado a la hora de crear la tabla, Postgres toma la siguiente gratuita nombre de acuerdo a una rígida algoritmo.

    Si no saber el nombre de la secuencia para una serial columna, la busque con la función dedicada pg_get_serial_sequence(). Incluso se pueden hacer sobre la marcha:

    INSERT INTO tbl (filename)
    VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
    RETURNING tbl_id;

    SQL Violín.

    • votar por enseñarme algo!
    • Pero no ayuda si el valor generado debe ser incorporada en los valores que se insertan. Mi comprensión de «para que yo pueda dinámicamente el nombre de un archivo cargado» es que i_nomad quiere poner el ID generado en uno de los valores de (nombre de archivo) que se inserta en la tabla. Pero la pregunta es tan terriblemente claro que es difícil decir.
    • está representado en la serie de la columna de todos modos. Pero si usted quiere incluir en la filename, usted puede hacer eso también. Añadido un poco mi respuesta.
  2. 17

    El obtenido previamente el valor de una secuencia se accede con el currval() función.

    Pero que sólo va a devolver un valor si nextval() ha sido llamado antes de que.

    No hay absolutamente ninguna manera de «mirar» en el siguiente valor de una secuencia sin la obtención de la misma.

    Pero tu pregunta no es clara. Si usted llama nextval() antes de realizar la inserción, puede utilizar ese valor en la inserción. O mejor aún, utilizar currval() en su instrucción insert:

    select nextval('my_sequence') ...
    
    ... do some stuff with the obtained value
    
    insert into my_table(id, filename)
    values (currval('my_sequence'), 'some_valid_filename');
    • Estoy usando grocery crud para insertar eliminar las operaciones de edición. Estoy usando ‘callback_after_upload’ función para cambiar el nombre de un archivo. No estoy pasando id para insertar.
    • ¿De dónde surgió esta comestibles cosa que venga de repente? Se le preguntó sobre el uso de secuencias en PostgreSQL.
    • Sí, es sobre el uso de secuencias en PostgreSQL y yo estaba explicando lo que estoy tratando de hacer con el ‘nextval’ de la secuencia.
  3. 0

    Para responder a su pregunta, literalmente, aquí es cómo conseguir que el siguiente valor de una secuencia sin incrementos:

    SELECT
     CASE WHEN is_called THEN
       last_value + 1
     ELSE
       last_value
     END
    FROM sequence_name

    Obviamente, no es una buena idea utilizar este código en la práctica. No hay ninguna garantía de que la siguiente fila tendrán realmente este ID. Sin embargo, para propósitos de depuración que puede ser interesante para saber el valor de una secuencia, sin que el incremento de ello, y esto es cómo usted puede hacerlo.

  4. 0

    Lo probé y funciona perfectamente

    @Entity
    public class Shipwreck {
      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
      @Basic(optional = false)
      @SequenceGenerator(name = "seq", sequenceName = "shipwreck_seq", allocationSize = 1)
      Long id;

    ….

    CREATE SEQUENCE public.shipwreck_seq
        INCREMENT 1
        START 110
        MINVALUE 1
        MAXVALUE 9223372036854775807
        CACHE 1;

Dejar respuesta

Please enter your comment!
Please enter your name here