全部产品
Search
文档中心

Tablestore:Lakukan pembaruan bersyarat

更新时间:Jul 06, 2025

Anda dapat menggunakan fitur pembaruan bersyarat untuk memperbarui data dalam tabel hanya jika kondisi yang ditentukan terpenuhi. Jika kondisi tidak terpenuhi, pembaruan akan gagal.

Prasyarat

  • Instansi OTSClient harus diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi instansi OTSClient.

  • Tabel harus dibuat dan data telah ditulis ke dalam tabel. Untuk informasi lebih lanjut, lihat Buat tabel.

Catatan penggunaan

Saat Anda memanggil operasi PutRow, UpdateRow, DeleteRow, atau BatchWriteRow untuk memperbarui data dalam tabel, Anda dapat menentukan kondisi keberadaan baris dan kondisi berbasis kolom untuk melakukan pembaruan bersyarat. Data diperbarui hanya jika kondisi terpenuhi.

Anda dapat menentukan kondisi keberadaan baris dan kondisi berbasis kolom untuk pembaruan bersyarat.

  • Kondisi Berbasis Kolom

    Kondisi berbasis kolom mencakup SingleColumnValueConditions dan CompositeColumnValueConditions, yang digunakan untuk mengevaluasi nilai satu atau lebih kolom. Kondisi ini mirip dengan filter yang digunakan oleh Tablestore.

    Kondisi berbasis kolom mendukung operator relasional dan logika berikut: =, !=, >, >=, <, <=, NOT, AND, dan OR. Anda dapat menentukan hingga 10 kondisi berbasis kolom untuk pembaruan bersyarat.

    • SingleColumnValueCondition memungkinkan Anda membandingkan kolom dengan konstanta. SingleColumnValueCondition tidak mendukung perbandingan antara dua kolom atau dua konstanta.

    • CompositeColumnValueCondition terdiri dari beberapa SingleColumnValueConditions atau CompositeColumnValueConditions. Anda harus menentukan hubungan logis antara subkondisi.

  • Kondisi Keberadaan Baris

    Saat memperbarui tabel, Tablestore pertama-tama memeriksa apakah kondisi keberadaan baris terpenuhi. Jika kondisi tersebut tidak terpenuhi, pembaruan gagal dan kesalahan dilaporkan.

    Kondisi keberadaan baris yang didukung meliputi: IGNORE, EXPECT_EXIST, dan EXPECT_NOT_EXIST.

Parameter

Anda dapat mengonfigurasi parameter condition saat menggunakan operasi PutRow, UpdateRow, DeleteRow, atau BatchWriteRow untuk melakukan pembaruan bersyarat.

    'condition' => [
        'row_existence' => <RowExistenceExpectation>
        'column_condition' => <ColumnCondition>
    ]   

Jika hanya ada kondisi keberadaan baris, kondisi tersebut dapat disingkat. Contoh kode berikut menunjukkan singkatan tersebut:

    'condition' => <RowExistenceExpectation>    

Contoh kode berikut menunjukkan cara membuat SingleColumnValueCondition dan CompositeColumnValueFilter:

SingleColumnValueCondition

    [
        'column_name' => '<string>',
        'value' => <ColumnValue>,
        'comparator' => <ComparatorType>,
        'pass_if_missing' => true || false,
        'latest_version_only' => true || false
    ]

CompositeColumnValueFilter

    [
        'logical_operator' => <LogicalOperator>
        'sub_conditions' => [
            <ColumnCondition>,
            <ColumnCondition>,
            <ColumnCondition>,
            // kondisi lainnya
        ]
    ]

Parameter

Deskripsi

row_existence

Kondisi keberadaan baris. Saat Anda memodifikasi tabel data, Tablestore memeriksa kondisi keberadaan baris. Jika kondisi keberadaan baris tidak terpenuhi, modifikasi gagal dan kesalahan dilaporkan.

