All Products
Search
Document Center

Tablestore:Operasi DML

Last Updated:Jun 09, 2026

Anda dapat menggunakan pernyataan SQL INSERT, UPDATE, dan DELETE untuk menulis, memperbarui, dan menghapus data di tabel non-transaksional Tablestore.

Ruang Lingkup

Item

Deskripsi

Jenis tabel

Hanya tabel non-transaksional (tabel yang dibuat tanpa fitur transaksi diaktifkan).

Pernyataan DML yang didukung

INSERT, UPDATE, DELETE

Pernyataan kueri

Pernyataan SELECT dan SHOW tidak tunduk pada batasan DML. Untuk informasi selengkapnya, lihat dokumentasi kueri SQL.

Beberapa sintaksis DML

Klausa seperti INSERT IGNORE, ON DUPLICATE KEY UPDATE, dan pernyataan REPLACE hanya didukung untuk tabel transaksional.

Prasyarat

  • Anda telah membuat tabel non-transaksional.

  • Anda telah membuat pemetaan SQL untuk tabel tersebut menggunakan pernyataan CREATE TABLE.

Catatan

Untuk menjalankan operasi DML sebagai pengguna RAM, Anda harus memberikan izin SQL_DML kepada pengguna tersebut. Untuk informasi selengkapnya, lihat Kebijakan RAM Kustom.

Penggunaan

Anda dapat menjalankan operasi DML pada tabel non-transaksional menggunakan Konsol Tablestore atau SDK. Bagian ini menjelaskan cara menggunakan masing-masing metode tersebut.

Konsol

  1. Masuk ke Konsol Tablestore.

  2. Pada halaman Overview, klik nama Instance Name.

  3. Pada halaman Instances, klik tab Query by Executing SQL Statement.

  4. Di editor SQL, masukkan pernyataan DML dan klik Execute SQL Statement.

Contoh: Masukkan satu baris.

INSERT INTO my_table VALUES (1, 'value1', 100);

SDK

Java

Gunakan metode SyncClient.sqlQuery() dari SDK Java untuk menjalankan pernyataan DML. Ambil jumlah baris yang terpengaruh (getAffectedRows()) dan CU baca/tulis yang dikonsumsi (getConsumedCapacity()) dari SQLQueryResponse.

Catatan

Anda harus menggunakan versi SDK 5.17.11 atau yang lebih baru.

SQLQueryRequest request = new SQLQueryRequest("INSERT INTO my_table VALUES (1, 'value1', 100)");
SQLQueryResponse response = client.sqlQuery(request);
long affectedRows = response.getAffectedRows();
Map<String, ConsumedCapacity> consumedCapacity = response.getConsumedCapacity();

Go

Jalankan pernyataan DML dengan menggunakan metode TableStoreClient.SQLQuery() dari SDK Go. Dapatkan jumlah baris yang terpengaruh (AffectedRows) dan CU baca/tulis yang dikonsumsi (SQLQueryConsumed) dari SQLQueryResponse.

Catatan

Anda harus menggunakan versi SDK v1.9.2 atau yang lebih baru.

request := &tablestore.SQLQueryRequest{Query: "INSERT INTO my_table VALUES (1, 1, 100, 'hello')"}
response, err := client.SQLQuery(request)
if err != nil {
    log.Fatal(err)
}
affectedRows := response.AffectedRows
consumed := response.SQLQueryConsumed

Pernyataan INSERT

Untuk tabel non-transaksional, pernyataan INSERT mendukung penyisipan satu baris dan penyisipan batch multi-baris atomik dalam kunci partisi yang sama. Jika terjadi konflik kunci primer, operasi akan mengembalikan kesalahan dan tidak menimpa data yang sudah ada.

Penyisipan satu baris

INSERT INTO user_table VALUES (1, 'value1', 100);

Penyisipan batch dalam satu partisi

Beberapa baris yang memiliki kunci partisi yang sama dapat disisipkan secara atomik dalam satu batch hingga maksimal 200 baris. Misalnya, asumsikan struktur tabel adalah user_table(pk1 BIGINT, pk2 VARCHAR(1024), value BIGINT), dengan pk1 sebagai kunci partisi. Dua baris yang keduanya memiliki kunci partisi pk1 bernilai 1 berada dalam partisi yang sama dan oleh karena itu dapat disisipkan secara atomik dalam satu batch.

INSERT INTO user_table VALUES (1, 'attr1', 100), (1, 'attr2', 200);

Catatan

  • Konflik kunci primer: Menyisipkan baris dengan kunci primer yang sudah ada mengembalikan kesalahan dengan kode kesalahan OTSParameterInvalid dan pesan kesalahan yang berisi Duplicate entry for key 'PRIMARY'. Data yang sudah ada tidak ditimpa.

  • Penyisipan batch lintas partisi: Semua baris dalam pernyataan INSERT batch harus memiliki kunci partisi yang sama.

  • Batas ukuran batch: Pernyataan INSERT batch yang berisi lebih dari 200 baris akan ditolak.

  • Baris yang terpengaruh: INSERT satu baris yang berhasil mengembalikan nilai 1. Penyisipan batch N baris yang berhasil mengembalikan nilai N. Jika terjadi konflik kunci primer, operasi mengembalikan kesalahan alih-alih jumlah baris yang terpengaruh.

