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 |
|
Pernyataan kueri | Pernyataan |
Beberapa sintaksis DML | Klausa seperti |
Prasyarat
Anda telah membuat tabel non-transaksional.
Anda telah membuat pemetaan SQL untuk tabel tersebut menggunakan pernyataan
CREATE TABLE.
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
Masuk ke Konsol Tablestore.
Pada halaman Overview, klik nama Instance Name.
Pada halaman Instances, klik tab Query by Executing SQL Statement.
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.
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.
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.SQLQueryConsumedPernyataan 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
OTSParameterInvaliddan pesan kesalahan yang berisiDuplicate entry for key 'PRIMARY'. Data yang sudah ada tidak ditimpa.Penyisipan batch lintas partisi: Semua baris dalam pernyataan
INSERTbatch harus memiliki kunci partisi yang sama.Batas ukuran batch: Pernyataan
INSERTbatch yang berisi lebih dari 200 baris akan ditolak.Baris yang terpengaruh:
INSERTsatu 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
OTSParameterInvalidatauOTSUnsupportOperationakan dikembalikan:Klausa
WHEREtidak mencakup kunci primer lengkap.Klausa
WHEREmenggunakan kondisi pada kolom non-kunci primer.Klausa WHERE menggunakan kueri rentang (seperti
>,<, atauBETWEEN).Klausa WHERE menggunakan kondisi non-kesetaraan seperti
IN,LIKE,OR, atau!=.Klausa
WHEREmencakup kondisi pada kolom atribut selain kunci primer lengkap.
Tidak dapat memodifikasi kolom kunci primer: Klausul
SETtidak dapat digunakan untuk mengubah nilai kolom kunci primer.Baris target tidak ada: Operasi
UPDATEpada 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
WHEREyang hilang, kondisi pada kolom kunci primer parsial atau non-kunci primer, kondisi rentang, operatorIN,LIKE, atauOR, atau kondisi pada kolom atribut tambahan tidak didukung.Baris target tidak ada: Operasi
DELETEpada 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 |
| Diperlukan kunci primer lengkap. |
Klausa |
| Hanya kondisi kesetaraan pada kolom kunci primer yang didukung. |
Klausa |
| Diperlukan kunci primer komposit lengkap. |
Kondisi rentang ( |
| Hanya kondisi kesetaraan yang didukung. |
Klausa |
| Hanya pencocokan kesetaraan nilai tunggal yang didukung. |
Kondisi |
| Pencocokan fuzzy tidak didukung. |
Kondisi |
| Operator logika |
Kondisi |
| Kondisi tidak sama tidak didukung. |
Kondisi |
| Pemeriksaan nilai null pada kolom atribut tidak didukung. |
Kondisi gabungan kolom kunci primer dan kolom atribut |
| Hanya kondisi kesetaraan pada kunci primer yang didukung. |
|
| Pengurutan tidak didukung. |
|
| Membatasi jumlah baris tidak didukung. |
Opsi |
| Mengabaikan kesalahan tidak didukung. |
Pengaturan prioritas (misalnya, |
| Tidak didukung. |
Operasi multi-tabel |
| Operasi lintas tabel tidak didukung. |
Spesifikasi nama partisi |
| Tidak didukung. |
Petunjuk indeks |
| Petunjuk indeks tidak didukung. |
Sintaksis |
|
|
|
| Menyisipkan dari hasil kueri tidak didukung. |
|
| Tidak didukung untuk tabel non-transaksional. |
|
| Tidak didukung untuk tabel non-transaksional. |
|
| Tidak didukung. |
Memperbarui kolom kunci primer |
| Klausul |
Jumlah baris dalam |
| Maksimal 200 baris per batch dalam kunci partisi yang sama. |
Batasan tipe data
Jenis | Kunci primer | Batasan |
| Ya | Atribut |
| Ya | Dapat digunakan sebagai kolom kunci primer. |
| Ya | Dapat digunakan sebagai kolom kunci primer. |
| Tidak | Tidak dapat digunakan sebagai kunci primer. |
| Tidak | Tidak dapat digunakan sebagai kunci primer. Hanya dapat digunakan sebagai kolom atribut. |
| Tidak | Tidak dapat digunakan sebagai kunci primer. |
| 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,
INSERTdengan konflik kunci primer,UPDATEatauDELETEpada baris yang tidak ada, atauUPDATEdi mana nilai kolom tidak berubah): Hanya mengonsumsi CU baca.