Kondisi keberadaan baris mencakup IGNORE, EXPECT_EXIST, dan EXPECT_NOT_EXIST. Di Tablestore, RowExistenceExpectationConst::CONST_IGNORE menentukan IGNORE, RowExistenceExpectationConst::CONST_EXPECT_EXIST menentukan EXPECT_EXIST, dan RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST menentukan EXPECT_NOT_EXIST.

  • IGNORE: Tidak ada pemeriksaan keberadaan baris yang dilakukan.

  • EXPECT_EXIST: Baris diharapkan ada. Jika baris ada, kondisi terpenuhi. Jika baris tidak ada, kondisi tidak terpenuhi.

  • EXPECT_NOT_EXIST: Baris diharapkan tidak ada. Jika baris tidak ada, kondisi terpenuhi. Jika baris ada, kondisi tidak terpenuhi.

column_name

Nama kolom.

value

Nilai perbandingan kolom.

Nilai parameter ini dalam format [Value, Type]. Anda dapat menentukan Integer, String, Binary, Boolean, atau Double sebagai tipe. Di Tablestore, ColumnTypeConst::CONST_INTEGER menentukan nilai Integer, ColumnTypeConst::CONST_STRING menentukan string yang dikodekan UTF-8, ColumnTypeConst::CONST_BINARY menentukan nilai Binary, ColumnTypeConst::CONST_BOOLEAN menentukan nilai Boolean, dan ColumnTypeConst::CONST_DOUBLE menentukan nilai Double. Jika tipe adalah Binary, Anda harus menentukan nilai dan tipe.

Jika tipe bukan Binary, Anda dapat menentukan nilai tanpa menentukan tipe.

comparator

Operator relasional yang digunakan untuk membandingkan nilai kolom. Untuk informasi tentang jenis operator relasional, lihat ComparatorType.

Operator relasional mencakup EQUAL(=), NOT_EQUAL(!=), GREATER_THAN(>), GREATER_EQUAL(>=), LESS_THAN(<), dan LESS_EQUAL(<=). Di Tablestore, ComparatorTypeConst::CONST_EQUAL menentukan EQUAL(=), ComparatorTypeConst::CONST_NOT_EQUAL menentukan NOT_EQUAL(!=), ComparatorTypeConst::CONST_GREATER_THAN menentukan GREATER_THAN(>), ComparatorTypeConst::CONST_GREATER_EQUAL menentukan GREATER_EQUAL(>=), ComparatorTypeConst::CONST_LESS_THAN menentukan LESS_THAN(<), dan ComparatorTypeConst::CONST_LESS_EQUAL menentukan LESS_EQUAL(<=).

logical_operator

Operator logika yang digunakan untuk menggabungkan beberapa kondisi. Untuk informasi tentang jenis operator logika, lihat LogicalOperator.

Operator logika mencakup NOT, AND, dan OR. Di Tablestore, LogicalOperatorConst::CONST_NOT menentukan NOT, LogicalOperatorConst::CONST_AND menentukan AND, dan LogicalOperatorConst::CONST_OR menentukan OR.

Jumlah subkondisi yang dapat Anda tentukan bervariasi berdasarkan operator logika yang Anda gunakan.

  • Jika operator logika adalah NOT, Anda dapat menentukan hanya satu subkondisi.

  • Jika operator logika adalah AND atau OR, Anda harus menentukan setidaknya dua subkondisi.

pass_if_missing

Menentukan apakah akan melewati pemeriksaan kondisi ketika kolom tidak ada dalam baris. Nilai parameter ini bertipe Boolean. Nilai defaultnya adalah true, yang menentukan bahwa jika kolom tidak ada dalam baris, pemeriksaan kondisi dilewati dan baris memenuhi kondisi pembaruan.

Jika Anda mengatur parameter pass_if_missing ke false dan kolom tidak ada dalam baris, pemeriksaan kondisi gagal dan baris tidak memenuhi kondisi pembaruan.