Pernyataan UPDATE

Untuk tabel non-transaksional, pernyataan UPDATE hanya mendukung pembaruan satu baris yang ditentukan oleh kondisi kesetaraan pada kunci primer lengkap. Untuk kunci primer komposit, urutan kolom dalam klausa WHERE tidak perlu sesuai dengan urutan kolom yang didefinisikan dalam kunci.

Pembaruan dengan nilai konstan

Anda dapat memperbarui satu atau beberapa kolom sekaligus.

-- Perbarui satu kolom
UPDATE user_table SET attr_col = 999 WHERE pk_col = 1;

-- Perbarui beberapa kolom
UPDATE user_table SET c1 = 10, c2 = 20, c3 = 'updated' WHERE id = 1;

-- Perbarui baris dengan kunci primer komposit. Urutan kolom dalam klausa WHERE boleh berbeda dari definisi kunci.
UPDATE user_table SET value = 999 WHERE pk2 = 2 AND pk1 = 1;

Increment dan decrement atomik

Anda dapat melakukan increment atau decrement nilai kolom atribut bertipe BIGINT secara atomik. Ini berguna untuk skenario seperti pencacah (counter). Operasi ini hanya didukung untuk kolom atribut integer, bukan untuk tipe lain seperti DOUBLE, BOOL, atau VARCHAR.

-- Increment sebesar 1
UPDATE user_table SET counter = counter + 1 WHERE id = 1;

-- Increment dengan nilai tertentu
UPDATE user_table SET counter = counter + 10 WHERE id = 1;

-- Decrement
UPDATE user_table SET counter = counter - 5 WHERE id = 1;

Atur kolom atribut menjadi NULL

Mengatur kolom atribut menjadi NULL secara efektif menghapusnya; sistem menghapus kolom tersebut dari baris alih-alih menyimpan nilai NULL.

UPDATE user_table SET attr_col = NULL WHERE pk_col = 1;

Catatan

  • Klausa WHERE harus menentukan kondisi kesetaraan untuk kunci primer lengkap: Kasus-kasus berikut tidak didukung, dan kesalahan OTSParameterInvalid atau OTSUnsupportOperation akan dikembalikan:

    • Klausa WHERE tidak mencakup kunci primer lengkap.

    • Klausa WHERE menggunakan kondisi pada kolom non-kunci primer.

    • Klausa WHERE menggunakan kueri rentang (seperti >, <, atau BETWEEN).

    • Klausa WHERE menggunakan kondisi non-kesetaraan seperti IN, LIKE, OR, atau !=.

    • Klausa WHERE mencakup kondisi pada kolom atribut selain kunci primer lengkap.

  • Tidak dapat memodifikasi kolom kunci primer: Klausul SET tidak dapat digunakan untuk mengubah nilai kolom kunci primer.

  • Baris target tidak ada: Operasi UPDATE pada baris yang tidak ada selesai secara diam-diam dengan 0 baris terpengaruh. Tidak ada kesalahan yang dikembalikan.

Pernyataan DELETE

Untuk tabel non-transaksional, pernyataan DELETE hanya mendukung penghapusan satu baris yang ditentukan oleh kondisi kesetaraan pada kunci primer lengkap. Untuk kunci primer komposit, urutan kolom dalam klausa WHERE tidak perlu sesuai dengan urutan kolom yang didefinisikan dalam kunci.

-- Hapus dengan kunci primer tunggal
DELETE FROM user_table WHERE pk_col = 1;

-- Hapus dengan kunci primer string
DELETE FROM user_table WHERE id = 'abc';

-- Hapus dengan kunci primer komposit
DELETE FROM user_table WHERE pk1 = 1 AND pk2 = 1;

-- Hapus dengan kunci primer komposit di mana urutan kolom dalam klausa WHERE berbeda dari definisi kunci.
DELETE FROM user_table WHERE pk2 = 2 AND pk1 = 1;

Catatan

  • Klausa WHERE harus berupa kondisi kesetaraan pada kunci primer lengkap: Batasan ini sama dengan pernyataan UPDATE. Klausa WHERE yang hilang, kondisi pada kolom kunci primer parsial atau non-kunci primer, kondisi rentang, operator IN, LIKE, atau OR, atau kondisi pada kolom atribut tambahan tidak didukung.

  • Baris target tidak ada: Operasi DELETE pada baris yang tidak ada selesai secara diam-diam dengan 0 baris terpengaruh. Tidak ada kesalahan yang dikembalikan.

Batasan

Batasan sintaksis SQL

Operasi DML pada tabel non-transaksional tidak mendukung sintaksis SQL berikut:

