¿Cómo actualizo los datos de una tabla desde otra tabla en SQL?

Actualizar en Oracle SQL: TTL y Secuencias

Valoración: 4.29 (5889 votos)

En el mundo de las bases de datos, la capacidad de actualizar información es fundamental. Sin embargo, esta capacidad va más allá de simplemente modificar un valor en una columna. Oracle SQL ofrece herramientas poderosas para gestionar aspectos más dinámicos de los datos y los objetos de la base de datos, como el tiempo de vida de las filas o la forma en que se generan los números secuenciales. En este artículo, exploraremos dos escenarios específicos de actualización en Oracle, basándonos en la información proporcionada: cómo modificar el valor de Tiempo de Vida (TTL) para filas específicas y cómo alterar la definición de una secuencia existente.

Estas funcionalidades son cruciales para mantener la eficiencia, la relevancia de los datos y la escalabilidad de tus aplicaciones, permitiéndote adaptar el comportamiento de la base de datos a tus requisitos específicos.

Índice de Contenido

Gestionando la Expiración de Datos (TTL) en Oracle

El concepto de Time To Live (TTL) o Tiempo de Vida es una característica muy útil que permite definir cuánto tiempo pueden existir los datos en una tabla antes de que expiren. Una vez que los datos han expirado, ya no pueden ser devueltos como parte de una consulta, lo que ayuda a gestionar el volumen de datos y mantener la información fresca y relevante.

¿Qué es TTL?

Los valores TTL indican por cuánto tiempo los datos pueden permanecer activos en una tabla. Cuando se define una tabla por primera vez, se pueden establecer valores TTL por defecto, ya sea a nivel de tabla o a nivel de fila. Sin embargo, las necesidades cambian, y es posible que necesites ajustar el tiempo de vida para filas individuales después de que los datos ya han sido insertados.

Afortunadamente, Oracle permite modificar el valor TTL para una sola fila utilizando sentencias UPDATE. Esto proporciona una gran flexibilidad para controlar la longevidad de datos específicos dentro de una tabla.

Visualizando el Tiempo de Vida Restante

Antes de actualizar el TTL de una fila, es útil saber cuál es su valor actual o si tiene una fecha de expiración establecida. Para ello, Oracle proporciona funciones integradas que requieren la fila como entrada. Esto se logra típicamente utilizando el símbolo $ como parte del alias de la tabla, lo que hace que el alias funcione como una variable de fila.

Las funciones disponibles para visualizar el tiempo de vida son:

FunciónDescripciónUnidad
remaininghours()Retorna las horas restantes hasta la expiración.Horas
remainingdays()Retorna los días restantes hasta la expiración.Días
expirationtime()Retorna la fecha y hora de expiración exacta.Fecha y Hora

Veamos un ejemplo de cómo usar remainingdays() para verificar el tiempo de vida restante de una fila con id = 6 en una tabla llamada JSONPersons:


SELECT remainingdays($j) AS Expires FROM JSONPersons $j WHERE id = 6;

Si la fila no tiene una fecha de expiración establecida (es decir, nunca expira), la consulta anterior retornará -1. Esto es un indicador de que la fila no está sujeta a la política de expiración TTL.

Actualizando el Valor TTL para una Fila Específica

Para establecer o modificar el tiempo de vida de una fila, utilizamos la sentencia UPDATE junto con la cláusula SET TTL. Esta cláusula calcula un nuevo valor TTL especificando un desplazamiento desde la fecha de expiración actual. Si la fila nunca ha tenido una fecha de expiración, la fecha base para el cálculo es 1970-01-01T00:00:00.000.

El valor que se proporciona a la cláusula SET TTL debe especificar las unidades, que pueden ser HOURS (horas) o DAYS (días).

Aquí tienes un ejemplo de cómo establecer el TTL de una fila con id = 6 para que expire en 1 día a partir de ahora:


UPDATE JSONPersons $j SET TTL 1 DAYS WHERE id = 6 RETURNING remainingdays($j) AS Expires;

