All Products
Search
Document Center

Tablestore:Pembaruan kondisional

Last Updated:Aug 19, 2026

Prasyarat

Deskripsi

Kontainer Condition berisi kondisi keberadaan baris (rowExistenceExpectation), kondisi kolom (columnCondition), atau keduanya. Teruskan kondisi yang telah dikonfigurasi ke setCondition() pada RowPutChange, RowUpdateChange, atau RowDeleteChange. Perubahan baris ini juga dapat dimasukkan dalam permintaan BatchWriteRow. Jika kondisi tidak terpenuhi, server mengembalikan error dan baris tetap tidak berubah.

rowChange.setCondition(condition)
new SingleColumnValueCondition(columnName, operator, columnValue)
new CompositeColumnValueCondition(logicOperator)

Contoh berikut memperbarui baris dengan primary key row1 pada tabel condition_demo hanya jika baris tersebut ada. Jika tidak, server mengembalikan error.

PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
        .build();

RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));

Condition condition = new Condition();
condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
rowUpdateChange.setCondition(condition);

client.updateRow(new UpdateRowRequest(rowUpdateChange));

Parameter

Pembaruan kondisional dapat digunakan sebagai kondisi untuk operasi PutRow, UpdateRow, DeleteRow, dan BatchWriteRow.

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

Jika hanya kondisi keberadaan baris yang ditentukan, Anda dapat menggunakan struktur singkat berikut.

    'condition' => <RowExistenceExpectation>    

Struktur untuk SingleColumnValueCondition dan CompositeColumnValueCondition adalah sebagai berikut.

Struktur SingleColumnValueCondition

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

Struktur CompositeColumnValueFilter

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

Parameter

Deskripsi

row_existence

Saat Anda memodifikasi tabel data, sistem terlebih dahulu memeriksa kondisi keberadaan baris. Jika kondisi tidak terpenuhi, modifikasi gagal dan error dilaporkan.

Kondisi keberadaan baris mencakup IGNORE, EXPECT_EXIST, dan EXPECT_NOT_EXIST. Kondisi-kondisi ini direpresentasikan oleh RowExistenceExpectationConst::CONST_IGNORE, RowExistenceExpectationConst::CONST_EXPECT_EXIST, dan RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST.

  • IGNORE: Mengabaikan pemeriksaan. Tidak dilakukan pengecekan keberadaan.

  • EXPECT_EXIST: Mengharapkan baris ada. Kondisi terpenuhi jika baris tersebut ada. Kondisi tidak terpenuhi jika baris tidak ada.

  • EXPECT_NOT_EXIST: Mengharapkan baris tidak ada. Kondisi terpenuhi jika baris tidak ada. Kondisi tidak terpenuhi jika baris ada.

column_name

Nama kolom.

value

Nilai yang akan dibandingkan dengan nilai kolom.

Formatnya adalah [Value, Type]. Tipe dapat berupa INTEGER, STRING (dienkode UTF-8), BINARY, BOOLEAN, atau DOUBLE. Tipe-tipe ini direpresentasikan oleh ColumnTypeConst::CONST_INTEGER, ColumnTypeConst::CONST_STRING, ColumnTypeConst::CONST_BINARY, ColumnTypeConst::CONST_BOOLEAN, dan ColumnTypeConst::CONST_DOUBLE. Tipe untuk BINARY wajib ditentukan. Tipe untuk nilai lainnya bersifat opsional.

Jika tipe bukan BINARY, Anda dapat menggunakan format singkat Value.

comparator

Operator relasional yang digunakan untuk membandingkan nilai kolom. Untuk informasi selengkapnya tentang tipe ini, lihat ComparatorType.

Operator relasional mencakup EQUAL (=), NOT_EQUAL (!=), GREATER_THAN (>), GREATER_EQUAL (>=), LESS_THAN (<), dan LESS_EQUAL (<=). Operator-operator ini direpresentasikan oleh ComparatorTypeConst::CONST_EQUAL, ComparatorTypeConst::CONST_NOT_EQUAL, ComparatorTypeConst::CONST_GREATER_THAN, ComparatorTypeConst::CONST_GREATER_EQUAL, ComparatorTypeConst::CONST_LESS_THAN, dan ComparatorTypeConst::CONST_LESS_EQUAL.

logical_operator

Operator logika yang digunakan untuk menggabungkan beberapa kondisi. Untuk informasi selengkapnya tentang tipe ini, lihat LogicalOperator.

Operator logika mencakup NOT, AND, dan OR. Operator-operator ini direpresentasikan oleh LogicalOperatorConst::CONST_NOT, LogicalOperatorConst::CONST_AND, dan LogicalOperatorConst::CONST_OR.

Jumlah sub-kondisi yang dapat Anda tambahkan bergantung pada operator logika.

  • Jika operator logika adalah NOT, Anda hanya dapat menambahkan satu sub-kondisi.

  • Jika operator logika adalah AND atau OR, Anda harus menambahkan minimal dua sub-kondisi.

pass_if_missing

Menentukan apakah pemeriksaan kondisi lolos jika kolom tidak ada dalam suatu baris. Tipe datanya boolean. Nilai default-nya true. Artinya, jika kolom tidak ada dalam baris, pemeriksaan kondisi lolos dan baris memenuhi kondisi pembaruan.

