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