tutorial - Postgresql, actualizar si existe una fila con algún valor único, de lo contrario inserte
update postgresql 9 (3)
Tengo una tabla de URLs. Contienen
(Id int clave primaria, carácter url variable única, contenido variado contenido, última fecha analizada).
Quiero crear un activador o algo (la regla puede ser), por lo que cada vez que hago una inserción desde mi programa Java, se actualiza una fila individual si existe una fila con dicha URL. De lo contrario, debe realizar una inserción.
Por favor, puede proporcionar un código completo en Postgresql. Gracias.
Encontré esta publicación más relevante en este escenario:
WITH upsert AS (
UPDATE spider_count SET tally=tally+1
WHERE date=''today'' AND spider=''Googlebot''
RETURNING *
)
INSERT INTO spider_count (spider, tally)
SELECT ''Googlebot'', 1
WHERE NOT EXISTS (SELECT * FROM upsert)
Esto se ha pedido muchas veces. Una posible solución se puede encontrar aquí: https://.com/a/6527838/552671
Esta solución requiere tanto una UPDATE
como INSERT
.
UPDATE table SET field=''C'', field2=''Z'' WHERE id=3;
INSERT INTO table (id, field, field2)
SELECT 3, ''C'', ''Z''
WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3);
Con Postgres 9.1 es posible hacerlo con una consulta: https://.com/a/8702291/552671
Si los INSERTS
son raros, evitaría hacer un NOT EXISTS (...)
ya que emite un SELECT
en todas las actualizaciones. En cambio, eche un vistazo a la respuesta de wildpeaks: https://dba.stackexchange.com/questions/5815/how-can-i-insert-if-key-not-exist-with-postgresql
CREATE OR REPLACE FUNCTION upsert_tableName(arg1 type, arg2 type) RETURNS VOID AS $$
DECLARE
BEGIN
UPDATE tableName SET col1 = value WHERE colX = arg1 and colY = arg2;
IF NOT FOUND THEN
INSERT INTO tableName values (value, arg1, arg2);
END IF;
END;
$$ LANGUAGE ''plpgsql'';
De esta manera, Postgres inicialmente intentará hacer una UPDATE
. Si no se afectó ninguna fila, volverá a emitir un INSERT
.