Mod BD UD6 Tratamiento Datos

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introducción

  • Todos los ejemplos y ejercicios propuestos están basados en una base de datos de nombre CIRCO probada sobre un gestor MYSQL versión 5.7 o superior:
Mod BD Prog Modelo Circo.jpg




  • SQL (Structured Quere Language) es un lenguaje completo de manipulación de datos que se utiliza no solamente para consultas, sino también para modificar y actualizar los datos de la base de datos. En comparación con la 'complejidad' que puede ter la sentencia SELECT, este tipo de sentencias son más sencillas.
Las tres sentencias SQL que se emplean para modificar los contenidos de una base de datos son:
  • INSERT, que añade nuevas filas de datos a una tabla,
  • DELETE, que elimina filas de datos de una tabla, y
  • UPDATE, que modifica datos existentes en la base de datos


  • El SGBD debe proteger la integridad de los datos almacenados durante los cambios, asegurándose que sólo se introduzcan datos válidos y que la base de datos permanezca autoconsistente, incluso en caso de fallos del sistema o errores a la hora de introducir los datos. Uno de estos mecanismos será el uso de transacciones, que veremos posteriormente en esta unidad.


  • El SGBD debe coordinar también las actualizaciones simultáneas por parte de múltiples usuarios, asegurándose que los usuarios y sus modificaciones no interfieran unos con otros empleando un mecanismo de bloqueo de registros que también veremos posteriormente.




Añadir/actualizar/borrar datos


Sentencia INSERT

  • Más información:


  • Añade una nueva fila a una tabla.
La sintaxis de Mysql es bastante más compleja de leer que si solamente nos fijamos en los aspectos más básicos.
La sintaxis básica seria la siguiente:
Mod BD Manipulacion Insert 1.JPG


Orden: Introduce en la tabla ARTISTAS una nueva fila de valores.
Mod BD Manipulacion Insert 2.JPG


  • Para realizar esta inserción llegaría la siguiente orden SQL:
SQL:
INSERT INTO ARTISTAS (nif, apellidos, nombre, nif_jefe)
VALUES ('55555555E', 'Rodriguez', 'Sam', NULL);


  • Veamos algunos aspectos a destacar:
  • Primero: Los datos de tipo carácter (normalmente van incluidos los datos de tipo fecha), van entre comillas (que pueden ser dobles o simples dependiendo del SGBD utilizado).
  • Segundo: En el caso de que se inserten valores en todas las columna de la tabla, no es necesario indicar el nombre de las mismas en la sentencia INSERT. Es decir, la orden anterior es equivalente a:
SQL:
INSERT INTO ARTISTAS
VALUES ('55555555E', 'Rodriguez', 'Sam', NULL)


Supongamos que no sabemos el nombre y apellidos del artista. En este caso sólo estaríamos insertando el nif del artista.
Valdría la siguiente orden:
Nota: Dará un error ya que la tabla ARTISTAS no acepta valores nulos para los campos Apellidos y Nombre, pero la sintaxis es correcta.
SQL:
INSERT INTO ARTISTAS (nif)
VALUES ('55555555E');


El resto de columnas para esa fila (todas menos el nif) van a tener un valor NULL (desconocido) o un valor por defecto se este está establecido en la definición de la tabla. Lógicamente si alguna de ellas no acepta el valor null o no tiene valor por defecto establecido, la orden anterior dará un error.


  • Tercera: Es posible insertar para una columna determinada un valor desconocido, poniendo la constante NULL en vez de un valor.
Siguiendo nuestro ejemplo anterior, las siguientes sentencias SQL son equivalentes.
Nota: Dará un error ya que la tabla ARTISTAS no acepta valores nulos para los campos Apellidos y Nombre, pero la sintaxis es correcta.
SQL:
INSERT INTO ARTISTAS
VALUES ('75555555E',null,null,null);
SQL:
INSERT INTO ARTISTAS (nif)
VALUES ('55555555E')

Sentencia UPDATE

Sentencia DELETE

Transacciones

Introducción

Veamos un ejemplo para entender qué es y para qué sirve una transacción.

Supongamos que estamos trabajando con la siguiente base de datos basada en el modelo relacional que se muestra a continuación. Cuando damos de alta a un nuevo participante, añadimos entre los datos, su nombre, dirección, teléfono, tipo (árbitro o jugador) y el país al que pertenece.

Mod BD ud6 trans 1.jpg


Para nosotros, una transacción va a ser una tarea atómica e indivisible. Quiero esto decir, que se va a ejecutar de forma completa o no se ejecuta. Cada transacción puede estar conformada por una o más operaciones sobre la base de datos.

