En esta página, se describe cómo insertar, actualizar y borrar datos de Spanner con instrucciones del lenguaje de manipulación de datos (DML). Puedes ejecutar instrucciones de DML con las bibliotecas cliente, la consola deGoogle Cloud y la herramienta de línea de comandos de gcloud. Puedes ejecutar declaraciones de DML particionadas con las bibliotecas cliente y la herramienta de línea de comandos de gcloud.
Para obtener la referencia de la sintaxis de DML completa, consulta Sintaxis del lenguaje de manipulación de datos para las bases de datos del dialecto de GoogleSQL o Lenguaje de manipulación de datos de PostgreSQL para las bases de datos del dialecto de PostgreSQL.
Usa DML
El DML admite declaraciones INSERT, UPDATE y DELETE en la consola deGoogle Cloud , Google Cloud CLI y las bibliotecas cliente.
Bloqueo
Las declaraciones DML se pueden ejecutar dentro de transacciones de lectura y escritura. Cuando Spanner lee datos, adquiere bloqueos de lectura compartidos en partes limitadas de los rangos de fila que lees. En particular, adquiere estos bloqueos solo en las columnas a las que accedes. Los bloqueos pueden incluir datos que no satisfagan la condición del filtro de la cláusula WHERE.
Cuando Spanner modifica los datos con instrucciones DML, adquiere bloqueos exclusivos en los datos específicos que estás modificando. Además, adquiere bloqueos compartidos de la misma manera que cuando lees datos. Si tu solicitud incluye grandes rangos de filas o una tabla completa, es posible que los bloqueos compartidos impidan que otras transacciones avancen en paralelo.
Para modificar los datos de la manera más eficiente posible, usa una cláusula WHERE que permita a Spanner leer solo las filas necesarias. Puedes lograr este objetivo con un filtro en la clave primaria o en la clave de un índice secundario. La cláusula WHERE limita el alcance de los bloqueos compartidos y permite que Spanner procese la actualización de manera más eficiente.
Por ejemplo, supongamos que uno de los músicos de la tabla Singers cambia su nombre y tienes que actualizarlo en tu base de datos. Puedes ejecutar la siguiente declaración DML, pero eso obliga a Spanner a analizar toda la tabla y a adquirir bloqueos compartidos que cubran la tabla completa. Como resultado, Spanner debe leer más datos de los necesarios, y las transacciones simultáneas no pueden modificar los datos en paralelo:
-- 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";
Para que la actualización sea más eficiente, incluye la columna SingerId en la cláusula WHERE. La columna SingerId es la única columna de clave primaria de la tabla Singers:
-- ANTI-PATTERN: SENDING AN UPDATE THAT MUST SCAN THE ENTIRE TABLE
UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards"
Si no hay un índice en FirstName o LastName, debes analizar toda la tabla para encontrar los cantantes objetivo. Si no deseas agregar un índice secundario para que la actualización sea más eficiente, incluye la columna SingerId en la cláusula WHERE.
La columna SingerId es la única columna de clave primaria de la tabla Singers. Para encontrarlo, ejecuta SELECT en una transacción independiente de solo lectura antes de la transacción de actualización:
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;
Simultaneidad
Spanner ejecuta en secuencia todas las instrucciones de SQL (SELECT, INSERT, UPDATE y DELETE) dentro de una transacción. No se ejecutan al mismo tiempo. La única excepción es que Spanner podría ejecutar varias declaraciones SELECT de forma simultánea, porque son operaciones de solo lectura.
Límites de transacciones
Una transacción que incluye declaraciones DML tiene los mismos límites que cualquier otra transacción. Si tienes que realizar cambios a gran escala, considera usar DML particionado.
Si las instrucciones DML de una transacción generan más de 80,000 mutaciones, la declaración DML que envía la transacción por encima del límite muestra un error
BadUsagecon un mensaje de que son demasiadas mutaciones.Si las instrucciones DML de una transacción generan una transacción superior a 100 MiB, la declaración DML que envía la transacción por encima del límite muestra un error
BadUsagecon un mensaje de que la transacción supera el límite de tamaño.
Las mutaciones que se realizan con DML no se muestran al cliente. Se combinan en la solicitud de confirmación cuando se confirma y cuentan para los límites de tamaño máximo. Incluso si el tamaño de la solicitud de confirmación que envías es pequeño, la transacción podría superar el límite de tamaño permitido.
Ejecuta instrucciones en la consola de Google Cloud
Sigue estos pasos para ejecutar una declaración DML en la consola deGoogle Cloud .
Ve a la página Instancias de Spanner.
Selecciona tu proyecto en la lista desplegable de la barra de herramientas.
Haz clic en el nombre de la instancia que contiene tu base de datos para ir a la página Detalles de la instancia.
En la pestaña Descripción general, haz clic en el nombre de tu base de datos. Aparecerá la página Detalles de la base de datos.
Haz clic en Spanner Studio.
Ingresa una declaración DML. Por ejemplo, con la declaración siguiente, se agrega una fila nueva a la tabla
Singers.INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')Haz clic en Ejecutar consulta. La consola Google Cloud muestra el resultado.
Ejecuta sentencias con Google Cloud CLI
Para ejecutar declaraciones DML, usa el comando gcloud spanner databases execute-sql. En el siguiente ejemplo, se agrega una fila nueva a la tabla Singers.
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')"
Modifica datos con la biblioteca cliente
Para ejecutar declaraciones DML con la biblioteca cliente, sigue estos pasos:
- Crea una transacción de lectura y escritura.
- Llama al método de la biblioteca cliente para la ejecución de DML y pasa la declaración DML.
- Usa el valor que se muestra del método de ejecución de DML para obtener la cantidad de filas insertadas, actualizadas o borradas.
Con el siguiente ejemplo de código, se inserta una fila nueva en la tabla Singers.
C++
Usa la función ExecuteDml() para ejecutar una declaración DML.
C#
Usa el método ExecuteNonQueryAsync() para ejecutar una declaración DML.
Go
Usa el método Update() para ejecutar una declaración DML.
Java
Usa el método executeUpdate() para ejecutar una declaración DML.
Node.js
Usa el método runUpdate() para ejecutar una declaración DML.
PHP
Usa el método executeUpdate() para ejecutar una declaración DML.
Python
Usa el método execute_update() para ejecutar una declaración DML.
Ruby
Usa el método execute_update() para ejecutar una declaración DML.
En el siguiente ejemplo de código, se actualiza la columna MarketingBudget de la tabla Albums según una cláusula WHERE.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
En el siguiente ejemplo de código, se borran todas las filas de la tabla Singers en las que la columna FirstName es Alice.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
En el siguiente ejemplo, que solo se aplica a las bases de datos con dialecto de GoogleSQL, se usa un STRUCT con parámetros vinculados para actualizar el LastName en las filas filtradas por FirstName y LastName.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modifica datos con las declaraciones DML de devolución
La cláusula THEN RETURN (bases de datos de dialecto de GoogleSQL) o la cláusula RETURNING (bases de datos de dialecto de PostgreSQL) están diseñadas para situaciones en las que deseas recuperar datos de filas modificadas. Esto es especialmente útil cuando deseas ver valores no especificados en las instrucciones DML, los valores predeterminados o las columnas generadas.
Para ejecutar declaraciones DML que devuelven datos con la biblioteca cliente, sigue estos pasos:
- Crea una transacción de lectura y escritura.
- Llama al método de la biblioteca cliente para la ejecución de la consulta y pasa la declaración DML que devuelve para obtener resultados.
En el siguiente ejemplo de código, se inserta una fila nueva en la tabla Singers y se devuelve la columna FullName generada de los registros insertados.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
En el siguiente ejemplo de código, se actualiza la columna MarketingBudget de la tabla Albums según una cláusula WHERE y se devuelve la columna MarketingBudget modificada de los registros actualizados.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
En el siguiente ejemplo de código, se borran todas las filas de la tabla Singers en las que la columna FirstName es Alice y se muestran las columnas SingerId y FullName de los registros borrados.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Lee datos escritos en la misma transacción
Los cambios que realices mediante las declaraciones DML serán visibles para las declaraciones posteriores de la misma transacción. No es lo mismo que usar mutaciones, cuyos cambios no son visibles hasta que la transacción se confirma.
Spanner verifica las restricciones después de cada declaración DML. No es lo mismo que usar mutaciones, para las que Spanner almacena las mutaciones en el cliente hasta la confirmación y verifica las restricciones en el momento de la confirmación. La evaluación de las restricciones después de realizar cada declaración permite que Spanner garantice que los datos que muestra una declaración DML sean coherentes con el esquema.
En el ejemplo siguiente, se actualiza una fila en la tabla Singers, después, se ejecuta una declaración SELECT para mostrar los valores nuevos.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Obtén el plan de consultas
Puedes recuperar un plan de consultas con la consola de Google Cloud , las bibliotecas cliente y la herramienta de línea de comandos de gcloud.
Usa DML particionado
El DML particionado está diseñado con el fin de borrar y actualizar de forma masiva, en especial para la limpieza y el reabastecimiento periódico.
Ejecuta sentencias con Google Cloud CLI
Si deseas ejecutar una declaración DML particionada, usa el comando gcloud spanner databases execute-sql con la opción --enable-partitioned-dml. En el ejemplo siguiente, se actualizan las filas de la tabla 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 datos con la biblioteca cliente
En el siguiente ejemplo de código, se actualiza la columna MarketingBudget de la tabla Albums.
C++
Usa la función ExecutePartitionedDml() para ejecutar una declaración DML particionada.
C#
Usa el método ExecutePartitionedUpdateAsync() para ejecutar una declaración DML particionada.
Go
Usa el método PartitionedUpdate() para ejecutar una declaración DML particionada.
Java
Usa el método executePartitionedUpdate() para ejecutar una declaración DML particionada.
Node.js
Usa el método runPartitionedUpdate() para ejecutar una declaración DML particionada.
PHP
Usa el método executePartitionedUpdate() para ejecutar una declaración DML particionada.
Python
Usa el método execute_partitioned_dml() para ejecutar una declaración DML particionada.
Ruby
Usa el método execute_partitioned_update() para ejecutar una declaración DML particionada.
En el siguiente ejemplo de código, se borran las filas de la tabla Singers según la columna SingerId.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Usa DML por lotes
Si necesitas evitar la latencia adicional que generan varias solicitudes en serie, usa DML por lotes para enviar varias declaraciones INSERT, UPDATE o DELETE en una sola transacción:
C++
Usa la función ExecuteBatchDml() para ejecutar una lista de declaraciones DML.
C#
Usa el método connection.CreateBatchDmlCommand() si deseas crear tu comando por lotes, usa el método Add para agregar declaraciones DML y ejecuta las instrucciones con el método ExecuteNonQueryAsync().
Go
Usa el método BatchUpdate() para ejecutar un arreglo de objetos Statement de DML.
Java
Usa el método transaction.batchUpdate() para ejecutar una ArrayList de varios objetos Statement de DML.
Node.js
Usa transaction.batchUpdate() para ejecutar una lista de declaraciones DML.
PHP
Usa executeUpdateBatch() para crear una lista de declaraciones DML y, luego, usa commit() a fin de ejecutar las declaraciones.
Python
Usa transaction.batch_update() para ejecutar varias strings de declaraciones DML.
Ruby
Usa transaction.batch_update para ejecutar varias strings de declaraciones DML.