En esta página, se describe cómo insertar, actualizar y borrar datos de Spanner mediante declaraciones de lenguaje de manipulación de datos (DML). Puedes ejecutar declaraciones DML con las bibliotecas cliente, Google Cloud Console y la herramienta de línea de comandos de gcloud
. Puedes ejecutar declaraciones de DML particionadas mediante las bibliotecas cliente y la herramienta de línea de comandos de gcloud
.
Para obtener la referencia completa de la sintaxis de DML, consulta Sintaxis del lenguaje de manipulación de datos para bases de datos de dialecto de GoogleSQL o Lenguaje de manipulación de datos de PostgreSQL para bases de datos de dialecto de PostgreSQL.
Usa DML
El DML admite declaraciones INSERT
, UPDATE
y DELETE
en la consola de Google 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 mediante declaraciones 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 progresen 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 a los cantantes objetivo. Si no quieres 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 de solo lectura independiente 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 secuencias 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 declaraciones 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
BadUsage
con un mensaje de que son demasiadas mutaciones.Si las declaraciones DML de una transacción generan una transacción superior a 100 MB, la declaración DML que envía la transacción por encima del límite muestra un error
BadUsage
con 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 sentencias en la consola de Google Cloud
Usa los pasos siguientes para ejecutar una declaración DML en la console de Google 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 de 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
.
Usa la función ExecuteDml()
para ejecutar una declaración DML.
Usa el método ExecuteNonQueryAsync()
para ejecutar una declaración DML.
Usa el método Update()
para ejecutar una declaración DML.
Usa el método executeUpdate()
para ejecutar una declaración DML.
Usa el método runUpdate()
para ejecutar una declaración DML.
Usa el método executeUpdate()
para ejecutar una declaración DML.
Usa el método execute_update()
para ejecutar una declaración DML.
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
.
En el siguiente ejemplo de código, se borran todas las filas de la tabla Singers
en las que la columna FirstName
es Alice
.
En el siguiente ejemplo, solo para bases de datos de dialecto GoogleSQL, se usa un STRUCT
con parámetros vinculados para actualizar el LastName
en las filas filtradas por FirstName
y LastName
.
Modifica datos con las sentencias DML que se muestran
La cláusula THEN RETURN
(bases de datos de dialecto GoogleSQL) o la cláusula RETURNING
(bases de datos de dialecto PostgreSQL) se diseñó para situaciones en las que deseas recuperar datos de filas modificadas. Esto es útil cuando deseas ver valores no especificados en las sentencias DML, los valores predeterminados o las columnas generadas.
Para ejecutar declaraciones DML que muestran resultados 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 consultas y pasa la sentencia DML que se muestra para obtener resultados.
En el siguiente ejemplo de código, se inserta una fila nueva en la tabla Singers
y se muestra la columna generada FullName de los registros insertados.
En el siguiente ejemplo de código, se actualiza la columna MarketingBudget
de la tabla Albums
según una cláusula WHERE
y se muestra la columna MarketingBudget
modificada de los registros actualizados.
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.
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 sentencia 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.
Obtén el plan de consulta
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
.
Usa la función ExecutePartitionedDml()
para ejecutar una declaración DML particionada.
Usa el método ExecutePartitionedUpdateAsync()
para ejecutar una declaración DML particionada.
Usa el método PartitionedUpdate()
para ejecutar una declaración DML particionada.
Usa el método executePartitionedUpdate()
para ejecutar una declaración DML particionada.
Usa el método runPartitionedUpdate()
para ejecutar una declaración DML particionada.
Usa el método executePartitionedUpdate()
para ejecutar una declaración DML particionada.
Usa el método execute_partitioned_dml()
para ejecutar una declaración DML particionada.
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
.
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:
Usa la función ExecuteBatchDml()
para ejecutar una lista de declaraciones DML.
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()
.
Usa el método BatchUpdate()
para ejecutar un arreglo de objetos Statement
de DML.
Usa el método transaction.batchUpdate()
para ejecutar una ArrayList
de varios objetos Statement
de DML.
Usa transaction.batchUpdate()
para ejecutar una lista de declaraciones DML.
Usa executeUpdateBatch()
para crear una lista de declaraciones DML y, luego, usa commit()
a fin de ejecutar las declaraciones.
Usa transaction.batch_update()
para ejecutar varias strings de declaraciones DML.
Usa transaction.batch_update
para ejecutar varias strings de declaraciones DML.