latest_version_only

Menentukan apakah hanya menggunakan versi data terbaru untuk perbandingan ketika kolom memiliki beberapa versi data. Nilai parameter ini bertipe Boolean. Nilai defaultnya adalah true, yang menentukan bahwa jika kolom memiliki beberapa versi data, hanya versi data terbaru yang digunakan untuk perbandingan.

Jika Anda mengatur parameter latest_version_only ke false dan kolom memiliki beberapa versi data, semua versi data digunakan untuk perbandingan. Dalam hal ini, jika hanya satu versi yang memenuhi kondisi, pemeriksaan kondisi dilewati dan baris memenuhi kondisi pembaruan.

Contoh

Lakukan operasi pada data berdasarkan kondisi keberadaan baris

Contoh kode berikut menunjukkan cara melakukan operasi pada baris data berdasarkan kunci utama baris. Dalam contoh ini, jika baris yang ditentukan ada, operasi berhasil. Jika tidak, operasi gagal.

$request = array (
    'tables' => array (
        array (
            'table_name' => '<My_Table>',
            'rows' => array (  
                array (
                    // Operasi PUT
                    'operation_type' => OperationTypeConst::CONST_PUT,
                    // Baris yang ditentukan diharapkan tidak ada. Jika baris yang ditentukan tidak ada, kondisi terpenuhi. 
                    'condition' => RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST,
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 11),
                    ),
                    'attribute_columns' => array (
                        array('attr1', 'Tablestore'),
                        array('attr2', 128)
                    )
                ),

                array (
                    // Operasi UPDATE
                    'operation_type' => OperationTypeConst::CONST_UPDATE,
                    // Baris yang ditentukan diharapkan ada. Jika baris yang ditentukan ada, kondisi terpenuhi. 
                    'condition' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 22),
                    ),
                    'update_of_attribute_columns'=> array(
                        'PUT' => array (
                            array('attr1', 'OTS'),
                            array('attr2',  256)
                        )
                    )
                ),
                
                array (
                    // Operasi DELETE
                    'operation_type' => OperationTypeConst::CONST_DELETE, 
                    // Tidak ada pemeriksaan keberadaan baris yang dilakukan. 
                    'condition' => RowExistenceExpectationConst::CONST_IGNORE,
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 33),
                    )
                ),
            )
        )
    )
);

$response = $otsClient->batchWriteRow ($request);

// Proses setiap tabel yang dikembalikan.
foreach ($response['tables'] as $tableData) {
    print "Memproses tabel {$tableData['table_name']} ...\n";
    
    // Proses hasil yang dikembalikan oleh operasi PutRow dalam tabel ini.
    $putRows = $tableData['rows'];
    
    foreach ($putRows as $rowData) {
      
      if ($rowData['is_ok']) {
        // Data ditulis.
        print "Kapasitas Unit Terpakai: {$rowData['consumed']['capacity_unit']['write']}\n";
      } else {
        // Tampilkan informasi kesalahan.
        print "Kesalahan: {$rowData['error']['code']} {$rowData['error']['message']}\n";
      }
    }
  }

Lakukan operasi pada data berdasarkan kondisi keberadaan baris dan kondisi berdasarkan nilai kolom

Contoh kode berikut menunjukkan cara melakukan operasi pada data berdasarkan kondisi keberadaan baris dan nilai kolom:

