PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Продължаване на транзакция след грешка при нарушение на първичния ключ

Можете също да използвате SAVEPOINTs в транзакция.

Псевдокодът на Pythonish е илюстриран от страната на приложението:

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")

Редактиране:Ето един действителен пример за това в действие в psql въз основа на лека вариация на примера в документацията (SQL оператори с префикс ">"):

> 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)

Обърнете внимание, че стойността 3 беше вмъкната след грешката, но все още в същата транзакция!

Документацията за SAVEPOINT е на адрес 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. Как да видите кода CREATE VIEW за изглед в PostgreSQL?

  2. Свързване с PostgreSQL в IRI Workbench

  3. django.db.utils.OperationalError Не можа да се свърже със сървъра

  4. Как да използвам SQL for цикъл за вмъкване на редове в база данни?

  5. Как да маркирате определен брой редове в таблицата при едновременен достъп