All Products
Search
Document Center

Tablestore:Menulis data

Last Updated:Mar 01, 2026

Tablestore menyediakan tiga operasi untuk menulis data ke tabel: PutRow, UpdateRow, dan BatchWriteRow.

Catatan

Baris merupakan unit dasar tabel. Setiap baris terdiri dari kolom kunci primer dan kolom atribut opsional. Nama serta tipe kolom kunci primer sama di seluruh baris dalam suatu tabel. Kolom atribut dapat berbeda antarbaris. Untuk informasi lebih lanjut, lihat Overview.

Operasi

OperationScopeBehavior
PutRowSingle rowMenyisipkan satu baris. Jika baris dengan kunci primer yang sama sudah ada, semua versi data di semua kolom akan dihapus dan data baru ditulis.
UpdateRowSingle rowMenambahkan, memperbarui, atau menghapus kolom atribut. Menghapus versi tertentu dari data dalam suatu kolom. Jika baris tidak ada, baris baru akan disisipkan (kecuali jika permintaan hanya berisi penghapusan kolom).
BatchWriteRowMultiple rowsMenggabungkan beberapa sub-operasi PutRow, UpdateRow, dan DeleteRow dalam satu permintaan yang mencakup satu atau beberapa tabel. Setiap sub-operasi dijalankan dan diberi tanggapan secara independen.

Pengaturan umum

Sebelum menulis data, Anda dapat mengonfigurasi pengaturan opsional berikut untuk setiap operasi penulisan:

  • Data version number: Secara default, Tablestore menggunakan stempel waktu UNIX saat ini (milidetik sejak 1 Januari 1970, 00:00:00 UTC) sebagai nomor versi. Tentukan nomor versi kustom jika diperlukan. Untuk informasi lebih lanjut, lihat Data versions and TTL.

  • Conditional update: Tetapkan kondisi keberadaan baris atau kondisi berdasarkan nilai kolom. Untuk informasi lebih lanjut, lihat Conditional updates.

Tanggapan PutRow

  • Jika berhasil, Tablestore mengembalikan jumlah capacity unit (CU) yang dikonsumsi.

  • Jika gagal, Tablestore mengembalikan kode kesalahan (misalnya, kegagalan validasi parameter, data baris melebihi batas, atau kegagalan pemeriksaan keberadaan baris).

Catatan

Untuk informasi lebih lanjut tentang kode kesalahan, lihat Error codes.

Penanganan kegagalan parsial BatchWriteRow

Ketika beberapa baris gagal dalam permintaan BatchWriteRow, Tablestore tidak melemparkan exception. Sebaliknya, Tablestore mengembalikan BatchWriteRowResponse yang berisi informasi tentang baris-baris yang gagal. Selalu panggil metode isAllSucceed untuk memeriksa apakah semua baris berhasil ditulis.

Jika server mendeteksi parameter tidak valid pada beberapa operasi, server mungkin mengembalikan kesalahan sebelum menjalankan operasi apa pun dalam permintaan tersebut.

BatchWriteRow juga mendukung kondisi per operasi—konfigurasikan kondisi pembaruan secara terpisah untuk setiap sub-operasi PutRow, UpdateRow, atau DeleteRow.

Gunakan Konsol Tablestore

Konsol Tablestore mendukung penyisipan dan pembaruan satu baris data.

  1. Masuk ke Tablestore console.

  2. Pada halaman Overview, temukan instans target dan klik Manage Instance di kolom Actions.

  3. Pada tab Tables di halaman Instance Details, klik nama tabel target.

  4. Pada tab Query Data di halaman Manage Table, sisipkan atau perbarui data.

Sisipkan satu baris

  1. Klik Insert.

  2. Pada kotak dialog Insert, masukkan nilai di kolom Primary Key Value.

  3. Klik ikon image dan konfigurasikan parameter Name, Type, Value, dan Version. Untuk menambahkan beberapa kolom atribut, klik ikon image setiap kali untuk menambahkan kolom dan konfigurasikan parameternya.

  4. Klik OK.

Perbarui satu baris

  1. Pilih baris yang akan diperbarui dan klik Update.

  2. Pada kotak dialog Update, ubah kolom atribut:

    • Tambah kolom: Klik ikon image dan konfigurasikan parameternya.

    • Hapus kolom: Pilih Delete All dari daftar drop-down Actions.

    • Hapus versi tertentu: Pilih Delete dari daftar drop-down Actions dan pilih nomor versi yang akan dihapus.

    • Perbarui nilai: Pilih Update dari daftar drop-down Actions dan ubah nilainya.

  3. Klik OK.

Gunakan CLI Tablestore

Sisipkan baris

Jalankan perintah put. Untuk informasi lebih lanjut, lihat Insert data.