$request = array (
    'tables' => array (
        array (
            'table_name' => 'MyTable',
            'rows' => array (  
                // Buat SingleColumnValueCondition.
                  array (
                    // Operasi UPDATE
                    'operation_type' => OperationTypeConst::CONST_UPDATE,
                    'condition' => array (
                        'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
                        //attr2 != 256
                        'column_condition' => array (
                            'column_name' => 'attr2',
                            'value' => 256,
                            'comparator' => ComparatorTypeConst::CONST_NOT_EQUAL
                        )
                    ),
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 11)
                    ),
                    // Gunakan attribute_columns/put untuk menentukan kolom yang ingin Anda perbarui atau tambahkan.
                    'update_of_attribute_columns'=> array(
                        'PUT' => array (
                            array('attr1', 'OTS'),
                            array('attr2',  128)
                        )
                    )
                ),

                // Buat CompositeColumnValueFilter.
                array ( 
                    // Operasi UPDATE
                    'operation_type' => OperationTypeConst::CONST_UPDATE,
                    'condition' => array (
                        'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
                        // attr1 = 'Tablestore' and attr2 >= 256
                        'column_condition' => array (
                            'logical_operator' => LogicalOperatorConst::CONST_AND,
                            'sub_conditions' => array (
                                array (
                                    'column_name' => 'attr2',
                                    'value' => 256,
                                    'comparator' => ComparatorTypeConst::CONST_GREATER_EQUAL
                                ),
                                array (
                                    'column_name' => 'attr1',
                                    'value' => 'Tablestore',
                                    'comparator' => ComparatorTypeConst::CONST_EQUAL
                                )
                            )
                        )
                    ),
                    'primary_key' => array (
                        array('PK1', 'pkValue'),
                        array('PK2', 22)
                    ),
                    'update_of_attribute_columns'=> array(
                        'PUT' => array (),
                        // Gunakan attribute_columns/delete untuk menentukan kolom yang ingin Anda hapus.
                        'DELETE_ALL' => array(
                            'attr1',
                            'attr2'
                        )
                    )
                ),
            )
        )
    )
);

$response = $otsClient->batchWriteRow ($request);

// Proses setiap tabel yang dikembalikan.
foreach ($response['tables'] as $tableData) {
    print "Memproses tabel {$tableData['table_name']} ...\n";
    
    // Proses hasil yang dikembalikan oleh operasi PutRow dalam tabel ini.
    $putRows = $tableData['rows'];
    
    foreach ($putRows as $rowData) {
      
      if ($rowData['is_ok']) {
        // Data ditulis.
        print "Kapasitas Unit Terpakai: {$rowData['consumed']['capacity_unit']['write']}\n";
      } else {
        // Tampilkan informasi kesalahan.
        print "Kesalahan: {$rowData['error']['code']} {$rowData['error']['message']}\n";
      }
    }
  }

Buat kondisi untuk melakukan kunci optimis guna meningkatkan nilai kolom

Contoh kode berikut menunjukkan cara membuat kondisi untuk kunci optimis guna meningkatkan nilai kolom:

    // Baca baris data. 
    $request = [
        'table_name' => 'MyTable', 
        'primary_key' => [ // Kunci utama. 
            ['PK0', 123],
            ['PK1', 'abc']
        ],
        'max_versions' => 1
    ];
    $response = $otsClient->getRow ($request);
    $columnMap = getColumnValueAsMap($response['attribute_columns']);
    $col0Value = $columnMap['col0'][0][1];
    // Konfigurasikan pembaruan bersyarat untuk kolom Col0 untuk meningkatkan nilai kolom Col0 sebesar 1. 
    $request = [
        'table_name' => 'MyTable',
        'condition' => [
            'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
            'column_condition' => [                  // Jika kondisi terpenuhi, data diperbarui. 
                'column_name' => 'col0',
                'value' => $col0Value,
                'comparator' => ComparatorTypeConst::CONST_EQUAL
            ]
        ],
        'primary_key' => [ // Kunci utama. 
            ['PK0', 123],
            ['PK1', 'abc']
        ],
        'update_of_attribute_columns'=> [
            'PUT' => [
                ['col0', $col0Value+1]
            ]
        ]
    ];
    $response = $otsClient->updateRow ($request);

Untuk lebih banyak contoh kode, kunjungi PutRow@GitHub, UpdateRow@GitHub, DeleteRow@GitHub, dan BatchWriteRow@GitHub.