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 lo strumento a riga di comando gcloud. Puoi eseguire istruzioni DML partizionate
utilizzando le librerie client e lo strumento a riga di comando gcloud.
Per il riferimento completo alla sintassi DML, consulta Sintassi del linguaggio di manipolazione dei dati per i database di dialetti GoogleSQL o Linguaggio di manipolazione dei dati PostgreSQL per i database di dialetti PostgreSQL
Utilizzare DML
DML supporta le istruzioni INSERT, UPDATE e DELETE nella consoleGoogle Cloud , in Google Cloud CLI e nelle librerie client.
Chiusura
Esegui istruzioni DML 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 le istruzioni DML, acquisisce blocchi esclusivi sui dati specifici che stai modificando. Inoltre, acquisisce blocchi condivisi nello stesso modo in cui quando leggi i dati. Se la richiesta include intervalli di righe di grandi dimensioni o un'intera tabella, i blocchi condivisi potrebbero impedire ad altre transazioni di avanzare 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 nome e tu debba aggiornarlo nel tuo database. Potresti eseguire la seguente istruzione DML, ma Spanner è costretto 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 alcun indice su FirstName o LastName, devi
scansionare l'intera tabella per trovare i cantanti di destinazione. Se non vuoi aggiungere un indice secondario per rendere più efficiente l'aggiornamento, includi la colonna SingerId nella clausola WHERE.
La colonna SingerId è l'unica colonna della chiave primaria per la tabella Singers. Per trovarlo, esegui SELECT in una transazione separata di sola lettura 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 eseguiti
contemporaneamente. L'unica eccezione è che Spanner potrebbe eseguire più istruzioni SELECT contemporaneamente, perché sono operazioni di sola lettura.
Limiti delle transazioni
Una transazione che include istruzioni DML ha gli stessi limiti di qualsiasi altra transazione. Se hai modifiche su larga scala, valuta la possibilità di utilizzare il DML partizionato.
Il limite di mutazione 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, l'operazione non va a buon fine e viene restituito 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 nell'ambito dell'operazione di commit, non a metà di una transazione, a differenza di DML. Il limite di 80.000 mutazioni (indici inclusi) è 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 superiore a 100 MiB, l'istruzione che supera il limite non va a buon fine e viene visualizzato un errore
BadUsage. Le modifiche eseguite utilizzando DML non vengono conteggiate ai fini del limite di 80.000 istruzioni, ma vengono conteggiate ai fini di questo limite di dimensioni delle transazioni quando vengono eseguite.
Esegui istruzioni nella console Google Cloud
Segui questi passaggi per eseguire un'istruzione DML nella console Google Cloud .
Vai alla pagina Istanze di Spanner.
Seleziona il tuo progetto dall'elenco a discesa nella barra degli strumenti.
Fai clic sul nome dell'istanza che contiene il database per accedere 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 mostra il risultato.
Esegui istruzioni con Google Cloud CLI
Per eseguire le 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')"
Modificare 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 trasmetti 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++
Utilizzi la funzione ExecuteDml() per eseguire un'istruzione DML.
C#
Utilizzi il metodo ExecuteNonQueryAsync() per eseguire un'istruzione DML.
Vai
Utilizzi il metodo Update() per eseguire un'istruzione DML.
Java
Utilizzi il metodo executeUpdate() per eseguire un'istruzione DML.
Node.js
Utilizzi il metodo runUpdate() per eseguire un'istruzione DML.
PHP
Utilizzi il metodo executeUpdate() per eseguire un'istruzione DML.
Python
Utilizzi il metodo execute_update() per eseguire un'istruzione DML.
Ruby
Utilizzi 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
Il seguente esempio, valido solo per i database con dialetto GoogleSQL, utilizza un
STRUCT con parametri associati
per aggiornare LastName nelle righe filtrate da FirstName e LastName.
GoogleSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Modifica i dati con le istruzioni DML di restituzione
La clausola THEN RETURN (database di dialetti GoogleSQL)
o la clausola RETURNING (database di dialetti PostgreSQL)
è pensata per gli scenari in cui vuoi recuperare i dati dalle righe modificate. Questa
opzione è particolarmente utile quando vuoi visualizzare valori non specificati nelle istruzioni
DML, valori predefiniti o colonne generate.
Per eseguire istruzioni DML di restituzione utilizzando la libreria client:
- Crea una transazione di lettura/scrittura.
- Chiama il metodo della libreria client per l'esecuzione della query e passa l'istruzione DML di restituzione per ottenere i risultati.
Il seguente esempio di codice inserisce una nuova riga nella tabella Singers e restituisce la colonna FullName generata dei record inseriti.
GoogleSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
L'esempio di codice seguente 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
Leggere 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 finché la transazione non viene eseguita.
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 verifica 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
Ottenere il piano di query
Puoi recuperare un piano di query
utilizzando la console Google Cloud , le librerie client e lo strumento a riga di comando gcloud.
Utilizza DML partizionato
DML partizionato è progettato per aggiornamenti ed eliminazioni collettivi, in particolare per la pulizia periodica e il backfilling.
Esegui istruzioni con Google Cloud 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'
Modificare i dati utilizzando la libreria client
Il seguente esempio di codice aggiorna la colonna MarketingBudget della tabella Albums.
C++
Utilizzi la funzione ExecutePartitionedDml() per eseguire un'istruzione DML partizionata.
C#
Utilizzi il metodo ExecutePartitionedUpdateAsync() per eseguire un'istruzione DML partizionata.
Vai
Utilizzi il metodo PartitionedUpdate() per eseguire un'istruzione DML partizionata.
Java
Utilizzi il metodo executePartitionedUpdate() per eseguire un'istruzione DML partizionata.
Node.js
Utilizzi il metodo runPartitionedUpdate() per eseguire un'istruzione DML partizionata.
PHP
Utilizzi il metodo executePartitionedUpdate() per eseguire un'istruzione DML partizionata.
Python
Utilizzi il metodo execute_partitioned_dml() per eseguire un'istruzione DML partizionata.
Ruby
Utilizzi il metodo execute_partitioned_update() per eseguire un'istruzione DML partizionata.
L'esempio di codice seguente 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 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 DML Statement.
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 eseguire le istruzioni.
Python
Utilizza transaction.batch_update() per eseguire più stringhe di istruzione DML.
Ruby
Utilizza transaction.batch_update per eseguire più stringhe di istruzione DML.