sql >> Databáze >  >> RDS >> PostgreSQL

Mohu požádat Postgresql, aby ignoroval chyby v transakci

(AKTUALIZACE:Není třeba to dělat ručně, ptal jsem se na mailing listech postgresql a ukázalo se, že toto chování je již implementováno pomocí ON_ERROR_ROLLBACK nastavené v klientovi psql)

Chcete-li upřesnit Simonovu odpověď (+1) , ve vašem scénáři můžete běžně přidat bod uložení za každý interaktivní dotaz, vždy se stejným názvem (pokud je dotaz úspěšný, přepíše předchozí). V případě chyby se vrátíte k poslednímu uloženému a pokračujete odtud.

Příklad tohoto pracovního vzoru:

db=# select * from test_gral ;
 i |  t   |  n
---+------+------
 1 | text | 10.0
(1 row)

db=# begin;
BEGIN
db=#  insert into test_gral values (2,'xx',20); savepoint sp;
INSERT 0 1
SAVEPOINT
db=#  insert into test_gral values (3,'xx',30); savepoint sp;
INSERT 0 1
SAVEPOINT
db=#  insert into test_gralxx values (4,'xx',40); savepoint sp;
ERROR:  relation "test_gralxx" does not exist
LINE 1: insert into test_gralxx values (4,'xx',40);
                    ^
ERROR:  current transaction is aborted, commands ignored until end of transaction block
db=# ROLLBACK TO SAVEPOINT sp;
ROLLBACK
db=#  insert into test_gral values (4,'xx',40); savepoint sp;
INSERT 0 1
SAVEPOINT
db=# commit;
COMMIT
db=# select * from test_gral ;
 i |  t   |  n
---+------+------
 1 | text | 10.0
 2 | xx   |   20
 3 | xx   |   30
 4 | xx   |   40
(4 rows)


  1. Funkce Oracle NULLIF().

  2. PostgreSQL, komplexní dotaz pro výpočet přísad podle receptury

  3. PostgreSQL Reverzní LIKE

  4. Jak GROUP BY funguje?