sql >> データベース >  >> RDS >> PostgreSQL

主キー違反エラーの後にトランザクションを続行する

    トランザクションでSAVEPOINTを使用することもできます。

    Pythonの擬似コードは、アプリケーション側から説明されています。

    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. 成功したMySQLDELETEは何を返しますか? DELETEが成功したかどうかを確認するにはどうすればよいですか?

    2. SQLのみを使用した基数36から基数10への変換

    3. SQLiteをJSONに変換する

    4. IDが存在するときにテーブルの不明な主キーを取得する