La cláusula RETURNING en este ejemplo nos permite ver el nuevo valor de días restantes inmediatamente después de la actualización. En este caso, retornaría 1, indicando que la fila expirará en 1 día.

Es importante notar que, si especificas una fecha de expiración basada en un límite de día (usando DAYS), la expiración se redondeará hasta la medianoche del día siguiente. Podemos confirmar la fecha y hora de expiración exactas utilizando la función expirationtime():


SELECT currenttime() AS Now, expirationtime($j) AS Expires FROM JSONPersons $j WHERE id = 6;

Esto mostraría la hora actual y la fecha de expiración calculada, que se redondearía a la medianoche del día siguiente al que se cumple el plazo de 1 día.

Desactivando la Expiración de una Fila

Si deseas que una fila que actualmente tiene un TTL establecido deje de expirar (es decir, que nunca expire), puedes hacerlo especificando un valor negativo (como -1) en la cláusula SET TTL, utilizando HOURS o DAYS como unidad.

Ejemplo para desactivar el TTL para la fila con id = 6:


UPDATE JSONPersons $j SET TTL -1 DAYS WHERE id = 6 RETURNING remainingdays($j) AS Expires;

Después de ejecutar esta sentencia, la cláusula RETURNING mostrará un valor de 0 días. Sin embargo, si posteriormente consultas el valor con remaining_days() en una sentencia SELECT separada, volverás a ver -1, lo cual es el indicador de que la fila ya no tiene una fecha de expiración y, por lo tanto, nunca expirará.

Modificando la Definición de Secuencias en Oracle

Las secuencias en Oracle son objetos de base de datos que generan números únicos, típicamente usados para claves primarias o identificadores únicos. Una vez creada una secuencia, es posible que necesites ajustar su comportamiento o propiedades sin tener que eliminarla y recrearla. Aquí es donde entra en juego la sentencia ALTER SEQUENCE.

Propósito y Prerrequisitos

La sentencia ALTER SEQUENCE se utiliza para modificar los atributos de una secuencia existente. Puedes cambiar aspectos como el incremento, los valores mínimo y máximo, el número de valores cacheados y otros comportamientos. Es crucial entender que esta sentencia afecta solamente a los números de secuencia que se generarán en el futuro.

Para poder alterar una secuencia, debes cumplir con alguno de los siguientes prerrequisitos:

  • La secuencia debe estar en tu propio esquema.
  • Debes tener el privilegio de objeto ALTER sobre la secuencia específica.
  • Debes tener el privilegio de sistema ALTER ANY SEQUENCE.

Claves de la Sentencia ALTER SEQUENCE

La sentencia ALTER SEQUENCE utiliza palabras clave y parámetros que tienen el mismo propósito que cuando creas una secuencia con CREATE SEQUENCE.

Si modificas el valor de INCREMENT BY antes de la primera invocación de NEXTVAL, algunos números de secuencia se omitirán. Si deseas conservar el valor original de START WITH y cambiar el incremento, deberás eliminar la secuencia y volver a crearla con el valor START WITH original y el nuevo valor INCREMENT BY.

Aquí se describen algunas de las cláusulas clave que puedes usar con ALTER SEQUENCE, basadas en la información proporcionada:

CláusulaDescripción
INCREMENT BY valorCambia el intervalo entre números consecutivos generados por la secuencia.
MINVALUE valorCambia el valor mínimo que la secuencia generará (para secuencias ascendentes).
MAXVALUE valorCambia el valor máximo que la secuencia generará (para secuencias descendentes).
CYCLE | NOCYCLEDefine si la secuencia debe continuar generando valores después de alcanzar el límite (MAXVALUE o MINVALUE).
CACHE n | NOCACHEDefine cuántos valores de secuencia se almacenan en memoria para un acceso más rápido.
ORDER | NOORDERGarantiza que los números de secuencia se asignen en orden de solicitud (puede impactar el rendimiento).
KEEP | NOKEEPRelacionado con la continuidad de la aplicación (Application Continuity) durante fallos.
SCALE | NOSCALEHabilita la escalabilidad añadiendo un offset numérico.
SHARD | NOSHARDHabilita la generación de números únicos a través de shards en una base de datos sharded.

