Pernyataan UPDATE memperbarui data di LindormTable. Topik ini menjelaskan sintaksis UPDATE dan catatan penggunaannya.
Mesin dan versi yang berlaku
Pernyataan
UPDATEhanya berlaku untuk LindormTable.Pernyataan
UPDATEdidukung di LindormTable 2.3.2 dan versi setelahnya. Untuk melihat atau melakukan upgrade versi saat ini, lihat Panduan Versi LindormTable dan Lakukan peningkatan versi minor.
Sintaksis
update_statement ::= UPDATE [hint_clause] table_identifier
SET column_identifier = value (',' column_identifier = value ) *
WHERE where_clause
where_clause ::= relation ( AND|OR relation )*
relation ::= column_name operator term
| '(' column_name ( ',' column_name )* ')' operator tuple_literal
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | IS NOT? NULL | LIKEBatasan
Anda tidak dapat memperbarui primary key. Primary key merupakan pengidentifikasi unik suatu baris. Memperbarui primary key sama dengan menyisipkan baris baru. Untuk menyisipkan baris baru, gunakan pernyataan
UPSERT.Atomisitas multi-baris tidak dijamin. Jika terjadi error selama pembaruan batch, beberapa baris mungkin berhasil diperbarui sementara yang lain gagal. Jika tidak terjadi error, semua baris akan berhasil diperbarui. Contohnya, pembaruan rentang seperti
UPDATE sensor SET c1 = 2, c2=4,c4 =6 WHERE p1 = 1;.Idempotensi tidak dijamin. Pernyataan
UPDATEtidak menjamin idempotensi. Untuk operasi seperti akumulasi, jika terjadi error,UPDATEmungkin mencoba ulang operasi tersebut, yang dapat menghasilkan hasil yang salah.SQL idempoten:
UPDATE sensor SET c1 = 2 WHERE p1 = 1;. Pernyataan ini dapat dijalankan beberapa kali tanpa mengubah hasil setelah penerapan awal.SQL non-idempoten:
UPDATE sensor SET c1 = c1 + 1 WHERE p1 = 1;. Mencoba ulang pernyataan ini dapat menghasilkan hasil yang tidak akurat karena nilainya bertambah berkali-kali.
Transaksi lintas baris tidak didukung. Jika Anda menggunakan satu perintah
UPDATEuntuk memodifikasi beberapa baris dan terjadi error, beberapa baris mungkin berhasil diperbarui sementara yang lain gagal.CatatanSaat menggunakan ekspresi untuk memperbarui bidang non-primary key, Anda hanya dapat memperbarui satu baris dan harus menentukan semua primary key. Hal ini membantu menemukan baris yang akan diperbarui secara cepat. Untuk contoh, lihat Tingkatkan nilai kolom.
Jika pembaruan skalar, seperti pembaruan dengan klausa
c1 =1, gagal sebagian, coba ulang operasi pembaruan tersebut.
Contoh
Asumsikan Anda memiliki skema tabel dan data berikut:
-- Buat tabel bernama sensor.
CREATE TABLE sensor (
p1 INTEGER NOT NULL,
c1 INTEGER,
c2 VARCHAR,
c3 VARCHAR,
PRIMARY KEY(p1)
);
-- Sisipkan satu baris data.
UPSERT INTO sensor(p1, c1, c2, c3) VALUES(1,1,'a','a');Data dalam tabel ditampilkan sebagai berikut:
+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1 | 1 | a | a |
+----+----+----+----+Perbarui data berdasarkan primary key
UPDATE sensor SET c2='b' WHERE p1=1;Verifikasi hasil
Jalankan pernyataan SELECT * FROM sensor; untuk memverifikasi bahwa data telah diperbarui. Hasil yang diharapkan adalah:
+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1 | 1 | b | a |
+----+----+----+----+Perbarui data berdasarkan non-primary key
Versi LindormTable harus 2.8.2.29 atau lebih baru. Anda dapat melihat versi saat ini dan melakukan upgrade versi minor ke 2.8.2.29 atau lebih baru di Konsol.
Fitur ini berada dalam pratinjau publik. Untuk menggunakan fitur ini, hubungi dukungan teknis Lindorm. ID DingTalk-nya adalah s0s3eg3.
UPDATE sensor SET c3='b' WHERE c1=1;Verifikasi hasil
Jalankan pernyataan SELECT * FROM sensor; untuk memverifikasi bahwa data telah diperbarui. Hasil yang diharapkan adalah:
+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1 | 1 | b | b |
+----+----+----+----+Tingkatkan nilai kolom
Versi LindormTable harus 2.7.6 atau lebih baru. Anda dapat melihat versi saat ini dan memperbarui versi minor ke 2.7.6 atau lebih baru di Konsol.
Fitur ini berada dalam pratinjau publik. Untuk menggunakan fitur ini, hubungi dukungan teknis Lindorm. ID DingTalk-nya adalah s0s3eg3.
UPDATE sensor SET c1 = c1 + 1 WHERE p1 = 1;Verifikasi hasil
Jalankan pernyataan SELECT * FROM sensor; untuk memverifikasi bahwa data telah diperbarui. Hasil yang diharapkan adalah:
+------+------+------+------+
| p1 | c1 | c2 | c3 |
+------+------+------+------+
| 1 | 2 | b | b |
+------+------+------+------+FAQ
Q1: Setelah pembaruan data selesai, mengapa jumlah baris yang terpengaruh (AFFECTED ROWS) tidak sesuai harapan?
A1: Data di tabel indeks pencarian dan tabel utama tidak konsisten kuat, dan sinkronisasi data mungkin mengalami latensi. Jika Anda membuat indeks pencarian untuk tabel utama dan kondisi pembaruan mengenai kolom indeks, pembaruan tersebut mungkin gagal karena latensi sinkronisasi data (yaitu,
AFFECTED ROWS:tidak sesuai ekspektasi). Anda dapat menunggu hingga seluruh sinkronisasi data selesai, lalu menjalankan ulang operasi pembaruan. Untuk informasi tentang latensi indeks pencarian, lihat FAQ.Q2: Apa penyebab error timeout selama pembaruan batch?
A2: Jangan memperbarui lebih dari 10.000 baris dalam satu operasi. Untuk pembaruan batch besar, tingkatkan periode timeout dengan menambahkan parameter HINT _l_operation_timeout_ ke pernyataan UPDATE. Contohnya:
UPDATE /*+ _l_operation_timeout_(30000) */ table1 SET a=1 WHERE b=2;. Untuk informasi lebih lanjut tentang parameter _l_operation_timeout_, lihat deskripsi parameter hintOption. Jika error timeout tetap terjadi setelah menambahkan HINT, pertimbangkan untuk menggunakan Mesin komputasi Lindorm untuk pembaruan batch.