Questa pagina descrive come inserire, aggiornare ed eliminare i dati di Spanner utilizzando le istruzioni Data Manipulation Language (DML). Puoi eseguire istruzioni DML utilizzando le librerie client, la consoleGoogle Cloud e Google Cloud CLI. Puoi eseguire istruzioni DML partizionato utilizzando le librerie client e gcloud CLI.
Per il riferimento completo alla sintassi DML, consulta Sintassi del linguaggio di manipolazione dei dati per i database con dialetto GoogleSQL o Linguaggio di manipolazione dei dati PostgreSQL per i database con dialetto PostgreSQL
Utilizza DML
DML supporta le istruzioni INSERT, UPDATE e DELETE nella consoleGoogle Cloud , in gcloud CLI e nelle librerie client.
Blocco in corso…
Le istruzioni DML vengono eseguite all'interno di transazioni di lettura/scrittura. Quando Spanner legge i dati, acquisisce blocchi di lettura condivisi su porzioni limitate degli intervalli di righe che leggi. In particolare, acquisisce questi blocchi solo sulle colonne a cui accedi. I blocchi possono includere dati che non soddisfano la condizione di filtro della clausola WHERE.
Quando Spanner modifica i dati utilizzando istruzioni DML, acquisisce blocchi esclusivi sui dati specifici che stai modificando. Inoltre, acquisisce blocchi condivisi nello stesso modo in cui vengono acquisiti quando leggi i dati. Se la richiesta include intervalli di righe di grandi dimensioni o un'intera tabella, i blocchi condivisi potrebbero impedire l'avanzamento di altre transazioni in parallelo.
Per modificare i dati nel modo più efficiente possibile, utilizza una clausola WHERE che consenta a Spanner di leggere solo le righe necessarie. Puoi raggiungere questo obiettivo con un filtro sulla chiave primaria o sulla chiave di un indice secondario. La clausola WHERE limita l'ambito dei blocchi condivisi e consente a Spanner di elaborare l'aggiornamento in modo più efficiente.
Ad esempio, supponiamo che uno dei musicisti nella tabella Singers cambi il proprio nome e che tu debba aggiornare il nome nel database. Puoi eseguire la seguente istruzione DML, ma questa forza Spanner a scansionare l'intera tabella e acquisisce blocchi condivisi che coprono l'intera tabella. Di conseguenza, Spanner deve leggere più dati del necessario e le transazioni simultanee non possono modificare i dati in parallelo:
-- 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";
Per rendere l'aggiornamento più efficiente, includi la colonna SingerId nella clausola WHERE. La colonna SingerId è l'unica colonna della chiave primaria per la tabella Singers:
-- ANTI-PATTERN: SENDING AN UPDATE THAT MUST SCAN THE ENTIRE TABLE
UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards"
Se non è presente un indice su FirstName o LastName, devi eseguire la scansione dell'intera tabella per trovare i cantanti target. Se non vuoi aggiungere un indice secondario per rendere l'aggiornamento più efficiente, includi la colonna SingerId nella clausola WHERE.
La colonna SingerId è l'unica colonna di chiave primaria per la tabella Singers. Per trovarlo, esegui SELECT in una transazione di sola lettura separata prima della transazione di aggiornamento:
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;
Concorrenza
Spanner esegue in sequenza tutte le istruzioni SQL (SELECT,
INSERT, UPDATE e DELETE) all'interno di una transazione. Non vengono eseguite contemporaneamente. L'unica eccezione è che Spanner potrebbe eseguire più istruzioni SELECT contemporaneamente, perché si tratta di operazioni di sola lettura.
Limiti transazioni
Una transazione che include istruzioni DML ha gli stessi limiti di qualsiasi altra transazione. Se devi apportare modifiche su larga scala, valuta la possibilità di utilizzare il DML partizionato.
Il limite di mutazioni viene applicato in modo diverso a seconda che utilizzi istruzioni DML o l'API Mutation:
Istruzioni DML: il limite di 80.000 mutazioni (inclusi gli indici) viene applicato per istruzione e viene reimpostato alla fine di ogni istruzione. Se una singola istruzione DML supera questo limite, non va a buon fine e restituisce un errore
BadUsage. Tuttavia, una transazione può superare le 80.000 mutazioni contenendo più istruzioni DML, a condizione che ogni singola istruzione rimanga al di sotto di questo limite.API Mutation: le mutazioni che utilizzano l'API Mutation possono essere applicate solo come parte dell'operazione di commit, non nel mezzo di una transazione, a differenza del DML. Il limite di 80.000 mutazioni (inclusi gli indici) è cumulativo per tutte le mutazioni nel commit. Se una transazione utilizza mutazioni (da sole o combinate con DML), questo limite cumulativo si applica a tutte le mutazioni nel commit.
Dimensioni della transazione: tutte le transazioni sono soggette a un limite di dimensioni di 100 MiB. Per DML, se le istruzioni in una transazione generano una transazione di dimensioni superiori a 100 MiB, l'istruzione che supera il limite non va a buon fine con un errore
BadUsage. Le mutazioni eseguite utilizzando DML non vengono conteggiate ai fini del limite di 80.000 istruzioni, ma vengono conteggiate ai fini di questo limite di dimensioni della transazione quando viene eseguito il commit.
Esegui istruzioni nella console Google Cloud
Segui questi passaggi per eseguire un'istruzione DML nella consoleGoogle Cloud .
Vai alla pagina Istanze di Spanner.
Seleziona il tuo progetto nell'elenco a discesa della barra degli strumenti.
Fai clic sul nome dell'istanza che contiene il database per andare alla pagina Dettagli istanza.
Nella scheda Panoramica, fai clic sul nome del database. Viene visualizzata la pagina Dettagli database.
Fai clic su Spanner Studio.
Inserisci un'istruzione DML. Ad esempio, la seguente istruzione aggiunge una nuova riga alla tabella
Singers.INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')Fai clic su Esegui query. La console Google Cloud visualizza il risultato.
Esegui le istruzioni con gcloud CLI
Per eseguire istruzioni DML, utilizza il comando gcloud spanner databases execute-sql. L'esempio seguente aggiunge una nuova riga alla tabella Singers.
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')"
Modifica i dati utilizzando la libreria client
Per eseguire istruzioni DML utilizzando la libreria client:
- Crea una transazione di lettura/scrittura.
- Chiama il metodo della libreria client per l'esecuzione DML e passa l'istruzione DML.
- Utilizza il valore restituito del metodo di esecuzione DML per ottenere il numero di righe inserite, aggiornate o eliminate.
Il seguente esempio di codice inserisce una nuova riga nella tabella Singers.
C++
Utilizza la funzione ExecuteDml() per eseguire un'istruzione DML.
C#
Utilizza il metodo ExecuteNonQueryAsync() per eseguire un'istruzione DML.
Vai
Utilizza il metodo Update() per eseguire un'istruzione DML.
Java
Utilizza il metodo executeUpdate() per eseguire un'istruzione DML.
Node.js
Utilizza il metodo runUpdate() per eseguire un'istruzione DML.
PHP
Utilizza il metodo executeUpdate() per eseguire un'istruzione DML.
Python
Utilizza il metodo execute_update() per eseguire un'istruzione DML.
Ruby
Utilizza il metodo execute_update() per eseguire un'istruzione DML.
Il seguente esempio di codice aggiorna la colonna MarketingBudget della tabella Albums in base a una clausola WHERE.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Il seguente esempio di codice elimina tutte le righe della tabella Singers in cui la colonna FirstName è Alice.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
L'esempio seguente, solo per i database con dialetto GoogleSQL, utilizza un'istruzione STRUCT con parametri associati per aggiornare LastName nelle righe filtrate in base a FirstName e LastName.
GoogleSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Modifica i dati con le istruzioni DML di ritorno
La clausola THEN RETURN (database con dialetto GoogleSQL) o la clausola RETURNING (database con dialetto PostgreSQL) è destinata agli scenari in cui vuoi recuperare i dati dalle righe modificate. Questo è particolarmente utile quando vuoi visualizzare valori non specificati nelle istruzioni DML, nei valori predefiniti o nelle colonne generate.
Per eseguire istruzioni DML con RETURNING utilizzando la libreria client:
- Crea una transazione di lettura/scrittura.
- Chiama il metodo della libreria client per l'esecuzione delle query e passa l'istruzione DML di ritorno per ottenere i risultati.
Il seguente esempio di codice inserisce una nuova riga nella tabella Singers e restituisce la colonna generata FullName dei record inseriti.
GoogleSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Il seguente esempio di codice aggiorna la colonna MarketingBudget della tabella Albums in base a una clausola WHERE e restituisce la colonna MarketingBudget modificata dei record aggiornati.
GoogleSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Il seguente esempio di codice elimina tutte le righe della tabella Singers in cui la colonna FirstName è Alice e restituisce le colonne SingerId e FullName dei record eliminati.
GoogleSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Leggi i dati scritti nella stessa transazione
Le modifiche apportate utilizzando le istruzioni DML sono visibili alle istruzioni successive nella stessa transazione. Questo è diverso dall'utilizzo delle mutazioni, in cui le modifiche non sono visibili fino al commit della transazione.
Spanner controlla i vincoli dopo ogni istruzione DML. Questo è diverso dall'utilizzo delle mutazioni, in cui Spanner memorizza nel buffer le mutazioni nel client fino al commit e controlla i vincoli al momento del commit. La valutazione dei vincoli dopo ogni istruzione consente a Spanner di garantire che i dati restituiti da un'istruzione DML siano coerenti con lo schema.
L'esempio seguente aggiorna una riga nella tabella Singers, quindi esegue un'istruzione SELECT per stampare i nuovi valori.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Ottieni il piano di query
Puoi recuperare un piano di query utilizzando la console Google Cloud , le librerie client e gcloud CLI.
Utilizza DML partizionato
Il DML partizionato è progettato per aggiornamenti ed eliminazioni collettivi, in particolare per la pulizia periodica e il backfill.
Esegui le istruzioni con gcloud CLI
Per eseguire un'istruzione DML partizionata, utilizza il comando gcloud spanner databases execute-sql con l'opzione --enable-partitioned-dml. L'esempio seguente aggiorna le righe nella tabella Albums.
gcloud spanner databases execute-sql example-db \ --instance=test-instance --enable-partitioned-dml \ --sql='UPDATE Albums SET MarketingBudget = 0 WHERE MarketingBudget IS NULL'
Modifica i dati utilizzando la libreria client
Il seguente esempio di codice aggiorna la colonna MarketingBudget della tabella Albums.
C++
Utilizza la funzione ExecutePartitionedDml() per eseguire un'istruzione DML partizionata.
C#
Utilizza il metodo ExecutePartitionedUpdateAsync() per eseguire un'istruzione DML partizionata.
Vai
Utilizza il metodo PartitionedUpdate() per eseguire un'istruzione DML partizionata.
Java
Utilizza il metodo executePartitionedUpdate() per eseguire un'istruzione DML partizionata.
Node.js
Utilizza il metodo runPartitionedUpdate() per eseguire un'istruzione DML partizionata.
PHP
Utilizza il metodo executePartitionedUpdate() per eseguire un'istruzione DML partizionata.
Python
Utilizza il metodo execute_partitioned_dml() per eseguire un'istruzione DML partizionata.
Ruby
Utilizza il metodo execute_partitioned_update() per eseguire un'istruzione DML partizionata.
Il seguente esempio di codice elimina le righe dalla tabella Singers in base alla colonna SingerId.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Utilizza DML batch
Se devi evitare la latenza aggiuntiva causata da più richieste seriali, utilizza il DML batch per inviare più istruzioni INSERT, UPDATE o DELETE in una singola transazione:
C++
Utilizza la funzione ExecuteBatchDml() per eseguire un elenco di istruzioni DML.
C#
Utilizza il metodo connection.CreateBatchDmlCommand() per creare il comando batch, il metodo Add per aggiungere istruzioni DML ed esegui le istruzioni con il metodo ExecuteNonQueryAsync().
Vai
Utilizza il metodo BatchUpdate() per eseguire un array di oggetti DML Statement.
Java
Utilizza il metodo transaction.batchUpdate() per eseguire un ArrayList di più oggetti Statement DML.
Node.js
Utilizza transaction.batchUpdate() per eseguire un elenco di istruzioni DML.
PHP
Utilizza executeUpdateBatch() per creare un elenco di istruzioni DML, quindi utilizza commit() per eseguirle.
Python
Utilizza transaction.batch_update() per eseguire più stringhe di istruzione DML.
Ruby
Utilizza transaction.batch_update per eseguire più stringhe di istruzione DML.