Reiniciando una Secuencia (RESTART)

Aunque ALTER SEQUENCE afecta valores futuros, hay una forma de "reiniciar" la generación de números. La cláusula RESTART se utiliza para este propósito. Para una secuencia ascendente, RESTART restablece el próximo valor (NEXTVAL) al MINVALUE. Para una secuencia descendente, restablece NEXTVAL al MAXVALUE.

Si deseas reiniciar la secuencia en un número diferente al MINVALUE o MAXVALUE, puedes especificar RESTART junto con la cláusula START WITH valor. Esto establecerá el valor inicial desde el cual la secuencia comenzará a generar números después del reinicio.

Es importante tener en cuenta que si alteras la secuencia especificando las cláusulas KEEP o NOKEEP entre el tiempo de ejecución y la conmutación por error (failover) de una solicitud, el valor original de NEXTVAL no se retiene durante la repetición para la continuidad de la aplicación en esa solicitud.

Validaciones Importantes

Oracle Database realiza ciertas validaciones al ejecutar ALTER SEQUENCE para garantizar la coherencia. Por ejemplo, no se puede imponer un nuevo MAXVALUE que sea menor que el número de secuencia actual que ya ha sido generado. Esto previene conflictos lógicos en la secuencia.

Escalabilidad con SCALE

La cláusula SCALE se utiliza para habilitar la escalabilidad de la secuencia, especialmente útil en entornos con múltiples instancias o sesiones. Cuando se especifica SCALE, se añade un offset numérico al inicio del valor de la secuencia generado. Este offset está diseñado para eliminar duplicados en los valores generados en entornos concurrentes.

El valor por defecto para la longitud del offset escalable es 6. Se recomienda encarecidamente no utilizar la cláusula ORDER simultáneamente con SCALE, ya que ORDER puede impactar negativamente el rendimiento y no es necesaria cuando SCALE ya proporciona unicidad.

La cláusula SCALE puede combinarse con EXTEND o NOEXTEND:

  • EXTEND: Si especificas EXTEND con SCALE, los valores de secuencia generados tendrán una longitud total fija igual a (x + y), donde x es la longitud del offset escalable (por defecto 6) e y es el número máximo de dígitos en la secuencia (determinado por MAXVALUE o MINVALUE).
  • NOEXTEND: Este es el ajuste por defecto para la cláusula SCALE. Con NOEXTEND, los valores de secuencia generados tendrán como máximo el ancho del número máximo de dígitos en la secuencia (y). Este ajuste es útil para la integración con aplicaciones existentes donde las secuencias se usan para poblar columnas de ancho fijo.

Secuencias en Entornos Sharded (SHARD)

La cláusula SHARD se utiliza para generar números de secuencia únicos a través de múltiples shards en una base de datos sharded. Cuando se crea o altera una secuencia con SHARD, el objeto de secuencia se crea como un objeto sharded global (all-shards) que devuelve valores únicos en todos los shards. También se crea en la base de datos de catálogo, devolviendo valores únicos relativos a las bases de datos de shard.

Al igual que con SCALE, se recomienda encarecidamente no utilizar ORDER simultáneamente con SHARD. SHARD se puede usar con los modos de operación CACHE y NOCACHE.

La cláusula SHARD también puede combinarse con EXTEND o NOEXTEND:

  • EXTEND: Si especificas EXTEND con la cláusula SHARD, los valores de secuencia generados tendrán una longitud total fija igual a (x + y), donde x es la longitud de un offset de SHARD de tamaño 4 (correspondiente al ancho del número máximo de shards, por ejemplo, 1000) e y es el número máximo de dígitos en la secuencia.
  • NOEXTEND: Este es el ajuste por defecto para la cláusula SHARD. Con NOEXTEND, los valores de secuencia generados tendrán como máximo el ancho del número máximo de dígitos en la secuencia (y). Es útil para la integración con aplicaciones existentes con columnas de ancho fijo. Si llamas a NEXTVAL en una secuencia con SHARD NOEXTEND especificado y el valor generado requiere más dígitos de representación que el máximo permitido, se producirá un error de usuario.

