PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Kontynuacja transakcji po błędzie naruszenia klucza podstawowego

Możesz również użyć SAVEPOINTs w transakcji.

Pseudokod w języku Python jest ilustrowany od strony aplikacji:

database.execute("BEGIN")
foreach data_row in input_data_dictionary:
    database.execute("SAVEPOINT bulk_savepoint")
    try:
        database.execute("INSERT", table, data_row)
    except:
        database.execute("ROLLBACK TO SAVEPOINT bulk_savepoint")
        log_error(data_row)
        error_count = error_count + 1
    else:
        database.execute("RELEASE SAVEPOINT bulk_savepoint")

if error_count > error_threshold:
    database.execute("ROLLBACK")
else:
    database.execute("COMMIT")

Edycja:Oto rzeczywisty przykład tego w działaniu w psql oparty na niewielkiej odmianie przykładu w dokumentacji (instrukcje SQL poprzedzone przedrostkiem ">"):

> CREATE TABLE table1 (test_field INTEGER NOT NULL PRIMARY KEY);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "table1_pkey" for table "table1"
CREATE TABLE

> BEGIN;
BEGIN
> INSERT INTO table1 VALUES (1);
INSERT 0 1
> SAVEPOINT my_savepoint;
SAVEPOINT
> INSERT INTO table1 VALUES (1);
ERROR:  duplicate key value violates unique constraint "table1_pkey"
> ROLLBACK TO SAVEPOINT my_savepoint;
ROLLBACK
> INSERT INTO table1 VALUES (3);
INSERT 0 1
> COMMIT;
COMMIT
> SELECT * FROM table1;  
 test_field 
------------
          1
          3
(2 rows)

Zauważ, że wartość 3 została wstawiona po błędzie, ale nadal w tej samej transakcji!

Dokumentacja SAVEPOINT znajduje się pod adresem http://www.postgresql.org/docs/8.4/static/sql-savepoint.html.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instalacja PostgreSQL na Ubuntu dla Ruby on Rails

  2. Zapytanie krzyżowe PostgreSQL

  3. Jak Mod() działa w PostgreSQL

  4. Błąd Heroku PostgreSQL GROUP_BY w aplikacji Rails

  5. Migracja z MySQL do PostgreSQL