Jika Anda mengatur pass_if_missing ke false, pemeriksaan kondisi gagal jika kolom tidak ada dalam baris. Baris tersebut tidak memenuhi kondisi pembaruan.

latest_version_only

Menentukan apakah hanya versi terbaru dari nilai kolom yang digunakan untuk perbandingan jika kolom memiliki beberapa versi. Tipe datanya boolean. Nilai default-nya true. Artinya, jika kolom memiliki beberapa versi, hanya versi terbaru yang digunakan untuk perbandingan.

Jika Anda mengatur latest_version_only ke false dan kolom memiliki beberapa versi, semua versi nilai kolom digunakan untuk perbandingan. Dalam kasus ini, jika salah satu versi memenuhi kondisi, pemeriksaan kondisi lolos dan baris memenuhi kondisi pembaruan.

Contoh

Lakukan operasi data berdasarkan kondisi keberadaan baris

Contoh berikut menunjukkan cara melakukan operasi pada suatu baris berdasarkan primary key-nya dan kondisi keberadaan baris yang ditentukan.

$request = array (
    'tables' => array (
        array (
            'table_name' => 'my_table',
            'rows' => array (  
                array (
                    // Operasi PUT
                    'operation_type' => OperationTypeConst::CONST_PUT,
                    // Mengharapkan baris tidak ada. Kondisi terpenuhi jika baris tidak ada.
                    '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,
                    // Mengharapkan baris ada. Kondisi terpenuhi jika baris ada.
                    '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, 
                    // Abaikan. Tidak dilakukan pengecekan keberadaan.
                    'condition' => RowExistenceExpectationConst::CONST_IGNORE,
                    'primary_key' => array (
                        array('PK1', 'PrimaryKey'),
                        array('PK2', 33),
                    )
                ),
            )
        )
    )
);

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

// Proses respons untuk setiap tabel
foreach ($response['tables'] as $tableData) {
    print "Handling table {$tableData['table_name']} ...\n";
    
    // Proses hasil PutRow untuk tabel ini
    $putRows = $tableData['rows'];
    
    foreach ($putRows as $rowData) {
      
      if ($rowData['is_ok']) {
        // Operasi penulisan berhasil
        print "Capacity Unit Consumed: {$rowData['consumed']['capacity_unit']['write']}\n";
      } else {
        // Terjadi error
        print "Error: {$rowData['error']['code']} {$rowData['error']['message']}\n";
      }
    }
  }

Lakukan operasi data berdasarkan kondisi baris dan kolom

Contoh berikut menunjukkan cara melakukan operasi berdasarkan kondisi baris dan kolom.

$request = array (
    'tables' => array (
        array (
            'table_name' => 'MyTable',
            'rows' => array (  
                // Struktur 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 akan diperbarui atau ditambahkan.
                    'update_of_attribute_columns'=> array(
                        'PUT' => array (
                            array('attr1', 'OTS'),
                            array('attr2',  128)
                        )
                    )
                ),

                // Struktur CompositeColumnValueFilter
                array ( 
                    // Operasi UPDATE
                    'operation_type' => OperationTypeConst::CONST_UPDATE,
                    'condition' => array (
                        'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
                        // attr1 = 'Tablestore' dan 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 akan dihapus.
                        'DELETE_ALL' => array(
                            'attr1',
                            'attr2'
                        )
                    )
                ),
            )
        )
    )
);

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

// Proses respons untuk setiap tabel
foreach ($response['tables'] as $tableData) {
    print "Handling table {$tableData['table_name']} ...\n";
    
    // Proses hasil PutRow untuk tabel ini
    $putRows = $tableData['rows'];
    
    foreach ($putRows as $rowData) {
      
      if ($rowData['is_ok']) {
        // Operasi penulisan berhasil
        print "Capacity Unit Consumed: {$rowData['consumed']['capacity_unit']['write']}\n";
      } else {
        // Terjadi error
        print "Error: {$rowData['error']['code']} {$rowData['error']['message']}\n";
      }
    }
  }

Gunakan kondisi untuk menerapkan optimistic locking dan menambah nilai kolom

Contoh berikut menunjukkan cara membuat kondisi untuk menerapkan optimistic locking dan menambah nilai kolom.

    // Baca satu baris data.
    $request = [
        'table_name' => 'MyTable', 
        'primary_key' => [ // Primary key.
            ['PK0', 123],
            ['PK1', 'abc']
        ],
        'max_versions' => 1
    ];
    $response = $otsClient->getRow ($request);
    $columnMap = getColumnValueAsMap($response['attribute_columns']);
    $col0Value = $columnMap['col0'][0][1];
    // Perbarui kolom col0 secara kondisional untuk menambah nilainya sebesar 1.
    $request = [
        'table_name' => 'MyTable',
        'condition' => [
            'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
            'column_condition' => [                  // Jika kondisi terpenuhi, perbarui data.
                'column_name' => 'col0',
                'value' => $col0Value,
                'comparator' => ComparatorTypeConst::CONST_EQUAL
            ]
        ],
        'primary_key' => [ // Primary key.
            ['PK0', 123],
            ['PK1', 'abc']
        ],
        'update_of_attribute_columns'=> [
            'PUT' => [
                ['col0', $col0Value+1]
            ]
        ]
    ];
    $response = $otsClient->updateRow ($request);

Untuk contoh kode lainnya, lihat PutRow@GitHub, UpdateRow@GitHub, DeleteRow@GitHub, dan BatchWriteRow@GitHub.