Combinando SCALE y SHARD

Si especificas las cláusulas SCALE y SHARD juntas, la secuencia generará valores escalables y globalmente únicos dentro de una base de datos sharded para múltiples instancias y sesiones. Si especificas EXTEND con las cláusulas SCALE y SHARD, los valores generados tendrán una longitud total igual a (x + y + z), donde x es la longitud del offset de SHARD (por defecto 4), y es la longitud del offset escalable (por defecto 6 o 5), y z es el número máximo de dígitos en la secuencia.

Si especificas EXTEND o NOEXTEND con las cláusulas SHARD y SCALE combinadas, la opción se aplica a ambas. No necesitas especificar EXTEND o NOEXTEND por separado para cada cláusula. De hecho, si lo haces, incluso con el mismo valor, resultará en un error de análisis debido a una cláusula EXTEND duplicada o conflictiva.

Preguntas Frecuentes

Aquí respondemos algunas preguntas comunes basadas en la información que hemos revisado:

¿La sentencia ALTER SEQUENCE cambia el siguiente número que se generará inmediatamente?
No, ALTER SEQUENCE afecta solamente los números de secuencia que se generarán en el futuro después de que la sentencia se haya ejecutado con éxito. La única excepción es el uso de la cláusula RESTART o RESTART START WITH, que establece explícitamente el próximo valor de NEXTVAL.

¿Cómo puedo cambiar el valor START WITH de una secuencia existente?
La sentencia ALTER SEQUENCE no tiene una cláusula START WITH directa para modificar el valor inicial una vez que la secuencia ha sido creada. Si necesitas cambiar el valor START WITH, la forma recomendada es eliminar la secuencia (DROP SEQUENCE) y luego volver a crearla (CREATE SEQUENCE) con el nuevo valor START WITH deseado, junto con cualquier otra opción que necesites.

¿Qué ocurre con los datos de una fila cuyo TTL ha expirado?
Según la información proporcionada, los datos expirados "ya no pueden ser devueltos como parte de una consulta". Esto implica que la base de datos los trata como inaccesibles para operaciones de lectura estándar.

¿Puedo usar UPDATE para cambiar el TTL por defecto de una tabla entera?
La información proporcionada describe el uso de UPDATE con SET TTL específicamente para cambiar el valor TTL "para una sola fila". No se menciona la capacidad de modificar el TTL por defecto a nivel de tabla mediante UPDATE.

¿Cuál es el propósito de SCALE y SHARD en las secuencias?
SCALE y SHARD son cláusulas avanzadas diseñadas para mejorar la generación de secuencias en entornos distribuidos o de alta concurrencia. SCALE añade un offset para evitar duplicados en múltiples instancias/sesiones dentro de una base de datos. SHARD añade un offset para generar números únicos a través de múltiples bases de datos shard en una configuración sharded. Ambas ayudan a garantizar la unicidad y la escalabilidad en arquitecturas complejas.

Conclusión

Hemos explorado dos métodos de actualización importantes en Oracle SQL: la gestión del Tiempo de Vida (TTL) de las filas individuales mediante la sentencia UPDATE con la cláusula SET TTL, y la modificación de las propiedades de las secuencias existentes utilizando ALTER SEQUENCE. Ambas funcionalidades son esenciales para la administración efectiva de una base de datos Oracle. Entender cómo controlar la expiración de los datos te permite mantener tus tablas optimizadas y relevantes, mientras que saber cómo modificar las secuencias te da la flexibilidad necesaria para adaptar la generación de identificadores únicos a medida que evolucionan los requisitos de tu aplicación. Dominar estas herramientas te empodera para mantener tu base de datos Oracle funcionando de manera eficiente y adaptada a tus necesidades.

""

Si quieres conocer otros artículos parecidos a Actualizar en Oracle SQL: TTL y Secuencias puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir