En esta página, se describe cómo insertar, actualizar y borrar datos de Spanner con sentencias de lenguaje de manipulación de datos (DML). Puedes ejecutar sentencias DML con las bibliotecas cliente, la consola deGoogle Cloud y Google Cloud CLI. Puedes ejecutar sentencias de DML particionado con las bibliotecas cliente y la gcloud CLI.
Para obtener la referencia completa de la sintaxis de DML, consulta Sintaxis del lenguaje de manipulación de datos para las bases de datos de dialecto de GoogleSQL o Lenguaje de manipulación de datos de PostgreSQL para las bases de datos de dialecto de PostgreSQL.
Usa DML
DML admite las declaraciones INSERT, UPDATE y DELETE en la consola deGoogle Cloud , gcloud CLI y las bibliotecas cliente.
Bloqueo
Las sentencias DML se ejecutan dentro de transacciones de lectura y escritura. Cuando Spanner lee datos, adquiere bloqueos de lectura compartidos en partes limitadas de los rangos de filas 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 de filtro de la cláusula WHERE.
Cuando Spanner modifica datos con sentencias 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 rangos de filas grandes o una tabla completa, los bloqueos compartidos podrían impedir que otras transacciones progresen en paralelo.
Para modificar los datos de la manera más eficiente posible, usa una cláusula WHERE que permita
que Spanner lea 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. Podrías ejecutar la siguiente sentencia DML, pero obliga a Spanner a analizar toda la tabla y adquiere bloqueos compartidos que
cubren toda la tabla. 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 de destino. 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 para 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 de forma secuencial todas las sentencias 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 puede ejecutar
varias sentencias SELECT de forma simultánea, ya que son operaciones de solo lectura.
Límites de transacciones
Una transacción que incluye sentencias DML tiene los mismos límites que cualquier otra transacción. Si tienes que realizar cambios a gran escala, considera usar DML particionado.
El límite de mutaciones se aplica de manera diferente según si usas sentencias DML o la API de Mutation:
Sentencias DML: El límite de 80,000 mutaciones (incluidos los índices) se aplica por sentencia y se restablece al final de cada una. Si una sola declaración DML supera este límite, falla y devuelve un error
BadUsage. Sin embargo, una transacción puede superar las 80,000 mutaciones si contiene varias sentencias DML, siempre que cada sentencia individual se mantenga por debajo de ese límite.API de Mutation: Las mutaciones que usan la API de Mutation solo se pueden aplicar como parte de la operación de confirmación, no en medio de una transacción, a diferencia de DML. El límite de 80,000 mutaciones (incluidos los índices) es acumulativo en todas las mutaciones de la confirmación. Si una transacción usa mutaciones (ya sea solas o mezcladas con DML), este límite acumulativo se aplica a todas las mutaciones de la confirmación.
Tamaño de la transacción: Todas las transacciones están sujetas a un límite de tamaño de 100 MiB. En el caso de DML, si las declaraciones de una transacción dan como resultado una transacción de más de 100 MiB, la declaración que la lleva más allá del límite falla con un error
BadUsage. Las mutaciones realizadas con DML no se tienen en cuenta para el límite de 80,000 en todas las declaraciones, pero sí se tienen en cuenta para este límite de tamaño de transacción cuando se confirman.
Ejecuta sentencias 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. En la consola de Google Cloud , se muestra el resultado.
Ejecuta sentencias con gcloud CLI
Para ejecutar sentencias 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 sentencias 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, solo para bases de datos de dialecto de GoogleSQL, se usa una
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 sentencias DML de retorno
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 muy útil cuando quieres ver valores no especificados en las sentencias DML,
los valores predeterminados o las columnas generadas.
Para ejecutar sentencias DML de devolución 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 de devolución para obtener resultados.
En el siguiente ejemplo de código, se inserta una fila nueva en la tabla Singers y se devuelve la columna generada FullName 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
en función de 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 la que la
columna FirstName es Alice y se devuelven 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 con las sentencias DML son visibles para las sentencias posteriores en 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. Esto es diferente de usar mutaciones, en las que Spanner almacena en búfer las mutaciones en el cliente hasta la confirmación y verifica las restricciones en el momento de la confirmación. Evaluar las restricciones después de cada sentencia permite que Spanner garantice que los datos que devuelve 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 consulta
Puedes recuperar un plan de consulta con la consola de Google Cloud , las bibliotecas cliente y la gcloud CLI.
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 gcloud CLI
Para 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 sentencias DML.
C#
Usa el método connection.CreateBatchDmlCommand() para crear tu comando por lotes,
el método Add para agregar sentencias DML y ejecuta las
sentencias 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 sentencias DML.
PHP
Usa executeUpdateBatch() para crear una lista de sentencias DML y, luego, usa
commit() para ejecutarlas.
Python
Usa transaction.batch_update() para ejecutar varias cadenas de declaración DML.
Ruby
Usa transaction.batch_update para ejecutar varias cadenas de declaración DML.