Halaman ini menjelaskan cara menyisipkan, memperbarui, dan menghapus data Spanner menggunakan pernyataan Bahasa Pengolahan Data (DML). Anda dapat menjalankan pernyataan DML menggunakan library klien, konsolGoogle Cloud , dan alat command line gcloud. Anda dapat menjalankan pernyataan DML yang Dipartisi menggunakan library klien dan alat command line gcloud.
Untuk referensi sintaksis DML lengkap, lihat Sintaksis Bahasa Pengolahan Data untuk database dialek GoogleSQL atau Bahasa pengolahan data PostgreSQL untuk database dialek PostgreSQL
Menggunakan DML
DML mendukung pernyataan INSERT, UPDATE, dan DELETE di
konsolGoogle Cloud , Google Cloud CLI, dan library klien.
Mengunci
Anda menjalankan pernyataan DML di dalam transaksi baca-tulis. Saat membaca data, Spanner
mendapatkan kunci baca bersama pada sebagian kecil rentang baris yang Anda baca. Secara khusus, kunci ini hanya diperoleh di kolom yang Anda akses. Kunci dapat mencakup data yang tidak memenuhi kondisi filter klausa WHERE.
Saat mengubah data menggunakan pernyataan DML, Spanner akan mendapatkan kunci eksklusif pada data tertentu yang Anda ubah. Selain itu, fungsi ini memperoleh kunci bersama dengan cara yang sama seperti saat Anda membaca data. Jika permintaan Anda mencakup rentang baris yang besar, atau seluruh tabel, kunci bersama dapat mencegah transaksi lain berjalan secara paralel.
Untuk mengubah data seefisien mungkin, gunakan klausa WHERE yang memungkinkan
Spanner hanya membaca baris yang diperlukan. Anda dapat mencapai tujuan ini dengan filter pada
kunci utama, atau pada kunci indeks sekunder. Klausul WHERE membatasi cakupan
kunci bersama dan memungkinkan Spanner memproses update secara lebih efisien.
Misalnya, anggaplah salah satu musisi dalam tabel Singers mengubah nama depannya, dan Anda perlu memperbarui nama tersebut dalam database Anda. Anda dapat menjalankan pernyataan DML
berikut, tetapi hal ini akan memaksa Spanner memindai seluruh tabel dan mendapatkan kunci bersama yang
mencakup seluruh tabel. Akibatnya, Spanner harus membaca lebih banyak data daripada yang diperlukan, dan
transaksi serentak tidak dapat mengubah data secara paralel:
-- ANTI-PATTERN: SENDING AN UPDATE WITHOUT THE PRIMARY KEY COLUMN
-- IN THE WHERE CLAUSE
UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards";
Untuk membuat pembaruan lebih efisien, sertakan kolom SingerId dalam
klausa WHERE. Kolom SingerId adalah satu-satunya kolom kunci utama untuk
tabel Singers:
-- ANTI-PATTERN: SENDING AN UPDATE THAT MUST SCAN THE ENTIRE TABLE
UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards"
Jika tidak ada indeks pada FirstName atau LastName, Anda harus
memindai seluruh tabel untuk menemukan penyanyi target. Jika Anda tidak ingin menambahkan indeks sekunder
untuk membuat pembaruan lebih efisien, sertakan kolom SingerId
dalam klausa WHERE.
Kolom SingerId adalah satu-satunya kolom kunci utama untuk tabel
Singers. Untuk menemukannya, jalankan SELECT dalam transaksi hanya baca terpisah sebelum transaksi update:
SELECT SingerId
FROM Singers
WHERE FirstName = "Marc" AND LastName = "Richards"
-- Recommended: Including a seekable filter in the where clause
UPDATE Singers SET FirstName = "Marcel"
WHERE SingerId = 1;
Serentak
Spanner akan mengeksekusi semua pernyataan SQL (SELECT,
INSERT, UPDATE, dan DELETE) secara berurutan dalam transaksi. Tidak dijalankan secara bersamaan. Satu-satunya pengecualian adalah Spanner dapat menjalankan
beberapa pernyataan SELECT secara bersamaan, karena merupakan operasi hanya baca.
Batas transaksi
Transaksi yang mencakup pernyataan DML memiliki batas yang sama dengan transaksi lainnya. Jika Anda memiliki perubahan skala besar, pertimbangkan untuk menggunakan DML yang Dipartisi.
Batas mutasi diterapkan secara berbeda, bergantung pada apakah Anda menggunakan pernyataan DML atau Mutation API:
Pernyataan DML: Batas 80.000 mutasi (termasuk indeks) diterapkan per pernyataan dan direset di akhir setiap pernyataan. Jika satu pernyataan DML melebihi batas ini, pernyataan tersebut akan gagal dan menampilkan error
BadUsage. Namun, transaksi dapat melampaui 80.000 mutasi dengan berisi beberapa pernyataan DML, asalkan setiap pernyataan individual tetap berada di bawah batas tersebut.Mutation API: Mutasi menggunakan Mutation API hanya dapat diterapkan sebagai bagian dari operasi commit, bukan di tengah transaksi, tidak seperti DML. Batas 80.000 mutasi (termasuk indeks) bersifat kumulatif untuk semua mutasi dalam commit. Jika transaksi menggunakan mutasi (baik sendiri maupun digabungkan dengan DML), batas kumulatif ini berlaku untuk semua mutasi dalam commit.
Ukuran transaksi: Semua transaksi tunduk pada batas ukuran 100 MiB. Untuk DML, jika pernyataan dalam transaksi menghasilkan transaksi yang lebih besar dari 100 MiB, pernyataan yang melampaui batas akan gagal dengan error
BadUsage. Mutasi yang dilakukan menggunakan DML tidak dihitung dalam batas 80.000 di seluruh pernyataan, tetapi dihitung dalam batas ukuran transaksi ini saat dilakukan.
Menjalankan pernyataan di konsol Google Cloud
Gunakan langkah-langkah berikut untuk menjalankan pernyataan DML di konsol Google Cloud .
Buka halaman Instances Spanner.
Pilih project Anda di menu drop-down di toolbar.
Klik nama instance yang berisi database Anda untuk membuka halaman Detail instance.
Di tab Overview, klik nama database Anda. Halaman Database details akan muncul.
Klik Spanner Studio.
Masukkan pernyataan DML. Misalnya, pernyataan berikut menambahkan baris baru ke tabel
Singers.INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')Klik Run query. Konsol Google Cloud menampilkan hasilnya.
Menjalankan pernyataan dengan Google Cloud CLI
Untuk menjalankan pernyataan DML, gunakan perintah gcloud spanner databases execute-sql. Contoh berikut menambahkan baris baru ke tabel Singers.
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')"
Mengubah data menggunakan library klien
Untuk menjalankan pernyataan DML menggunakan library klien:
- Buat transaksi baca-tulis.
- Panggil metode library klien untuk eksekusi DML dan teruskan pernyataan DML.
- Gunakan nilai hasil metode eksekusi DML untuk mendapatkan jumlah baris yang disisipkan, diperbarui, atau dihapus.
Contoh kode berikut menyisipkan baris baru ke dalam tabel Singers.
C++
Anda menggunakan fungsi ExecuteDml() untuk menjalankan pernyataan DML.
C#
Anda menggunakan metode ExecuteNonQueryAsync() untuk mengeksekusi pernyataan DML.
Go
Anda menggunakan metode Update() untuk mengeksekusi pernyataan DML.
Java
Anda menggunakan metode executeUpdate() untuk mengeksekusi pernyataan DML.
Node.js
Anda menggunakan metode runUpdate() untuk mengeksekusi pernyataan DML.
PHP
Anda menggunakan metode executeUpdate() untuk mengeksekusi pernyataan DML.
Python
Anda menggunakan metode execute_update() untuk mengeksekusi pernyataan DML.
Ruby
Anda menggunakan metode execute_update() untuk mengeksekusi pernyataan DML.
Contoh kode berikut mengupdate kolom MarketingBudget dari tabel Albums
berdasarkan klausa WHERE.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Contoh kode berikut menghapus semua baris dalam tabel Singers dengan
kolom FirstName adalah Alice.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Contoh berikut, hanya untuk database dialek GoogleSQL, menggunakan
STRUCT dengan parameter terikat
untuk memperbarui LastName di baris yang difilter menurut FirstName dan LastName.