una ultimo ultima traer tabla seleccionar registro obtener insertado fila postgresql

postgresql - ultimo - seleccionar la ultima fila de una tabla sql



SELECCIONE o INSERTE una fila en un comando (3)

Estoy usando PostgreSQL 9.0 y tengo una tabla con solo una clave artificial (secuencia de auto-incremento) y otra clave única. (Sí, hay una razón para esta tabla. :)) Quiero buscar una ID con la otra clave o, si no existe, insértela:

SELECT id FROM mytable WHERE other_key = ''SOMETHING''

Entonces, si no hay partido:

INSERT INTO mytable (other_key) VALUES (''SOMETHING'') RETURNING id

La pregunta: ¿es posible guardar un viaje de ida y vuelta al DB haciendo ambas cosas en una sola declaración? Puedo insertar la fila si no existe así:

INSERT INTO mytable (other_key) SELECT ''SOMETHING'' WHERE NOT EXISTS (SELECT * FROM mytable WHERE other_key = ''SOMETHING'') RETURNING id

... pero eso no da el ID de una fila existente. ¿Algunas ideas? Hay una restricción única en other_key, si eso ayuda.


¿Has tratado de unirlo?

Editar - esto requiere Postgres 9.1:

create table mytable (id serial primary key, other_key varchar not null unique); WITH new_row AS ( INSERT INTO mytable (other_key) SELECT ''SOMETHING'' WHERE NOT EXISTS (SELECT * FROM mytable WHERE other_key = ''SOMETHING'') RETURNING * ) SELECT * FROM new_row UNION SELECT * FROM mytable WHERE other_key = ''SOMETHING'';

resultados en:

id | other_key ----+----------- 1 | SOMETHING (1 row)


No, no hay una sintaxis SQL especial que le permita seleccionar o insertar. Puede hacer lo que menciona Ilia y crear un sproc, lo que significa que no hará un viaje de ida y vuelta del cliente al servidor, pero aún resultará en dos consultas (tres en realidad, si cuenta el sproc en sí).


puedes usar un procedimiento almacenado

IF (SELECT id FROM mytable WHERE other_key = ''SOMETHING'' LIMIT 1) < 0 THEN INSERT INTO mytable (other_key) VALUES (''SOMETHING'') END IF