Anda dapat memperbarui data dalam tabel hanya jika data tersebut memenuhi kondisi kolom tertentu. Jika kondisi tidak terpenuhi, pembaruan akan gagal.
Prasyarat
-
Client telah diinisialisasi. Untuk informasi selengkapnya, lihat Inisialisasi client Tablestore.
-
Tabel data telah dibuat dan data telah ditulis ke dalamnya. Untuk informasi selengkapnya, lihat Buat tabel data.
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 kunci primary row1 dalam 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 bersyarat 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 ringkas 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>,
// other conditions
]
]
|
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 meliputi 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.
|
|
column_name |
Nama kolom. |
|
value |
Nilai yang digunakan untuk membandingkan 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 lain bersifat opsional. Jika tipe bukan BINARY, Anda dapat menggunakan format ringkas Value. |
|
comparator |
Operator relasional yang digunakan untuk membandingkan nilai kolom. Untuk informasi lebih lanjut tentang tipe ini, lihat ComparatorType. Operator relasional meliputi 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 lebih lanjut tentang tipe ini, lihat LogicalOperator. Operator logika meliputi 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.
|
|
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 baris berdasarkan kunci primernya 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 pemeriksaan 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 tulis 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' 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 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 tulis 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 kunci optimis dan menambah nilai kolom
Contoh berikut menunjukkan cara membuat kondisi untuk menerapkan kunci optimis dan menambah nilai kolom.
// Baca satu baris data.
$request = [
'table_name' => 'MyTable',
'primary_key' => [ // Kunci primary.
['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' => [ // Kunci primary.
['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.