Contoh berikut menyisipkan satu baris dengan kolom kunci primer pertama 86 dan kolom kunci primer kedua 6771. Baris tersebut memiliki dua kolom atribut bertipe STRING: name dan country.

put --pk '["86", 6771]' --attr '[{"c":"name", "v":"redchen"}, {"c":"country", "v":"china"}]'

Perbarui baris

Jalankan perintah update. Untuk informasi lebih lanjut, lihat Update data.

Contoh berikut memperbarui baris dengan kolom kunci primer pertama 86 dan kolom kunci primer kedua 6771. Flag --condition ignore menyisipkan data tanpa mempertimbangkan apakah baris tersebut sudah ada. Jika baris sudah ada, data baru akan menimpa data yang ada.

update --pk '["86", 6771]' --attr '[{"c":"name", "v":"redchen"}, {"c":"country", "v":"china"}]' --condition ignore

Gunakan SDK Tablestore

Tulis data menggunakan salah satu SDK berikut: Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, Tablestore SDK for .NET, atau Tablestore SDK for PHP.

Contoh berikut menggunakan SDK Java.

Sisipkan satu baris

PutRow mendukung nomor versi yang dihasilkan sistem, nomor versi kustom, dan penulisan bersyarat.

Nomor versi yang dihasilkan sistem

Sisipkan satu baris dengan 10 kolom atribut, masing-masing menyimpan satu versi data. Sistem secara otomatis menghasilkan nomor versinya.

private static void putRow(SyncClient client, String pkValue) {
    // Construct the primary key.
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Specify the name of the table.
    RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);

    // Add attribute columns.
    for (int i = 0; i < 10; i++) {
        rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
    }

    client.putRow(new PutRowRequest(rowPutChange));
}

Nomor versi kustom

Sisipkan satu baris dengan 10 kolom atribut, masing-masing menyimpan tiga versi data dengan nomor versi kustom.

private static void putRow(SyncClient client, String pkValue) {
    // Construct the primary key.
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Specify the name of the table.
    RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);

    // Add attribute columns.
    long ts = System.currentTimeMillis();
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 3; j++) {
            rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
        }
    }

    client.putRow(new PutRowRequest(rowPutChange));
}

Kondisi keberadaan baris

Sisipkan satu baris dengan 10 kolom atribut (masing-masing tiga versi) hanya jika baris yang ditentukan tidak ada.

private static void putRow(SyncClient client, String pkValue) {
    // Construct the primary key.
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Specify the name of the table.
    RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);

    // Specify a row existence condition that expects the specified row to not exist.
    rowPutChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));

    // Add attribute columns.
    long ts = System.currentTimeMillis();
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 3; j++) {
            rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
        }
    }

    client.putRow(new PutRowRequest(rowPutChange));
}

Kondisi keberadaan baris dan nilai kolom

Sisipkan satu baris dengan 10 kolom atribut (masing-masing tiga versi) ketika baris tersebut ada dan nilai Col0 lebih besar dari 100.

private static void putRow(SyncClient client, String pkValue) {
    // Construct the primary key.
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Specify the name of the table.
    RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);

    // Specify a row existence condition and a column-based condition that expect the specified row to exist and the value of the Col0 column to be greater than 100.
    Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
    condition.setColumnCondition(new SingleColumnValueCondition("Col0",
            SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
    rowPutChange.setCondition(condition);

    // Add attribute columns.
    long ts = System.currentTimeMillis();
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 3; j++) {
            rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
        }
    }

    client.putRow(new PutRowRequest(rowPutChange));
}

Perbarui satu baris

UpdateRow mendukung pembaruan tanpa syarat maupun pembaruan bersyarat berdasarkan keberadaan baris dan nilai kolom.

Perbarui tanpa syarat

Perbarui beberapa kolom, hapus versi tertentu dari data dalam suatu kolom, dan hapus kolom.

private static void updateRow(SyncClient client, String pkValue) {
    // Construct the primary key.
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Specify the name of the table.
    RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);

    // Update columns.
    for (int i = 0; i < 10; i++) {
        rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
    }

    // Delete a specific version of data from a column.
    rowUpdateChange.deleteColumn("Col10", 1465373223000L);

    // Remove a column.
    rowUpdateChange.deleteColumns("Col11");

    client.updateRow(new UpdateRowRequest(rowUpdateChange));
}

Kondisi keberadaan baris dan nilai kolom

Perbarui baris ketika baris tersebut ada dan nilai Col0 lebih besar dari 100.

