Fitur pembaruan bersyarat memungkinkan Anda memperbarui data dalam tabel hanya jika kondisi tertentu terpenuhi. Jika kondisi tidak terpenuhi, pembaruan akan gagal.
Prasyarat
-
Instans OTSClient telah diinisialisasi. Untuk informasi selengkapnya, lihat Inisialisasi instans OTSClient.
-
Tabel data telah dibuat dan data telah ditulis ke dalam tabel tersebut. Untuk informasi selengkapnya, lihat Buat tabel data dan Tulis data.
Catatan penggunaan
Saat memanggil operasi PutRow, UpdateRow, DeleteRow, atau BatchWriteRow untuk memperbarui data, Anda dapat menggunakan pembaruan bersyarat guna memeriksa kondisi keberadaan baris dan kondisi berbasis kolom. Pembaruan hanya berhasil jika kedua kondisi tersebut terpenuhi.
Pembaruan bersyarat mencakup dua jenis kondisi: kondisi keberadaan baris dan kondisi berbasis kolom.
-
Kondisi keberadaan baris mencakup IGNORE, EXPECT_EXIST, dan EXPECT_NOT_EXIST.
Saat memodifikasi tabel data, Tablestore terlebih dahulu memverifikasi kondisi keberadaan baris. Jika kondisi tersebut tidak terpenuhi, modifikasi akan gagal dan menghasilkan error.
-
Kondisi berbasis kolom mencakup SingleColumnCondition dan CompositeCondition, yang digunakan untuk mengevaluasi apakah kondisi terpenuhi berdasarkan nilai satu atau beberapa kolom.
Kondisi berbasis kolom mendukung operator relasional berikut: =, !=, >, >=, <, dan <=. Selain itu, kondisi ini juga mendukung operator logika: NOT, AND, dan OR. Anda dapat menentukan hingga 10 kondisi berbasis kolom dalam satu pembaruan bersyarat.
-
SingleColumnCondition hanya mendukung perbandingan antara konstanta dan kolom, serta tidak mendukung perbandingan antar dua kolom atau antar dua konstanta.
-
Operator logika digunakan untuk menggabungkan subkondisi dalam CompositeCondition. Subkondisi tersebut dapat berupa SingleColumnCondition atau CompositeCondition.
-
Pembaruan bersyarat dapat digunakan untuk menerapkan kunci optimis. Saat memperbarui suatu baris, Anda harus terlebih dahulu membaca nilai kolom tertentu dan menentukan kondisi pembaruan berdasarkan nilai tersebut. Misalnya, saat memperbarui nilai Kolom A menjadi 2, Anda harus terlebih dahulu membaca nilai Kolom A—misalnya, nilainya adalah 1—lalu menetapkan bahwa pembaruan hanya boleh dilakukan jika nilai Kolom A masih 1. Jika kondisi terpenuhi, pembaruan berhasil. Namun, jika baris tersebut telah diperbarui oleh klien lain sebelumnya, pembaruan akan gagal.
Parameter
|
Parameter |
Deskripsi |
|
RowExistenceExpectation |
Kondisi keberadaan baris. Saat Anda memodifikasi tabel, Tablestore memeriksa kondisi keberadaan baris. Jika kondisi keberadaan baris tidak terpenuhi, modifikasi gagal dan error dilaporkan. Kondisi keberadaan baris mencakup IGNORE, EXPECT_EXIST, dan EXPECT_NOT_EXIST. Di Tablestore, RowExistenceExpectation_IGNORE digunakan untuk menentukan IGNORE, RowExistenceExpectation_EXPECT_EXIST digunakan untuk menentukan EXPECT_EXIST, dan RowExistenceExpectation_EXPECT_NOT_EXIST digunakan untuk menentukan EXPECT_NOT_EXIST.
|
|
columnName |
Nama kolom. |
|
columnValue |
Nilai pembanding kolom. |
|
comparator |
Operator relasional yang digunakan untuk membandingkan nilai kolom. Untuk informasi mengenai jenis operator relasional, lihat ComparatorType. Operator relasional mencakup EQUAL(=), NOT_EQUAL(!=), GREATER_THAN(>), GREATER_EQUAL(>=), LESS_THAN(<), dan LESS_EQUAL(<=). Di Tablestore, CT_EQUAL digunakan untuk menentukan EQUAL(=), CT_NOT_EQUAL untuk NOT_EQUAL(!=), CT_GREATER_THAN untuk GREATER_THAN(>), CT_GREATER_EQUAL untuk GREATER_EQUAL(>=), CT_LESS_THAN untuk LESS_THAN(<), dan CT_LESS_EQUAL untuk LESS_EQUAL(<=). |
|
combinator |
Operator logika yang menggabungkan beberapa kondisi. Untuk informasi mengenai jenis operator logika, lihat LogicalOperator. Operator logika mencakup NOT, AND, dan OR. Di Tablestore, LO_NOT digunakan untuk menentukan NOT, LO_AND untuk AND, dan LO_OR untuk OR. Jumlah subkondisi yang dapat Anda tentukan bervariasi tergantung pada operator logika yang digunakan.
|
|
passIfMissing |
Menentukan apakah pemeriksaan kondisi dilewati ketika suatu kolom tidak ada dalam baris. Nilai parameter ini bertipe Boolean. Nilai default-nya adalah true, yang berarti jika kolom tidak ada dalam baris, pemeriksaan kondisi dianggap lolos dan baris memenuhi syarat pembaruan. Jika Anda mengatur parameter passIfMissing ke false dan kolom tidak ada dalam baris, pemeriksaan kondisi gagal dan baris tidak memenuhi syarat pembaruan. |
|
latestVersionOnly |
Menentukan apakah hanya versi terbaru dari nilai yang digunakan untuk perbandingan ketika suatu kolom memiliki beberapa versi nilai. Nilai parameter ini bertipe Boolean. Nilai default-nya adalah true, yang berarti jika kolom memiliki beberapa versi nilai, hanya versi terbaru yang digunakan untuk perbandingan. Jika Anda mengatur parameter latestVersionOnly ke false dan kolom memiliki beberapa versi nilai, semua versi nilai tersebut digunakan untuk perbandingan. Dalam kasus ini, jika setidaknya satu versi memenuhi kondisi, pemeriksaan kondisi dianggap lolos dan baris memenuhi syarat pembaruan. |
Contoh
Perbarui baris berdasarkan primary key yang ditentukan. Pembaruan berhasil hanya jika baris tersebut ada, nilai kolom "name" adalah "john", dan nilai kolom "addr" adalah "china". Jika salah satu kondisi tidak terpenuhi, pembaruan gagal.
var params = {
tableName: "sampleTable",
primaryKey: [{ 'gid': Long.fromNumber(20013) }, { 'uid': Long.fromNumber(20013) }],
updateOfAttributeColumns: [{ 'PUT': [{ 'col1': 'test6' }] }]
};
// Tentukan kondisi pembaruan. Tentukan bahwa data hanya dapat diperbarui jika kondisi berikut terpenuhi: baris yang ditentukan ada, nilai kolom "name" adalah "john", dan nilai kolom "addr" adalah "china".
var condition = new TableStore.CompositeCondition(TableStore.LogicalOperator.AND);
condition.addSubCondition(new TableStore.SingleColumnCondition('name', 'john', TableStore.ComparatorType.EQUAL));
condition.addSubCondition(new TableStore.SingleColumnCondition('addr', 'china', TableStore.ComparatorType.EQUAL));
params.condition = new TableStore.Condition(TableStore.RowExistenceExpectation.EXPECT_EXIST, condition);
client.updateRow(params,
function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', data);
});