Batasan

Operasi

Deskripsi

Tidak ada klausa WHERE

UPDATE, DELETE

Diperlukan kunci primer lengkap.

Klausa WHERE dengan kolom non-kunci primer

UPDATE, DELETE

Hanya kondisi kesetaraan pada kolom kunci primer yang didukung.

Klausa WHERE dengan kunci primer parsial

UPDATE, DELETE

Diperlukan kunci primer komposit lengkap.

Kondisi rentang (>, <=, BETWEEN)

UPDATE, DELETE

Hanya kondisi kesetaraan yang didukung.

Klausa IN (beberapa nilai)

UPDATE, DELETE

Hanya pencocokan kesetaraan nilai tunggal yang didukung.

Kondisi LIKE

UPDATE, DELETE

Pencocokan fuzzy tidak didukung.

Kondisi OR

UPDATE, DELETE

Operator logika OR tidak didukung.

Kondisi !=

UPDATE, DELETE

Kondisi tidak sama tidak didukung.

Kondisi IS NULL (kolom atribut)

UPDATE, DELETE

Pemeriksaan nilai null pada kolom atribut tidak didukung.

Kondisi gabungan kolom kunci primer dan kolom atribut

UPDATE, DELETE

Hanya kondisi kesetaraan pada kunci primer yang didukung.

ORDER BY

UPDATE, DELETE

Pengurutan tidak didukung.

LIMIT

UPDATE, DELETE

Membatasi jumlah baris tidak didukung.

Opsi IGNORE

UPDATE, DELETE

Mengabaikan kesalahan tidak didukung.

Pengaturan prioritas (misalnya, HIGH_PRIORITY)

INSERT, UPDATE, DELETE

Tidak didukung.

Operasi multi-tabel

UPDATE, DELETE

Operasi lintas tabel tidak didukung.

Spesifikasi nama partisi

INSERT, UPDATE, DELETE

Tidak didukung.

Petunjuk indeks

UPDATE, DELETE

Petunjuk indeks tidak didukung.

Sintaksis INSERT SET

INSERT

INSERT INTO t SET col=val tidak didukung.

INSERT ... SELECT

INSERT

Menyisipkan dari hasil kueri tidak didukung.

INSERT IGNORE

INSERT

Tidak didukung untuk tabel non-transaksional.

ON DUPLICATE KEY UPDATE

INSERT

Tidak didukung untuk tabel non-transaksional.

REPLACE

INSERT

Tidak didukung.

Memperbarui kolom kunci primer

UPDATE

Klausul SET tidak dapat memodifikasi kolom kunci primer.

Jumlah baris dalam INSERT batch

INSERT

Maksimal 200 baris per batch dalam kunci partisi yang sama.

Batasan tipe data

Jenis

Kunci primer

Batasan

BIGINT

Ya

Atribut UNSIGNED tidak didukung. Rentang nilai yang valid untuk kunci primer adalah -9223372036854775808 hingga 9223372036854775806 (yaitu, [-2^63, 2^63 - 2], karena Long.MAX_VALUE merupakan nilai sistem yang dicadangkan dan tidak dapat digunakan).

VARCHAR

Ya

Dapat digunakan sebagai kolom kunci primer.

VARBINARY

Ya

Dapat digunakan sebagai kolom kunci primer.

DOUBLE

Tidak

Tidak dapat digunakan sebagai kunci primer.

MEDIUMBLOB

Tidak

Tidak dapat digunakan sebagai kunci primer. Hanya dapat digunakan sebagai kolom atribut.

MEDIUMTEXT

Tidak

Tidak dapat digunakan sebagai kunci primer.

BOOL / TINYINT(1)

Tidak

Panjang harus 1. Tidak dapat digunakan sebagai kunci primer.

Opsi dan kendala kolom

Saat menggunakan CREATE TABLE, hanya opsi kolom berikut yang didukung: PRIMARY KEY, NOT NULL, NULL, DEFAULT VALUE, dan ON UPDATE.

Hanya kendala PRIMARY KEY yang didukung.

Batasan jenis tabel khusus

Tabel berindeks pencarian dan tabel alias tidak mendukung operasi DML apa pun (INSERT, UPDATE, DELETE).

Penagihan

Untuk tabel non-transaksional, INSERT, UPDATE, dan DELETE semuanya merupakan operasi atomik satu baris. Sebelum menulis data, sistem memvalidasi baris target (misalnya, untuk memeriksa apakah baris tersebut ada atau apakah nilai kolom telah berubah). Proses validasi ini mengonsumsi CU baca.

  • Operasi yang menghasilkan penulisan: Mengonsumsi CU baca dan tulis.

  • Operasi yang tidak menghasilkan penulisan (misalnya, INSERT dengan konflik kunci primer, UPDATE atau DELETE pada baris yang tidak ada, atau UPDATE di mana nilai kolom tidak berubah): Hanya mengonsumsi CU baca.