private static void updateRow(SyncClient client, String pkValue) {
    // Construct the primary key.
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Specify the name of the table.
    RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);

    // Specify a row existence condition and a column-based condition that expect the specified row to exist and the value of the Col0 column to be greater than 100.
    Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
    condition.setColumnCondition(new SingleColumnValueCondition("Col0",
            SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
    rowUpdateChange.setCondition(condition);

    // Update columns.
    for (int i = 0; i < 10; i++) {
        rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
    }

    // Delete a specific version of data from a column.
    rowUpdateChange.deleteColumn("Col10", 1465373223000L);

    // Remove a column.
    rowUpdateChange.deleteColumns("Col11");

    client.updateRow(new UpdateRowRequest(rowUpdateChange));
}

Tulis beberapa baris sekaligus

Contoh berikut mengirim permintaan BatchWriteRow yang berisi dua operasi PutRow, satu operasi UpdateRow, dan satu operasi DeleteRow.

private static void batchWriteRow(SyncClient client) {
    BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();

    // Construct rowPutChange1.
    PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    pk1Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk1"));
    // Specify the name of the data table.
    RowPutChange rowPutChange1 = new RowPutChange("<TABLE_NAME>", pk1Builder.build());
    // Add columns.
    for (int i = 0; i < 10; i++) {
        rowPutChange1.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
    }
    // Add rowPutChange1 to the code of the batch operation.
    batchWriteRowRequest.addRowChange(rowPutChange1);

    // Construct rowPutChange2.
    PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    pk2Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk2"));
    // Specify the name of the data table.
    RowPutChange rowPutChange2 = new RowPutChange("<TABLE_NAME>", pk2Builder.build());
    // Add columns.
    for (int i = 0; i < 10; i++) {
        rowPutChange2.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
    }
    // Add rowPutChange2 to the code of the batch operation.
    batchWriteRowRequest.addRowChange(rowPutChange2);

    // Construct rowUpdateChange.
    PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    pk3Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk3"));
    // Specify the name of the data table.
    RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", pk3Builder.build());
    // Add columns.
    for (int i = 0; i < 10; i++) {
        rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
    }
    // Remove a column.
    rowUpdateChange.deleteColumns("Col10");
    // Add rowUpdateChange to the code of the batch operation.
    batchWriteRowRequest.addRowChange(rowUpdateChange);

    // Construct rowDeleteChange.
    PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    pk4Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk4"));
    // Specify the name of the data table.
    RowDeleteChange rowDeleteChange = new RowDeleteChange("<TABLE_NAME>", pk4Builder.build());
    // Add rowDeleteChange to the code of the batch operation.
    batchWriteRowRequest.addRowChange(rowDeleteChange);

    BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);

    System.out.println("Whether all operations are successful:" + response.isAllSucceed());
    if (!response.isAllSucceed()) {
        for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
            System.out.println("Failed rows:" + batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
            System.out.println("Cause of failures:" + rowResult.getError());
        }
        /**
         * You can use the createRequestForRetry method to construct another request to retry the operations on failed rows. Only the retry request is constructed here.
         * We recommend that you use the custom retry policy in Tablestore SDKs as the retry method. This feature allows you to retry failed rows after batch operations. After you set the retry policy, you do not need to add retry code to call the operation.
         */
        BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
    }
}

Penagihan

Operasi penulisan dikenai biaya berdasarkan jumlah CU yang dikonsumsi. CU baca dan tulis metered serta CU baca dan tulis reserved dikenai biaya secara terpisah. Tipe instans menentukan jenis CU yang dikonsumsi.

Catatan

Untuk informasi lebih lanjut tentang tipe instans dan CU, lihat Instances dan Read and write throughput.

Perhitungan CU tulis

OperationFormula
PutRowDibulatkan ke atas: (Ukuran semua kolom kunci primer + Ukuran kolom atribut yang disisipkan) / 4 KB
UpdateRowDibulatkan ke atas: (Ukuran semua kolom kunci primer + Ukuran kolom atribut yang diperbarui) / 4 KB. Untuk operasi penghapusan kolom, panjang nama kolom dihitung sebagai ukuran kolom.
DeleteRow (dalam BatchWriteRow)Dibulatkan ke atas: Ukuran semua kolom kunci primer / 4 KB

Perhitungan CU baca

CU baca dikonsumsi hanya ketika parameter condition tidak diatur ke IGNORE.

OperationFormulaKondisi tidak terpenuhi
PutRowDibulatkan ke atas: Ukuran semua kolom kunci primer / 4 KBOperasi gagal. Mengonsumsi 1 CU tulis dan 1 CU baca.
UpdateRowDibulatkan ke atas: Ukuran semua kolom kunci primer / 4 KBOperasi gagal. Mengonsumsi 1 CU tulis dan 1 CU baca.
DeleteRow (dalam BatchWriteRow)Dibulatkan ke atas: Ukuran semua kolom kunci primer / 4 KBOperasi gagal. Mengonsumsi 1 CU tulis dan 1 CU baca.