En el ejemplo anterior, dar de alta va a suponer añadir una nueva fila a la tabla PARTICIPANTE, pero también hay que darlo de alta en la tabla JUGADOR / ARBITRO según el tipo al que pertenezca.


Imaginemos que queremos dar de alta al siguiente jugador:

'Pedro Guiti', que vive en C/ De la Tierra Nº 1, con teléfono 981212121, es un jugador que lo envía España y tiene un nivel de 5.
Este llevaría consigo dos operaciones de INSERT, Una sobre la tabla PARTICIPANTE y otra sobre la tabla JUGADOR.


¿ Pero qué pasaría si falla el segundo INSERT o el sistema se cae ? Pues que tendríamos un dato añadido a la primera tabla (PARTICIPANTE), pero ninguno a la tabla de JUGADOR, por lo que la base de datos quedaría en un estado inconsistente.

Para solucionar este problema nacen las transacciones. Con una transacción nos aseguraremos que o bien se hace todo el conjunto de operaciones o no se hace nada.


Nota: Recordar que las tablas en Mysql están creadas haciendo uso de un motor de base de datos. Dependiendo del motor, este tendrá soporte para usar transacciones. InnoDB tiene soporte. Podéis consultar la lista de motores y sus características en este enlace: https://wiki.cifprodolfoucha.es/index.php?title=Mysql_Motores_de_bases_de_datos



Creación de una transacción

Los pasos para hacer uso de una transacción siempre son los mismos en cualquier gestor de bases de datos relacional:

  • Iniciar la transacción (a partir de este punto todas las operaciones que se hagan sobre la base de datos estarán dentro de la transacción)
  • Si todo va bien, confirmar la transacción.
  • Si hubo algún error, deshacer la transacción y dejar la base de datos como estaba antes de iniciar la transacción.

Vamos a ver como se implementan estos tres pasos en MYSQL. INICIAR TRANSACCIÓN: Para ello podemos utilizar una de las tres formas siguientes (la opción en negrilla es la forma más habitual en otros gestores):

  • SET AUTOCOMMIT = 0;
  • START TRANSACTION;
  • BEGIN WORK;


CONFIRMAR TRANSACCIÓN: Para confirmar la transacción, es decir, para que todas las operaciones que se hayan hecho desde el comienzo de la transacción se acepten, debemos de poner: COMMIT [WORK]; (recordar que [ ] significa optativo, por lo tanto podemos poner COMMIT o COMMIT WORK)


DESHACER TRANSACCIÓN: En caso de que comprobemos que haya habido algún error, podremos deshacer los cambios que se produjeran en la base de datos desde el comienzo de la transacción con la orden: ROLLBACK [WORK];



Lo que es importante tener claro es que desde que marcamos el inicio de una transacción, todas las operaciones (INSERT, UPDATE, DELETE) sobre la base de datos no se harán efectivas hasta encontrar la orden COMMIT.

Nota: Mysql, por defecto, tiene configurada la opción AUTOCOMMIT a true (valor 1 u ON). Esto quiere decir que cualquier instrucción individual es tratada como una transacción y, o bien se ejecuta correctamente o si aparece cualquier error, se deshacen todas las modificaciones. Por ejemplo: DELETE FROM ARTISTAS;

Esta instrucción borra todas las filas de la tabla ARTISTAS. Si alguna de ellas provoca un error, se dejará la tabla en su estado original.


Si ponemos dos transacciones una a continuación de otra, la segunda hará implícitamente un COMMIT de la primera:

1 START TRANSACTION
2 
3 -- Operación de delete
4 
5 START TRASACTION		-- Implica un COMMIT de la anterior




Notas a tener en cuenta

  • En MYSQL el nivel de aislamiento funciona diferente al de SQLServer o ORACLE.
Así, en el nivel REPEATABLE READ no se pueden simular datos fantasma, ya que en dicho nivel, al hacer un select se crea un SNAPSHOT de los datos leídos y ya trabaja con esa copia.
Hay un 'truco' que consiste en actualizar la fila insertada y de esa forma ya aparece.
Otra diferencia está en en resolver las lecturas sucias. Por la misma razón anterior, al poner READ COMMITTED, si una transacción modifica un dato y otra la intenta leer, en vez de bloquear el acceso, la segunda hace una copia de los datos (sin la modificación ya que no está confirmada).




Enlace a la página principal del curso




-- Ángel D. Fernández González -- (2020).