sql >> Database teknologi >  >> RDS >> PostgreSQL

Fortsætter en transaktion efter fejl ved primærnøgleovertrædelse

Du kan også bruge SAVEPOINTs i en transaktion.

Pythonisk pseudokode er illustreret fra applikationssiden:

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

Edit:Her er et faktisk eksempel på dette i aktion i psql baseret på en lille variation af eksemplet i dokumentationen (SQL-udsagn foranstillet med ">"):

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

Bemærk, at værdien 3 blev indsat efter fejlen, men stadig inde i samme transaktion!

Dokumentationen for SAVEPOINT er på http://www.postgresql.org/docs/8.4/static/sql-savepoint.html.



  1. Er der en måde at ikke bruge firkantede parenteser i SQL Server?

  2. MySql-fejl:Kan ikke opdatere tabel i lagret funktion/trigger, fordi den allerede bruges af sætning, der påkaldte denne lagrede funktion/trigger

  3. SQL Server IF vs IIF():Hvad er forskellen?

  4. Hvordan EXTRACT() virker i MariaDB