En esta página se describe cómo insertar, actualizar y eliminar datos de Spanner mediante instrucciones del lenguaje de manipulación de datos (DML). Puedes ejecutar instrucciones de DML con las bibliotecas de cliente, la consolaGoogle Cloud y la herramienta de línea de comandos gcloud. Puedes ejecutar instrucciones de DML particionado mediante las bibliotecas de cliente y la herramienta de línea de comandos gcloud.
Para consultar la referencia completa de la sintaxis de DML, consulta la sintaxis del lenguaje de manipulación de datos de las bases de datos con dialecto GoogleSQL o el lenguaje de manipulación de datos de PostgreSQL de las bases de datos con dialecto PostgreSQL.
Usar DML
DML admite las instrucciones INSERT, UPDATE y DELETE en la consola, la CLI de Google Cloud y las bibliotecas de cliente.Google Cloud
Bloqueo
Ejecutas instrucciones DML dentro de transacciones de lectura y escritura. Cuando Spanner lee datos, adquiere bloqueos de lectura compartidos en partes limitadas de los intervalos de filas que lees. En concreto, adquiere estos bloqueos solo en las columnas a las que accedes. Los bloqueos pueden incluir datos que no
cumplan la condición de filtro de la cláusula WHERE.
Cuando Spanner modifica datos mediante instrucciones DML, adquiere bloqueos exclusivos en los datos específicos que estás modificando. Además, adquiere bloqueos compartidos de la misma forma que cuando lees datos. Si tu solicitud incluye intervalos de filas grandes o una tabla completa, los bloqueos compartidos pueden impedir que otras transacciones avancen en paralelo.
Para modificar los datos de la forma más eficiente posible, utiliza una cláusula WHERE que permita a Spanner leer solo las filas necesarias. Puedes conseguir este objetivo con un filtro en la clave principal o en la clave de un índice secundario. La cláusula WHERE limita el ámbito de los bloqueos compartidos y permite que Spanner procese la actualización de forma 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 instrucción DML, pero obliga a Spanner a analizar toda la tabla y adquiere bloqueos compartidos que cubren toda la tabla. Por lo tanto, 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, incluya la columna SingerId en la cláusula WHERE. La columna SingerId es la única columna de clave principal 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 ningún índice en FirstName o LastName, debes analizar toda la tabla para encontrar a los cantantes objetivo. Si no quieres añadir 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 principal 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 secuencialmente todas las instrucciones SQL (SELECT,
INSERT, UPDATE y DELETE) de una transacción. No se ejecutan
simultáneamente. La única excepción es que Spanner puede ejecutar varias instrucciones SELECT simultáneamente, ya que son operaciones de solo lectura.
Límites de transacciones
Una transacción que incluye instrucciones de DML tiene los mismos límites que cualquier otra transacción. Si tienes que hacer cambios a gran escala, te recomendamos que uses DML particionado.
Si las instrucciones de DML de una transacción dan como resultado más de 80.000 mutaciones, la instrucción de DML que supere el límite de la transacción devolverá un error
BadUsagecon un mensaje sobre el número excesivo de mutaciones.Si las instrucciones de DML de una transacción dan como resultado una transacción de más de 100 MiB, la instrucción de DML que supere el límite devolverá un error
BadUsagecon un mensaje sobre la transacción que supera el límite de tamaño.
Las mutaciones realizadas con DML no se devuelven al cliente. Se combinan en la solicitud de confirmación cuando se confirma y se tienen en cuenta para los límites de tamaño máximo. Aunque el tamaño de la solicitud de confirmación que envíes sea pequeño, es posible que la transacción supere el límite de tamaño permitido.
Ejecutar instrucciones en la consola Google Cloud
.Sigue estos pasos para ejecutar una instrucción DML en la consolaGoogle Cloud .
Ve a la página Instancias de Spanner.
Selecciona tu proyecto en la lista desplegable de la barra de herramientas.
Haga clic en el nombre de la instancia que contiene su base de datos para ir a la página Detalles de la instancia.
En la pestaña Resumen, haga clic en el nombre de su base de datos. Aparecerá la página Detalles de la base de datos.
Haz clic en Spanner Studio.
Introduce una instrucción DML. Por ejemplo, la siguiente instrucción añade una nueva fila a la tabla
Singers.INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')Haz clic en Realizar una consulta. La consola Google Cloud muestra el resultado.
Ejecutar instrucciones con Google Cloud CLI
Para ejecutar instrucciones DML, usa el comando gcloud spanner databases execute-sql. En el siguiente ejemplo se añade una fila a la tabla Singers.
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')"
Modificar datos con la biblioteca de cliente
Para ejecutar instrucciones DML mediante la biblioteca de cliente, sigue estos pasos:
- Crea una transacción de lectura y escritura.
- Llama al método de la biblioteca de cliente para ejecutar DML y pasa la instrucción DML.
- Usa el valor devuelto del método de ejecución de DML para obtener el número de filas insertadas, actualizadas o eliminadas.
En el siguiente ejemplo de código se inserta una nueva fila en la tabla Singers.
C++
Utiliza la función ExecuteDml() para ejecutar una instrucción DML.
C#
Utiliza el método ExecuteNonQueryAsync() para ejecutar una instrucción DML.
Go
Utiliza el método Update() para ejecutar una instrucción DML.
Java
Utiliza el método executeUpdate() para ejecutar una instrucción DML.
Node.js
Utiliza el método runUpdate() para ejecutar una instrucción DML.
PHP
Utiliza el método executeUpdate() para ejecutar una instrucción DML.
Python
Utiliza el método execute_update() para ejecutar una instrucción DML.
Ruby
Utiliza el método execute_update() para ejecutar una instrucción DML.
En el siguiente ejemplo de código se actualiza la columna MarketingBudget de la tabla Albums
en función de una cláusula WHERE.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
En el siguiente ejemplo de código se eliminan 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 bases de datos con dialecto GoogleSQL, se usa una STRUCT con parámetros enlazados para actualizar LastName en las filas filtradas por FirstName y LastName.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modificar datos con las instrucciones DML de devolución
La cláusula THEN RETURN (bases de datos con dialecto de GoogleSQL) o la cláusula RETURNING (bases de datos con dialecto de PostgreSQL) se usan en situaciones en las que quieres obtener datos de filas modificadas. Esto es especialmente útil cuando quieres ver valores no especificados en las instrucciones DML, los valores predeterminados o las columnas generadas.
Para ejecutar instrucciones de DML de retorno mediante la biblioteca de cliente, sigue estos pasos:
- Crea una transacción de lectura y escritura.
- Llama al método de la biblioteca de cliente para ejecutar la consulta y pasa la instrucción DML de devolución para obtener los resultados.
En el siguiente ejemplo de código se inserta una fila 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 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 eliminan todas las filas de la tabla Singers en las que la columna FirstName es Alice y se devuelven las columnas SingerId y FullName de los registros eliminados.
GoogleSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
PostgreSQL
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Leer datos escritos en la misma transacción
Los cambios que hagas con instrucciones DML se podrán ver en las instrucciones posteriores de la misma transacción. Esto es diferente de usar mutaciones, donde los cambios no se ven hasta que se confirma la transacción.
Spanner comprueba las restricciones después de cada instrucción DML. Esto es diferente de usar mutaciones, donde Spanner almacena en búfer las mutaciones en el cliente hasta que se confirman y comprueba las restricciones en el momento de la confirmación. Al evaluar las restricciones después de cada instrucción, Spanner puede garantizar que los datos que devuelve una instrucción DML sean coherentes con el esquema.
En el siguiente ejemplo se actualiza una fila de la tabla Singers y, a continuación, se ejecuta una instrucción SELECT para imprimir los nuevos valores.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Obtener el plan de consulta
Puedes obtener un plan de consulta
mediante la consola de Google Cloud , las bibliotecas de cliente y la herramienta de línea de comandos gcloud.
Usar DML particionado
DML particionado se ha diseñado para realizar actualizaciones y eliminaciones en bloque, sobre todo para tareas de limpieza y relleno periódicas.
Ejecutar instrucciones con Google Cloud CLI
Para ejecutar una declaración de DML particionado, usa el comando gcloud spanner databases execute-sql con la opción --enable-partitioned-dml. En el siguiente ejemplo 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'
Modificar datos con la biblioteca de 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 instrucción DML con particiones.
C#
Usa el método ExecutePartitionedUpdateAsync() para ejecutar una declaración de DML particionado.
Go
Usa el método PartitionedUpdate() para ejecutar una declaración de DML particionado.
Java
Usa el método executePartitionedUpdate() para ejecutar una declaración de DML particionado.
Node.js
Usa el método runPartitionedUpdate() para ejecutar una declaración de DML particionado.
PHP
Usa el método executePartitionedUpdate() para ejecutar una declaración de DML particionado.
Python
Usa el método execute_partitioned_dml() para ejecutar una declaración de DML particionado.
Ruby
Usa el método execute_partitioned_update() para ejecutar una declaración de DML particionado.
En el siguiente ejemplo de código se eliminan filas de la tabla Singers en función de la columna SingerId.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Usar DML por lotes
Si quieres evitar la latencia adicional que se produce al enviar varias solicitudes en serie, usa DML por lotes para enviar varias instrucciones INSERT, UPDATE o DELETE en una sola transacción:
C++
Usa la función ExecuteBatchDml() para ejecutar una lista de instrucciones de DML.
C#
Usa el método connection.CreateBatchDmlCommand() para crear tu comando por lotes, el método Add para añadir instrucciones DML y el método ExecuteNonQueryAsync() para ejecutar las instrucciones.
Go
Usa el método BatchUpdate() para ejecutar una matriz de objetos Statement de DML.
Java
Usa el método transaction.batchUpdate() para ejecutar un ArrayList de varios objetos Statement de DML.
Node.js
Usa transaction.batchUpdate() para ejecutar una lista de instrucciones DML.
PHP
Usa executeUpdateBatch() para crear una lista de instrucciones DML y, a continuación, usa commit() para ejecutar las instrucciones.
Python
Usa transaction.batch_update() para ejecutar varias cadenas de instrucciones DML.
Ruby
Usa transaction.batch_update para ejecutar varias cadenas de instrucciones DML.