Replace w Postgresql

0

Cześć,
Do aplikacji nad którą pracuje używam bazy Sqlite, chciałem jednak przenieść się na coś mocniejszego i wybór padł na postgresql.
Mam tylko problem z jednym zapytaniem.
Załóżmy, że mam taką tabelę:
create table test
(
id integer NOT NULL PRIMARY KEY,
daty varchar(30),
opis1 varchar(250),
opis2 varchar(250),
UNIQUE (daty)
);
INSERT INTO test(id,daty,opis1,opis2) VALUES(0,'2015-11-01','1111','11');
INSERT INTO test(id,daty,opis1,opis2) VALUES(1,'2015-11-02','2222','22');
INSERT INTO test(id,daty,opis1,opis2) VALUES(2,'2015-11-03','3333','33');
INSERT INTO test(id,daty,opis1,opis2) VALUES(3,'2015-11-04','4444','44');
INSERT INTO test(id,daty,opis1,opis2) VALUES(4,'2015-11-05','5555','55');

W Sqlite chcąc podmienić wartości w np. 2 wierszach wykonywałem takie zapytanie:
REPLACE INTO test (id,daty,opis1,opis2) VALUES(0,'2015-11-02','zmiana 1','zmiana 2'),(3,'2015-11-04','zmiana','zmiana');

Kolumna daty ustawiona jest jako UNIQUE więc zapytanie podmienia wartości w wierszach z określoną datą (lub jeśli wiersze nie istnieją to je dodaje).
Czy da się coś podobnego zrobić na bazie postgresql?

Mógłbym zrobić pętle i zapytaniem UPDATE po kolei aktualizować każdy wiersz osobno ale na pewno wydajniejsze było by jedno zapytanie w przypadku aktualizacji kilkudziesięciu wierszy.

0

Wg. dokumentacji (http://www.postgresql.org/docs/9.4/interactive/sql-insert.html) nie jest to mozliwe.

0

Nie udało mi się znaleźć jakiegoś sensownego rozwiązania aby zrobić to w jednym zapytaniu więc zrobiłem coś takiego, może komuś się przyda:

BEGIN;
DELETE FROM test WHERE daty IN ('2015-11-01','2015-11-04');
INSERT INTO test (id,daty,opis1,opis2) VALUES(0,'2015-11-01','zmiana 1','zmiana 2'),(3,'2015-11-04','zmiana','zmiana');
COMMIT;
0
  1. Powinieneś kasować rekordy wg id, a nie daty. Daty nie masz unikalnej, więc możesz "trochę" za dużo usunąć.
  2. Kasując wg id (o ile ci zależności pozwolą) mogą również się usunąć rekordy zależne ...
  3. to co chcesz zrobić, to fachowo nazywa się UPSERT i od 9.5 w postgreSQL ponoć jest (nie sprawdzałem). A w internetach jest na to pełno rozwiązań
0

Ad.1 - datę mam unikalną :)
Ad.3 - czytałem o UPSERT ale w przypadku postgresql jest to wybitnie nie czytelne i skomplikowane rozwiązanie :/, nie ma zależności na tej tabeli więc póki co moja metoda działa, jak wprowadzą jakieś lepsze rozwiązanie (jak np. w MySql-u) to pomyśle nad zmianą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1