Está en la página 1de 31

16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

Consultas de selección.
Consultas de acción o actualización.
Edición de los datos.
A las consultas que utilizan la sentencia SELECT se les denomina "Consultas de
selección". A las consultas que permiten la edición de los datos con INSERT,
Caso práctico UPDATE ó DELETE se les denomina "Consultas de actualización" o "Consultas de
acción".

En una fase anterior vimos como Noiba y Vindio  se


reunían con los socios del taller mecánico para mostrar
los resultados obtenidos hasta el momento: el diseño En esta unidad podrás conocer que existen distintos medios para realizar el tratamiento o
de un modelo que se adapta a la actividad cotidiana del edición de los datos. Desde la utilización de herramientas gráficas hasta el uso de
taller y que permite además acceder de una forma instrucciones o sentencias del lenguaje SQL que permiten realizar ese tipo de operaciones
rápida y sencilla a una información a la que antes, en de una forma menos visual pero con más detalle, flexibilidad y rapidez. El uso de unos
algunos casos no se podía acceder y en otros era un mecanismos u otros dependerá de los medios disponibles y de nuestras necesidades como
trabajo lento y con muchas posibilidades de cometer usuarios de la base de datos.
errores.
Todas las operaciones que se realicen respecto al tratamiento o edición de los datos deben
Con el lenguaje SQL y ayudándose de las asegurar que las relaciones existentes entre ellos se cumplan correctamente en todo
herramientas gráficas de que dispone MySQL, ha momento.
Alain Bachellier (CC BY-NC-SA) comprobado que puede extraer información muy útil
que le servirá para el control de la actividad y para Por otro lado, la ejecución de las aplicaciones puede fallar en un momento dado y eso no
prever y planificar decisiones futuras. debe impedir que la información almacenada sea incorrecta. O incluso el mismo usuario de
las aplicaciones debe tener la posibilidad de cancelar una determinada operación y dicha
Pero Noiba y Vindio aún no han terminado su trabajo con el lenguaje SQL y cancelación no debe suponer un problema para que los datos almacenados se encuentren
junto a ellos, ahora también va a trabajar Naroba, una nueva alumna que en un estado fiable.
está realizando la FCT en BK Sistemas Informáticos.
Todo esto requiere disponer de una serie de herramientas que aseguren esa fiabilidad de la
Durante todo este proceso algunos clientes del taller han cambiado de información, y que además pueda ser consultada y manipulada en  sistemas
domicilio, otros han decidido pintar su vehículo de otro color, algunos precios multiusuario sin que las acciones realizadas por un determinado usuario afecte
de referencia han subido, se ha decidido contratar otra persona para el taller, negativamente a las operaciones de los demás usuarios.
en el almacén se considera necesario prescindir de algunos recambios, etc.

Por último tendrá que asegurarse que, cuando esas modificaciones impliquen
cambios sobre una o más tablas, éstas se realicen como un bloque, es decir,
o todas o ninguna. Por ejemplo cuando se quiera recoger la factura de una
nueva reparación que implica modificar varias tablas, ¿qué pasaría si
después de añadir la fila en la tabla facturas se produce un error a la hora de
añadir las filas en realizan o incluyen, tablas que relacionan la reparación con
los recambios sustituidos o con la mano de obra? Para tratar esto Alejandra
deberá detenerse en el concepto de transacción. Ministerio de Educación y Formación Profesional (Dominio público)

Hasta el momento no conocemos ninguna sentencia que permita a Noiba


hacer estos cambios así que vamos a seguir avanzando en el conocimiento Materiales formativos de FP Online propiedad del Ministerio de
del lenguaje SQL buscando ahora las sentencias que nos faciliten la edición
Educación y Formación Profesional.
de los datos para añadir, modificar o borrar la información cuando sea
Aviso Legal
necesario.

Las bases de datos nos permiten almacenar datos con el propósito de poder obtener cierta
información a partir de ellos mediante la realización de consultas, como hemos visto en la
unidad anterior. Pero hay otra serie de operaciones que podemos realizar con los datos
almacenados como son las que nos permiten modificarlos, eliminarlos o bien añadir nuevos
datos. A estas operaciones se las denomina edición o tratamiento de datos. Realmente
todo son consultas que se hacen a la base de datos, y que pueden ser de dos tipos:
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 1/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 2/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

ellas) para entender bien todos los ejemplos propuestos.

1.- Herramientas gráficas para la edición


◄ 1
2
3
4
5
6

de la información.
Conexión a MySQL con Workbench
Caso práctico Para trabajar con Workbench, accede a la aplicación y realiza una conexión a tu
servidor de base de datos MySQL con tu usuario y contraseña y ya puedes
empezar a trabajar. Observa que el panel o sección izquierda muestra las bases
Aunque ya sabemos que Vindio y Noiba consideran
de datos instaladas en tu servidor, si está activada la pestaña Schemas. La
imprescindible para gestionar una base de datos el
pestaña Administration se utilliza para realizar otras tareas sobre el servidor de
dominio del lenguaje SQL, en las distintas fases de la
base de datos, como gestionar a los diferentes usuarios, realizar copias de
creación de la base de datos para el taller mecánico han
seguridad, inspeccionar el estado del servidor, etc.
procurado conocer las herramientas gráficas con las que
podían contar y utilizarlas en aquellos procesos en los Pon en uso la base de datos campeonato, haciendo doble clic sobre ella. Se
que le podían servir de ayuda. pondrá en engrita.
Pulsa sobre el triángulo a la izquierda del nombre de la base de datos, para
En el caso de la edición o tratamiento de los datos
desplegar sus objetos.
disponen, igualmente, de la posibilidad que el SGBD le
Pulsa sobre el triángulo a la izquierda del contenedor Tables y se desplegarán
permita añadir, modificar, eliminar datos y realizar otras
las tablas de la base de datos, tal y como aparecen en la imagen.
operaciones como transacciones, etc.; sin necesidad de
Alain Bachellier (CC BY-NC- escribir instrucciones SQL, simplemente pulsando unas
SA)
teclas determinadas o seleccionando opciones de un
menú. Siguiendo el mismo criterio que hasta ahora,
Noiba se plantea revisar  estas herramientas como complemento al uso del
lenguaje SQL.

Como venimos tratando en unidades anteriores, los SGBD disponibles en el mercado


incorporan herramientas gráficas para que tareas como el diseño, la creación de bases de
datos y de las tablas y la consulta de la información almacenada sea más sencilla. Lo
mismo ocurre con la edición de los datos, tanto dentro del SGBD como mediante
aplicaciones externas al propio gestor podemos añadir, modificar o eliminar filas de las
bases de datos desde una ventana de edición gráfica sin tener que escribir código SQL.

Estas herramientas facilitan las tareas cuando pretendemos realizar acciones sencillas,
tareas rutinarias o cuando el usuario no tiene conocimientos de programación, pero a lo
largo de las unidades vistas hasta el momento ya hemos podido llegar a la conclusión de Workbench (Elaboración propia)

que cuando se trata de acciones complejas en las que necesitamos tener un mayor
control de los datos que se van a alterar será necesario recurrir a nuestros

conocimientos de SQL.

Como herramientas gráficas que facilitan la edición de los datos de las tablas de una base
de datos MySQL veremos las siguientes:

MySQL Workbench y Navicat for MySQL, utilizadas en unidades de trabajo


anteriores
La aplicación web phpMyAdmin. Inserción de datos (filas)
  Comenzamos viendo un ejemplo de cómo insertar, modificar y eliminar datos con La inserción de registros permite introducir nuevos datos en las tablas que
Workbench en modo gráfico.
componen la base de datos. Para insertar registros en tablas, utilizando la
herramienta Workbench, en modo gráfico, debes seguir los siguientes pasos:
Todos los ejemplos  los puedes probar en la BD campeonato. Es importante que  tengas clara
la estructura, modelo o esquema de la BD  (las tablas que la forman y las relaciones entre
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 3/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 4/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

1.- Ir a la página inicial de Workbench, si no te encuentras en ella y abrir


conexión con el servidor.
2.- Seleccionar o poner en uso la base de datos con la que vas a trabajar,
haciendo doble clic sobre ella.
3.- Desplegar el contenedor de las tablas de la base de datos, haciendo clic
sobre el icono correspondiente.
4.- Seleccionar una tabla en la lista izquierda.
5.- En su menú contextual (un clic izquierdo) seleccionar la opción Select
Rows. Aparecerán todas las filas o registros de la tabla con un encabezado
de botones que nos permiten insertar, editar y eliminar filas, entre otras
opciones.
6.- Selecciona el botón o icono que aparece con el símbolo + y cuya acción
es Insertar nueva Fila (Insert new row).
7.- Escribe los datos correspondientes para cada campo del nuevo registro.
8.- Haz clic en el botón Apply para guardar los datos introducidos, o si se
desea seguir añadiendo otros registros, sigue introduciendo datos en la
siguiente fila y al final es cuando debes pulsar el botón Apply. Se utilizará el Workbench (Elaboración propia)
botón Cancelar (Revert) si no se desea guardar los datos.
9.- Observa que antes de aplicar o confirmar la operación, se muestra el SQL
correspondiente a la sentencia que se va a ejecutar, en este caso un INSERT. En caso de que se haya producido un error al intentar insertar los datos, habrá que
10.- Si la fila o filas se han añadido correctamente se mostrará un mensaje comprobar el mensaje que se muestra, e intentar solucionar el problema. Por
indicando que la operación se ha realizado con éxito, y permaneciendo en la ejemplo, si se intenta introducir un texto en un campo de tipo numérico se obtendrá
ventana proporcionada por la opción Select Rows se podrá ver, la lista de los un error como el siguiente: "columna no permitida aquí", y no se habrá realizado
datos contenidos en los registros que se han ido insertando. ninguna operación de la inserción del nuevo registro. O bien, una columna que es
11.- En caso contrario, se mostrará un mensaje de error. obligatoria la dejamos sin valor, o duplicamos el valor de una clave primaria o
columna con la restricción UNIQUE,  o bien ponemos como valor de una clave ajena
un valor no permitido infrigiendo la Integridad Referencial, etc. En todos estos casos
de error, pulsaremosen el borón de cancelar (Cancel) para retroceder a la pantalla
anterior y pulsaremos en el botón Revert para revertir los cambios de la pnatlla
visual.

Modificación de datos
Para modificar datos se procede de igual forma:

1.- Se despliega la tabla en la que se van a modificar datos, por ejemplo la


Workbench (Elaboración propia)
tabla juego.
2.- Se hace doble clic en las celdas de la tabla que se quieren modificar y se
escribe el nuevo dato, en este ejemplo se ha cambiado el valor de cdequipo del

juego WOW al valor 10.

3.- Se aplican los cambios pulsando en botón Apply, se mostrará la sentencia
SQL que se transmite al servidor (un UPDATE), y se pulsa otra vez Apply. Si
todo va bien se pulsa Finish y los datos quedan modificados.
4.- En este ejemplo, obtenemos un error, puesto que la columna cdequipo en la
tabla juego es clave ajena, que referencia a la tabla equipo, y no existe en la
tabla equipo  un equipo de código 10 (columna cdequipo); por tanto se está
infringiendo la Integridad Referencial. Igualmente se pueden obtener errores
por no respetar otras restricciones que se establecieron en el diseño y
creación de las tablas.
5.- Cuando se produce un error, se pulsa sobre el botón Cancel para cancelar
la operación y volver a la pantalla anterior, en la que debemos pulsar sobre el
botón Revert, para revertir los cambios.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 5/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 6/62


16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

Por ejemplo, con un borrado restrictivo (ON DELETE RESTRICT), no se podrá


eliminar un equipo, supongamos el '01' si tiene concursantes o juegos
relacionados, pero si se podrá eliminar el equipo '07' si no tiene ni
concursantes ni juegos relacionados.

Workbench (Elaboración propia)

Workbench (Elaboración propia)

Exportar datos a texto plano


Otra operación que se puede realizar con los datos de una tabla o el resultado de
una consulta, es exportarlos o guardarlos en un archivo de texto plano, o archivo
Workbench (Elaboración propia)
CSV.

Un archivo CSV es  un archivo de texto que almacena los datos en forma de

columnas, separadas por coma y las filas se distinguen por saltos de línea. Es

una forma muy sencilla de representar la información.
Son muy últiles para importar y exportar datos entre aplicaciones.
 
Para realizar esta tarea en modo gráfico, operamos como antes:

1.- Se despliega la tabla o la consulta de la que se quieren exportar los datos,


en este ejemplo los datos de la tabla equipo.
2.- Pulsa sobre el botón de exportar datos.
Eliminación de datos (filas) 3.- Por defecto, la exportación es a CSV, por lo das un nombre al archivo, en
la ubicación que te interese, en este ejemplo datos_equipo.csv y pulsas en
Guardar
Para eliminar filas de una tabla se procede de la misma forma: 4.- Si abres el fichero con cualquier editor de texto plano, como por ejemplo
Notepad verás los datos de la forma indicada en la tercera imagen.
1.- Se despliega la tabla de la que se va a elimnar alguna o algunas filas. Por
ejemplo la tabla  juego.
2.- Se marca la fila y se pulsa sobre el botón menos (-).
3.- Se aplican los cambios pulsando en el botón Apply, se mostrará la
sentencia SQL que se transmite al servidor ( un DELETE), y se pulsa otra vez
Apply. Si todo va bien se pulsa Finish y los datos quedan eliminados.
4.- Si se produce algún error, se cancela y volvemos a la pantalla anterior
revirtiendo cambios, como en el caso de las modificaiones/inserciones. Los
errores en la eliminación de filas pueden ser debidos a que se están
infringiendo las reglas de borrado que hemos asociado a las claves ajenas.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 7/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 8/62


16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

Podemos importar los datos almacenados en un archivo CSV a una tabla con un
diseño apropiado de columnas para almacenarlos.

Por ejemplo, vamos a importar los datos del fichero obtenido anteriormente a una
tabla de nombre equipo2 y con la misma estructura que la tabla equipo.

1.- Se despliega la tabla en la que se quieren importar los datos, en este


ejemplo la tabla equipo2.
2.- Pulsa sobre el botón de importar datos.
3.- Localiza el archivo CSV  con los datos a importar y pulsa Abrir.
4.- Selecciona la tabla de destino, en este ejemplo equipo2 y pulsas Next
(continuar)

Workbench (Elaboración propia)


5.- Ajusta los parámetros de importación y pulsa Next (continuar) hasta que la
importación finalice.

6.- Si despliegas la tabla equipo2 verás que se ha llenado con esso datos.
...

Workbench (Elaboración propia)

Workbench (Elaboración propia)

...

Workbench (Elaboración propia)

Notepad++ (Elaboración propia)


...

Importar datos en texto plano


https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 9/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 10/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

La instalación de WampServer es muy sencilla, basta con ejecutar el archivo


descargado y seguir el tutorial de instalación y configuración. Recuerda que
instala su propio servidor MySQL, por lo que si ya tienes un MySQL instalado
hay que controlar que ambos no pueden estar iniciados a la vez  escuchando
por el mismo puerto.

Desde el panel de control que proporciona WampServer tendremos acceso,


entre otros, a la herramienta PhpMyAdmin.

Workbench (Elaboración propia)

Recomendación WampServer (Elaboración propia)

Otros clientes gráficos para trabajar con MySQL son Navicat y PhpMyAdmin. Tutorial de uso de PhpMyAdmin.

Te indicamos para cada uno de ellos el enlace de descarga y un enlace a un Tutorial de uso de PhpMyAdmin
turorial de uso.

Navicat.

Enlace de descarga de Navicat para MySQL (uso de 15 días).

 Navicat para MySQL (15 días)

Tutorial de uso de Navicat para MySQL.

Tutorial de uso de Navicat

PhpMyAdmin

La forma más sencilla de dejar configurado el cliente gráfico PhpMyAdmin


para MySQL es descargar, en el caso de Windows, una paquete como
WampServer que ya lleva incluido PhpMyAdmin, en concreto incluye: Apache,
MySQL, Php y PhpMyAdmin listos para trabajar de manera conjunta.

Enlace de descarga de WampServer para Windows:

WampServer

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 11/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 12/62


16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

2.- Consultas de edición de datos. Actualmente no se puede modificar una tabla y seleccionar de la misma tabla en
la subconsulta. Esto se aplica a comandos tales como INSERT, REPLACE, UPDATE y
DELETE. Lo veremos en los siguientes apartados.

Caso práctico
Autoevaluación
Hasta ahora, Noiba y Vindio se han dedicado a
hacer consultas mediante la sentencia SELECT sobre Queremos añadir en la columna VEHICULOS.Modelo, el valor 'Matiz' para el
tablas que ya contenían datos. Esta operación, con vehículo de marca DAEWOO, ya que faltaba ese dato en la tabla. ¿De
ser la que se realiza con más frecuencia, no es qué tipo de consulta se trata?
suficiente para gestionar todos los movimientos que
puede registrar la información de una base de
INSERT
datos.

El paso siguiente será ver cómo puede editar esos UPDATE


Alain Bachellier (CC BY-NC-SA) datos para añadir, modificar o borrar las filas de
esas mismas tablas. DELETE

Para analizar este tipo de consultas de edición de datos Noiba se va a


centrar en la sintaxis que utiliza MySQL ya que, aunque mínimas, puede
haber ligeras diferencias entre distintos gestores. Respuesta incorrecta. INSERT, se utiliza para añadir filas nuevas en una
tabla. Si la fila ya existe, se trata de una modificación y se utilizará UPDATE
para cambiar el valor de esa columna.

Según el esquema que hemos presentado en unidades anteriores, las consultas que vamos Correcto. INSERT, se utiliza para añadir filas nuevas en una tabla. Si la fila
a tratar en esta unidad corresponden al lenguaje de manipulación de datos LMD, al igual ya existe, se trata de una modificación y se utilizará UPDATE para cambiar
que la sentencia SELECT; la diferencia es que si bien hasta ahora hemos visto consultas que el valor de esa columna.
devuelven datos, las consultas que vamos a ver a continuación son consultas de acción
porque cambian los datos almacenados en las tablas. Nos referimos a las consultas INSERT,
UPDATE y DELETE.
Incorrecto. INSERT, se utiliza para añadir filas nuevas en una tabla. Si la
Veamos brevemente en qué consisten: fila ya existe, se trata de una modificación y se utilizará UPDATE para
cambiar el valor de esa columna.

Sentencias para consultas de edición.

SENTENCIA SIGNIFICADO

INSERT Permite añadir datos a una o a varias filas de una tabla.

UPDATE
Se utiliza para modificar el contenido de las columnas para una o Solución
varias filas de una tabla.

Con esta sentencia se pueden eliminar una, varias o todas las filas
DELETE
de una tabla.
1. Incorrecto
TRANSACCIONES. Este concepto se ha tratado en unidades 2. Opción correcta
START
anteriores. Destacaremos que se utilizan para evitar que si en las 3. Incorrecto
TRANSACTION
consultas de acción que acabamos de ver se produce un error, la
COMMIT
base de datos pierda la integridad. Veremos en esta unidad como
ROLLBACK
trabajar con transacciones.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 13/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 14/62


16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

Como podemos ver en el formato de arriba, la sentencia INSERT de MySQL acepta la


inserción de varios registros a la vez.
3.- Añadir filas: La sentencia INSERT I.
Estos valores tienen que cumplir:

Deben tener el mismo tipo de datos que las columnas de la tabla.


Los valores de tipo cadena irán encerrados entre comillas.
Caso práctico Las fechas se escribirán entre comillas y con el formato AAAA-MM-DD.
Para los números se usará como separador de decimales el punto.
Cuando queramos que una columna no reciba ningún valor utilizaremos NULL. Si
Una vez creado el modelo de la base de datos asignamos el valor NULL a una columna definida como NOT NULL, INSERT devuelve error
TalleresFaber el siguiente paso era introducir los datos y la inserción no se produce.
en las tablas. Para poder estudiar el funcionamiento de Cuando se especifican los nombre de las columnas:
la sentencia SELECT en el capítulo anterior hemos Cada uno de los valores corresponde a cada una de las columnas.
partido de unos datos iniciales, pero está claro que La lista de columnas no tiene porqué contener las columnas en el mismo orden
necesitamos conocer la sentencia que nos permite en el que están declaradas en la estructura de la tabla.
tanto introducir los datos por primera vez en las tablas Cualquier columna que no se encuentre en la lista de columnas de esta orden se
vacías como añadir filas nuevas cada vez que sea rellenará con el valor NULL Si esa columna estuviera definida como NOT NULL,
necesario. Esta instrucción es INSERT y es la primera de recibirá el valor por defecto (por ejemplo una columna de tipo numérico recibirá
las instrucciones para consultas de acción que Noiba por defecto un 0, si es texto un espacio en blanco y si es fecha 0000-00-00).
se dispone a analizar. Ahora que la gestión del taller También podemos asignarle el valor por defecto escribiendo DEFAULT.
está en sus manos sabe que se van a presentar Cuando no se incluye lista de columnas:
situaciones en las que será necesario incluir nuevas Alain Bachellier (CC BY-NC- Si no se incluye en INSERT la lista de columnas, se deben introducir valores en
filas en alguna tabla y que si esta operación no se hace SA) todas las columnas y en el mismo orden que aparecen en la estructura de la
correctamente puede obtener resultados inesperados. tabla. Si no recordamos el orden de las columnas podemos usar DESCRIBE
NombreTabla. 
Veremos todas las opciones que ofrece esta instrucción para realizar Cuando una columna es de tipo autoincrementado, AUTO_INCREMENT, si no se escribe en
operaciones tan comunes en un taller como añadir nuevas facturas. la lista de columnas, recibe el valor siguiente al último valor almacenado en la tabla. Si
se declara, habrá que asignar un valor, que puede ser NULL, 0 ó ''.

Con relación a claves e índices:

La sentencia INSERT permite la inserción de nuevas filas o registros en un tabla existente. Si la tabla tiene una clave principal e intentamos insertar una fila con un valor en esa
columna que ya exista, se genera un mensaje de error y la inserción no se produce.
Existen dos formas básicas de la sentencia INSERT : Cuando la tabla contiene una clave ajena relacionada con la clave de otra tabla y con
integridad referencial, si el valor que se da a la clave ajena no existe en la tabla
Añadir una fila indicando explícitamente los valores que deben tomar las columnas, o relacionada se genera error y no se produce la inserción.
Extraer las filas de una tabla ya existente y añadirlas a otra tabla (utilizando consultas Si queremos insertar una fila que tenga un índice que no admita duplicados, un valor
SELECT con INSERT). repetido en esa columna, se produce un error y no se puede insertar.
El formato más sencillo de utilización de la sentencia INSERTt iene la siguiente sintaxis:
Ejemplos.
INSERT [INTO] NombreTabla [(Columna1, [, Columna2] …..)] VALUES (Valor1 [,
Veremos a continuación algunos ejemplos de cómo utilizar la sentencia INSERT con la
Valor2] ….) , (…);
sintaxis que hemos visto:

Ejemplo 1.

Donde: Inserta una fila en la tabla RECAMBIOS rellenando todas las columnas.

NombreTabla es el nombre de la tabla donde se van a insertar las filas.


 A continuación del nombre de la tabla, se indica la lista de nombres de columnas de INSERT INTO RECAMBIOS (IdRecambio, Descripcion, UnidadBase, Stock, PrecioReferencia) VALUES (
la tabla, separadas con comas y encerradas entre paréntesis. Podemos ver que los
nombres de columna son opcionales. Cuando no se especifica una lista de columnas,
se consideran, por defecto, todas las columnas de la tabla NombreTabla.
Valor1, Valor2, … son los valores que se van a asignar a las columnas que se han
indicado en la lista de columnas, separados con comas y encerrados entre paréntesis. Esta orden es equivalente a esta otra, puesto que se rellenan todas las columnas:
Estos valores formarán un nuevo registro de la tabla.
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 15/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 16/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

INSERT INTO RECAMBIOS VALUES ('ES_222_333', 'Espejo retrovisor interior', 'Unidad', 10, 250);

Ejemplo 2.

Añade una fila en la tabla RECAMBIOS, las columnas UnidadBase y PrecioReferencia tomarán el
valor: NULL. (Si no están definidos como NOT NULL).

Workbench (Elaboración propia)


INSERT INTO RECAMBIOS (IdRecambio, Descripcion, Stock) VALUES ('ES_222_333', 'Espejo retrovis

Ejemplo 3.

¿Podemos insertar varias filas con una única sentencia


que se conoce como INSERT extendido.
INSERT? Si se puede hacer, y es lo Ejercicio Resuelto INSERT
Un INSERT extendido, consiste en una sola sentencia INSERT que permite insertar varias filas
INTO
a la tabla de manera más eficiente, en una sola operación. El requisito que deben cumplir
las filas o valores a insertar es que se especifique en todas ellas las mismas columnas y en
el mismo orden. En la base de datos campeonato añade los siguientes registros en la tabla
equipo:
Por ejemplo, podemos insertar dos filas en la tabla REPARACIONES, ambas correspondientes a
averías del mismo vehículo. Las columnas que aparecen como NULL tomarán ese valor, 1.- Un nuevo equipo con los datos: código de equipo '08', nombre
excepto el IdReparación que tomará el siguiente valor por ser autoincrementado. 'Anaconda', comunidad 'Andalucía', año de fundación 2020.
2.- Un nuevo equipo con los datos: código de equipo '09' y nombre 
'Zumárraga'.
3.- En una sola operación inserta tres equipos con los siguientes datos:
INSERT INTO REPARACIONES VALUES (NULL, '1111 DEF', '2011.02-02', NULL, 'Ruptura correa ventil código '10' y nombre 'Equipo10', código '11' y nombre 'Equipo11', código
'12' y nombre 'Equipo12'.

Existe una sintaxis alternativa para INSERT: Mostrar retroalimentación

INSERT [INTO] NombreTabla SET Columna1 = Valor1, Columna2 = Valor2,…


-- 1

INSERT INTO equipo (cdequipo, nombre, comunidad, anio_funda) VALUES ('08


-- o también

INSERT INTO equipo VALUES ('08','Anaconda','Andalucía',2020);

Reflexiona -- Observa que son equivalentes las dos sentencias anteriroes

-- 2

INSERT INTO equipo (cdequipo, nombre) VALUES ('09', 'Zumárraga');

Como una opción más de las herramientas gráficas que venimos utilizando,

en MySQL Workbench podemos obtener el código SQL necesario para


-- 3

AÑADIR, MODIFICAR O BORRAR filas.


INSERT equipo (cdequipo, nombre) VALUES ('10','EQUIPO20'),

En la imagen vemos el código base para insertar una fila en la tabla EQUIPO 
('11','EQUIPO11'), ('12','EQUIPO12');

que se obtiene pulsado el botón derecho sobre la tabla a modificar y


seleccionando la opción INSERTAR. Lo mismo puede hacerse con las demás


órdenes de edición de datos.


https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 17/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 18/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

3.1.- Sentencia INSERT con SELECT.

En el apartado anterior hemos visto cómo introducir valores


directamente con la sentencia INSERT, pero también es posible
obtener esos valores a partir de la información existente en la base
Para saber más de datos, incluyendo una consulta utilizando la sentencia SELECT.

Está pensada como instrucción de migración de tablas y pretende


Si quieres consultar estas y otras opciones de INSERT accede al siguiente que la fuente de valores de un INSERT provenga de una consulta
enlace: SELECT.
Everaldo Coelho and
YellowIcon (GNU/GPL)
Manual de MySQL: Orden INSERT INSERT … SELECT

La sintaxis de INSERT con SELECT es la siguiente:

INSERT [INTO] NombreTabla1, [ (Columna1, [, Columna2] …) ]


SELECT {Columna1 [,
Columna2] … | *}
FROM NombreTabla2 [CLÁUSULAS DE SELECT];

Cuando no se especifican las columnas en la cláusula INSERT, se consideran todas las


columnas de la tabla.
Las columnas obtenidas con SELECT deben ser del mismo tipo, aunque no tengan el
mismo nombre, que las columnas correspondientes donde se van a insertar los datos.
En cuanto a las condiciones para insertar varias filas son las mismas que para insertar
una sola fila.

Como se puede ver la cláusula VALUES se sustituye por una consulta SELECT, con
lo cual se realizan inserciones de múltiples filas en una tabla con los datos
obtenidos de otra.

En la cláusula SELECT se especifican los valores que se van a dar a las columnas de la tabla
y pueden ser tanto columnas como valores constantes. Se pueden incluir valores
entrecomillados en vez de nombres de campos, lo cual permite mezclar valores obtenidos a
partir de una tabla con constantes.

Ejemplo 1. Partimos de una tabla denominada CATALOGO donde tenemos un listado de todos
los recambios de las distintas marcas de coches. La tabla catálogo tiene la siguiente
estructura;

CATALOGO (Codigo, Descripcion, Precio).

A partir de CATALOGO vamos a añadir a nuestra tabla RECAMBIOS nuevas filas:

Añade a la tabla RECAMBIOS una fila por cada artículo de la tabla CATALOGO que contenga la
palabra 'espejo'. Los datos que no están en la tabla consultada se especifican como
constantes: UnidadBase y Stock. El precio del catálogo se incrementa en un 30%.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 19/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 20/62


16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

INSERT INTO RECAMBIOS


Cierto. El orden de las columnas es posicional y en este caso no
SELECT Codigo, Descripcion, 'Unidad', 10, Precio*1.30
coincide.
FROM CATALOGO

WHERE Descripcion LIKE '%espejo%'; Falso.La tabla RECAMBIO solo aparece una vez.

Ejemplo 2.

Añade a la tabla RECAMBIOS una fila que contiene los datos del artículo más caro del catálogo.
Esta información se obtiene mediante subconsulta. Es necesario especificar las columnas
porque no se rellenan todas.
Solución
INSERT INTO RECAMBIOS (IdRecambio, Descripcion, Stock, PrecioReferencia) SELECT Codigo, Descr
FROM CATALOGO

WHERE Precio= (SELECT MAX(Precio) FROM CATALOGO);


1. Incorrecto
2. Opción correcta
3. Incorrecto
4. Incorrecto

Reflexiona
Te recordamos que no se pueden insertar datos en una tabla y seleccionar de
la misma en una subconsulta. Ejercicio Resuelto INSERT
INTO ... SELECT
A partir de la base de datos campeonato, añade los siguientes datos:
Autoevaluación 1.- Una nueva concursante de código 'A01', nombre 'Eva Salas' y cuota
40. Su fecha de inscripción, la fecha actual.
¿Es correcta la siguiente consulta? 2.- Haz que esa concursante participe en los juegos del equipo '01'. Para
ello debes insertar los datos apropiados en la tabla participa.
INSERT INTO RECAMBIOS (  Descripcion,IdRecambio, Precio) SELECT * FROM 3.- Un nuevo juego con los siguientes datos: código 'FOR', nombre
CATALOGO ); 'Fortnite', dificultad media y del equipo '04'.
No porque no se puede poner un * en la consulta SELECT. 4.- Asigna el juego 'Fortnite' a todos los concursantes que no estén
participando en juegos. Con fecha de inicio la actual y cero puntos.
No es correcta porque no puede duplicarse la clave principal.
No es correcta. Las columnas no coinciden. Mostrar retroalimentación

La tabla RECAMBIOS no puede aparecer dos veces.

Falso. No es necesario especificar las columnas.


-- 1

INSERT INTO concursante (cdconcur, nombre,fecha_inscri, cuota_inscri)

Correcto. No podemos añadir el IdRecambio porque ya está en la tabla VALUES('A01', 'Eva Salas',curdate(), 40);

(CATALOGO contiene todos los recambios) y al ser clave principal no se

puede duplicar. -- 2

INSERT INTO participa

SELECT 'A01', cdjuego, curdate(), 0

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 21/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 22/62


16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

FROM juego

3.2.- La sentencia REPLACE.


WHERE cdequipo='01';

-- 3

INSERT INTO juego (cdjuego,nombre,dificultad,cdequipo)

VALUES('FOR','Fortnite', 'media', '04');

Un problema frecuente a la hora de insertar filas es que intentemos


-- 4

añadir un valor que ya existe, en una columna que no admita


INSERT INTO participa

duplicados.
SELECT cdconcur,'FOR', curdate(), 0

En el caso de la sentencia INSERT existe la opción de añadir ON


FROM concursante

DUPLICATE KEY que permite modificar la fila anterior de la tabla con los
WHERE cdconcur NOT IN (SELECT cdconcur FROM participa);

datos nuevos que se insertan, aunque no siempre es conveniente.


Everaldo Coelho and
Ejemplo. YellowIcon (GNU/GPL)

Podemos hacer el siguiente INSERT de manera que si el IdRecambio ya


existe, lo que se hace es una actualización de datos.

INSERT INTO recambios

SET IdRecambio='ER_111_333', Descripcion='Espejos retrovisores laterales'

ON DUPLICATE KEY UPDATE Descripcion='Espejos retrovisores laterales';

Si el código 'EE_111_333' ya existe, modifica la descripción que tenía.

Existe una sentencia para añadir filas que supone una alternativa para la sentencia INSERT.
Se trata de la sentencia REPLACE que funciona igual que INSERT excepto en el caso de
columnas PRIMARY KEY o UNIQUE.

Cuando añadimos filas con REPLACE, si un valor de la tabla coincide con el valor
que queremos insertar para un índice PRIMARY KEY o UNIQUE en la nueva fila, se
borra la fila antigua antes de insertar la nueva.

Sentencia REPLACE:

La sintaxis de esta sentencia es:

REPLACE [INTO] NombreTabla VALUES (Valor1, Valor2, …) , (…. )

También se puede utilizar:

REPLACE [INTO] NombreTabla SET Columna1 = Valor1, Columna2 = Valor2, ….

Con SELECT:

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 23/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 24/62


16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

REPLACE [INTO] NombreTabla1, [ (Columna1, [, Columna2] …) ]


SELECT {Columna1 [, 1. Correcto
Columna2] … | *}
FROM NombreTabla2 [CLÁUSULAS DE SELECT]; 2. Incorrecto
3. Correcto
4. Incorrecto
El uso de esta sentencia sólo tendrá sentido en el caso de que exista la posibilidad de
duplicar claves o índices UNIQUE, ya que en el resto de valores se comporta de forma similar
a INSERT.

Al utilizar el comando REPLACE las filas afectadas por la consulta pueden ser:

Una sola fila si no ha necesitado eliminar ninguna fila para añadir la nueva.
Dos filas si ha necesitado eliminar una fila para añadir otra.

Autoevaluación
¿En qué se diferencian estas dos sentencias? Señala las opciones
correctas.

REPLACE INTO RECAMBIOS VALUES ('ER_111_333', 'Espejos retrovisores


laterales', '2 Unidades', 22, 250.50);
INSERT INTO RECAMBIOS VALUES ('ER_111_333', 'Espejos retrovisores
laterales', '2 Unidades', 22, 250.50);

En el caso de que la clave esté duplicada INSERT no añade ninguna fila,


REPLACE sí.

En el caso de que la clave esté duplicada ambas mantienen la fila


anterior.

Si la clave no está duplicada, ambas instrucciones añaden una nueva


fila.

Si la clave no está duplicada INSERT añade una nueva fila, REPLACE


sustituye la fila anterior por la nueva.

Mostrar retroalimentación

Solución
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 25/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 26/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

3.3.- Sentencia LOAD DATA INFILE 4.- Modificar filas: la sentencia UPDATE.

En un apartado anterior hemos visto que es posible insertar datos en


una tabla a partir de una fichero en texto plano, archivo .txt o .csv
Caso práctico
¿Recuerdas  los ficheros .CSV?  Vimos cómo hacer esa inserción o
importación de datos de manera gráfica con Workbench. También
vimos como exportar datos a un archivo de texto plano en modo Juan, responsable del departamento de Informática
gráfico.
de BK Sistemas Informáticos, se ha reunido hoy
Everaldo Coelho (YellowIcon) con Noiba, Vindio y Naroba para hablar del proyecto
Pues bien, la sentencia de MySQL que realiza esa tarea de insertar (GNU/GPL)
sobre el taller mecánico y su base de datos. Juan les
datos desde un archivo de texto plano es LOAD DATA.
ha recordado que si bien la sentencia SELECT es la
La sentencia LOAD DATA permite rellenar una tabla con registros cuyos datos están más utilizada del LMD, una vez puesta la base de
almacenados en un fichero de texto plano. La inserción de datos con LOAD DATA es muy datos en funcionamiento, seguro que será necesario
eficiente, pues realiza a una velcidadd muy alta. La sentencia opuesta, la que exporta datos realizar además de consultas otras operaciones que
a texto plano, es SELECT INTO .... OUTFILE. les permitan por ejemplo,  cambiar el estado de una
reparación a 1 cuando el vehículo ya está listo para
Para usar LOAD DATA debemos: emitir la factura o modificar la dirección del jefe de
Jonny Goldstein (CC BY) mecánica que ha cambiado de domicilio. Para ello se
Crear un archivo de texto plano, que contenga un registro por renglón con valores debe usar la sentencia apropiada.
separados por un carácter delimitador. Normalmente se utiliza el tabulador.
Es necesario respetar que el orden de las columnas sea el mismo que utilizamos en la Esta sentencia es UPDATE y tendrán que poner mucho cuidado en su
sentencia CREATE TABLE. aplicación porque una vez ejecutados los cambios, en principio, no será
No se encierra entre comillas ningún dato en el fichero de texto, sea del tipo que sea, posible volver atrás.
aunque es posible hacerlo si se indica en la sentencia.
Para valores que no conozcamos podemos usar valores nulos (NULL). Para representar
estos valores en nuestro archivo de texto debemos usar \N.
La sentencia UPDATE se utiliza para actualizar los valores de las columnas para una o varias
Además, debemos recordar que MySQL espera recibir fechas en el formato YYYY-MM-DD, que
filas de una tabla.
puede ser diferente a lo que nosotros estamos acostumbrados.
La sintaxis simplificada de esta sentencia es la siguiente:
Por ejemplo, para cargar el contenido del archivo de texto llamado datos_equipo.csv en una
tabla de la base de datos activa llamada equipo2 usaremos un comando como el de abajo.

LOAD DATA LOCAL INFILE "datos_equipo.csv" INTO TABLE equipo2 LINES TERMINATED BY ‘/r/n’; UPDATE NombreTabla | CombinaciónDeTablas

SET Columna1 = Valor1, …, ColumnaN = ValorN

[WHERE Condición ]

[ORDER BY …]

[LIMIT n]

Para saber más


NombreTabla: es la tabla que vamos a modificar. La modificación puede afectar a varias
tablas combinadas.
Puedes ver todas las opciones de LOAD DATA y más ejemplos desde el SET indica las columnas que se van a actualizar y los nuevos valores.
siguiente enlace: WHERE selecciona las filas que se van a actualizar. Si no se incluye la cláusula WHERE se
actualizarán todas las filas de la tabla.
Sentencia LOAD DATA en MySQL
Otros aspectos a tener en cuenta:

El orden en que se indiquen las columnas a modificar es indiferente.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 27/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 28/62


16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

Cuando la columna que se va a modificar aparece en la expresión que se calcula, el


UPDATE VEHICULOS

valor que se toma es el que tenía antes de la modificación. Ejemplo:


SET Matricula=’4545 ABC’

PrecioReferencia=PrecioReferencia+20 (el precio de referencia final es el precio inicial +


WHERE Matricula=’4455 ABC’;
20).
Con la instrucción UPDATE podemos actualizar el contenido de una columna de forma
global, es decir, para todas las filas.
Al modificar el contenido de una columna, esta columna deberá cumplir todas las
condiciones de dominio, clave principal, clave ajena e integridad referencial que Mostrar retroalimentación
tuviera al definirla.

Ejemplo 1.  Que la matrícula de la tabla VEHICULOS está relacionada con la matrícula
de la tabla REPARACIONES a través de integridad referencial con
La reparación recogida con el código 10 ha finalizado. Recogemos en la tabla reparaciones
actualización en cascada, por tanto todas las reparaciones
esta situación junto a la fecha de salida del vehículo reparado, que es la fecha actual.
correspondientes a la matrícula modificada verían modificada la
matrícula.

UPDATE REPARACIONES

SET Reparado=1, FechaSalida=CURDATE()

WHERE IdReparacion=10;

Ejemplo 2. Ejercicio Resuelto UPDATE


Para subir el Importe de las actuaciones en un 3% siempre que el tiempo estimado sea
inferior a 1 hora. Sería: Sobre la base de datos campeonato realiza las siguientes operaciones:

1.- Modifica el juego de código ELV, su nueva dificultad es media y hay


que incrementar en 3 su columna megusta.
UPDATE ACTUACIONES
2.- Incrementa la cuota de todos los concursantes en un 2%.
SET Importe = Importe * 1.03
3.- Incrementa en 5 los puntos del concursante de código A14 en el
WHERE TiempoEstimado < 1; juego de código FOE.
4.- Cambia el equipo de los concursantes que son hombres y que se
inscribieron antes de 2018. Su nuevo equipo será el de código '05'.
 Ejemplo 3. 

Ejemplo con tablas combinadas. El cliente Enrique Muriedas nos ha pedido que retrasemos Mostrar retroalimentación
30 días todas sus facturas.

UPDATE FACTURAS

INNER JOIN CLIENTES ON FACTURAS.CodCliente=CLIENTES.CodCliente


-- 1

SET FechaFactura=DATE_ADD(FechaFactura,INTERVAL 30 DAY)


UPDATE juego

WHERE Nombre='Enrique' AND Apellidos LIKE 'Muriedas%'; SET dificultad ='media', megusta=megusta+3

WHERE cdjuego='ELV';

-- 2

UPDATE concursante

SET cuota_inscri = cuota_inscri + cuota_inscri*0.02;

Reflexiona -- 3

UPDATE participa

SET puntos=puntos+5

WHERE cdconcur='A14' AND cdjuego='FOE';

Partiendo de los datos contenidos en TalleresFaber ¿Qué ocurre al ejecutar la


siguiente consulta de actuación?


-- 4

UPDATE concursante

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 29/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 30/62


16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:26 GBD05.- Edición de los datos.

SET cdequipo='05'

4.1.- Sentencia UPDATE con SELECT.


WHERE year(fecha_inscri)<=2018 AND sexo='H';

Se puede incluir una sentencia SELECT o una subconsulta en una


sentencia UPDATE de distintas formas:

Incluida en la condición WHERE.


En la asignación de nuevos valores con SET.

En una misma consulta de actualización pueden incluirse varias Everaldo Coelho


(YellowIcon) (GNU/GPL)
subconsultas.

Cuando la sentencia SELECT va dentro de la cláusula WHERE la sintaxis a seguir es la siguiente:

UPDATE NombreTabla

SET Columna1 = Valor1, Columna2 = Valor2, …

WHERE Columna3 = (SELECT …… );

Ejemplo 1.

Bajar el precio de referencia un 5% para los recambios que no se hayan incluido en ninguna
reparación:

UPDATE RECAMBIOS

SET PrecioReferencia = PrecioReferencia*0.95

WHERE IdRecambio NOT IN (SELECT IdRecambio FROM Incluyen);

Cuando la sentencia SELECT forma parte de SET debe cumplir que:

Debe seleccionar una única fila y mismo número de columnas que las que hay entre
paréntesis al lado de SET.
No puede utilizar la misma tabla que se modifica.

UPDATE NombreTabla

SET Columna1 = (SELECT Col1, … ), Columna2 = (SELECT Col2, … )

WHERE Condición;

Ejemplo 2.
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 31/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 32/62
16/4/22, 18:26 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

Restar del stock de recambios las unidades que se han sustituido del recambio BB_000_777: reparados, es decir, que no tengan fecha de salida o que el atributo reparado
sea 0.

UPDATE RECAMBIOS

Mostrar retroalimentación
SET stock = stock - (SELECT sum(Unidades) FROM Incluyen where IdRecambio='BB_000_777')

WHERE Idrecambio='BB_000_777';

UPDATE REPARACIONES

SET Observaciones=’Contactar con el cliente'

WHERE FechaSalida IS NULL OR Reparado=0;

Reflexiona
Tal como se indicó con anterioridad, en caso de que para poder realizar la
actualización de una tabla necesitemos consultar la misma tabla que se está
actualizando, MySQL daría un error ya que la tabla que se está actualizando
estaría bloqueada y no permitiría realizar consultas.

Ejercicio Resuelto UPDATE con


Por ejemplo, si quisierámos aumentar la cuota en 5 euros a aquellos concursantes cuya
SELECT
cuota medio es menor a la media de las cuotas de los concursantes, la sentencia de
actualización siguiente daría error:
En la base de datos campeonato realiza las siguientes operaciones:

1.-  A los juegos que no tienen ningún valor en su atributo megusta se le


UPDATE concursante
debe asignar el menor valor de los megusta de los juegos.
SET cuota_inscri= cuota_inscri+5
2.- A los concursantes que no están particpando en ningún juego se les
WHERE cuota_inscri <=(SELECT AVG(cuota_inscri) FROM concursante); debe incrementar la cuota en 10 euros.

Mostrar retroalimentación
Esta sentencia de actualización daría error porque en la subconsulta aparece la tabla
concursante que es la misma que vamos a actualizar.

Entonces, ¿no se podrían realizar este tipo de sentencias? Sí se podría y la forma sería
creando una tabla temporal de la tabla que queremos consultar. Por ejemplo, en el caso
anterior se podría poner: -- 1

UPDATE juego

SET megusta=(SELECT MIN(megusta) FROM (SELECT * FROM juego )AS deriv)

WHERE megusta IS NULL;

UPDATE concursante

SET cuota_inscri= cuota_inscri+5

-- 2

WHERE cuota_inscri <=(SELECT AVG(cuota_inscri) FROM (SELECT * FROM concursante) as der);


UPDATE concursante

SET cuota_inscri=cuota_inscri+10

WHERE cdconcur NOT IN(SELECT cdconcur FROM participa);

Ejercicio resuelto
En la columna Observaciones de la tabla REPARACIONES escribir el texto
'Contactar con el cliente' para aquellos vehículos que no hayan sido Para saber más
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 33/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 34/62
16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

Para ampliar la información sobre las consultas de actualización con UPDATE


accede al manual de MySQL en el siguiente enlace:
5.- Eliminar filas: la sentencia DELETE.
Sintaxis de la sentencia UPDATE

Caso práctico
En la gestión de la base de datos del taller mecánico,
Noiba y Naroba se han encontrado con la necesidad
de eliminar un recambio del almacén que corresponde
a un modelo de vehículo que no tiene ninguno de
nuestros clientes y que ha dejado de fabricarse.

Con las sentencias revisadas hasta el momento


pueden cambiar el valor de las filas almacenadas, pero
no eliminar la fila por completo. Noiba le dice a Naroba
que revise ahora la última sentencia de las consultas
de acción, lo que le permitirá realizar todas las
operaciones sobre los datos de TalleresFaber
Alain Bachellier (CC BY-NC-SA) necesarias para mantener al día la información. Esta
vez le toca la consulta DELETE, con la que podrá eliminar
los recambios que han quedado obsoletos.

La instrucción DELETE se utiliza para borrar filas en una o más tablas. La sintaxis para una
sola tabla es:

DELETE FROM NombreTabla [WHERE Condición] [ORDER BY..] [LIMIT n]

La sintaxis para múltiples tablas es:

DELETE NombreTabla1, NombreTabla2, … FROM CombinaciónDeTablas [WHERE Condición]

No es conveniente borrar varias tablas en una sola instrucción, sobre todo si


tenemos claves relacionadas porque el orden de borrado puede ser incorrecto. Sí
podemos usar varias tablas combinadas, en FROM para seleccionar las filas de la tabla
que queremos borrar.
CombinaciónDeTablas: La combinación de tablas se usa si la condición para borrar las
filas depende del contenido de otra tabla. En este caso debemos incluir en DELETE el
nombre de la tabla que se va a borrar. Por ejemplo borrar los clientes de los que no
tengamos vehículos en la tabla vehículos.
WHERE sirve para especificar condiciones. En la condición se puede utilizar una
subconsulta.
Como vemos se puede utilizar la instrucción DELETE sin condiciones, con lo cual se
borrarían todas las filas de una tabla. Una vez borrada una tabla, no se puede
recuperar.
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 35/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 36/62
16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

Ejemplo 1.

Hay que dar de baja, eliminar, los recambios cuyo stock es 0 unidades.
Debes conocer
DELET FROM recambios

Para eliminar todas las filas de una tabla podemos usar la sentencia TRUNCATE,
WHERE stock =0;
cuya sintaxis es:

TRUNCATE TABLE NombreTabla;


Ejemplo 2.
TRUNCATE mejora el rendimiento de DELETE cuando se desea eliminar todas las
Elimina las filas de la tabla CLIENTES de los cuales no tenemos ningún VEHICULO registrado. filas porque es más rápida. Además en el caso de DELETE si eliminamos el
contenido de una tabla que tiene una columna autoincrementada, el servidor
MySQL recuerda el último valor que se almacenó en esa columna; en el caso
de TRUNCATE no se recuerda y si se inserta una nueva fila en la columna
DELETE CLIENTES

autoincrementada comenzará por el valor 1.


FROM CLIENTES LEFT JOIN VEHICULOS ON CLIENTES.CodCliente = VEHICULOS.CodCliente

WHERE Matricula IS NULL;

Reflexiona
DROP TABLE EMPLEADOS;

DELETE FROM EMPLEADOS;

¿En qué se diferencian estas dos consultas?

Mostrar retroalimentación

Como recordarás cuando vimos el LDD existe una instrucción para


borrar tablas: DROP que no es lo mismo que DELETE. En el caso de DROP
la tabla desaparece, en el caso de DELETE la tabla existe, pero sin filas.
Recuerda que con el LMD no podemos alterar la estructura de
nuestras bases de datos, sólo su contenido.

Cuando hablamos de borrado de filas en una tabla tenemos que tener en cuenta
las restricciones que se hayan definido en esa tabla, si existen claves ajenas
relacionadas y si tienen establecido o no borrado en cascada, etc.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 37/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 38/62


16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

5.1.- Sentencia DELETE con SELECT


Ejercicio Resuelto DELETE
Al igual que las sentencias INSERT y UPDATE vistas anteriormente, En la base de datos campeonato realiza las siguientes operaciones:
también se pueden hacer borrados de registros utilizando consultas
como parte de las tablas donde se hará la eliminación o como parte de 1.- Elimina los concursantes que no participan en ningún juego.
la condición que delimita la operación. 2.- El concursante de nombre Ismael Rojo y código A33 se da de baja.
Debes eliminarlo.  ¿Cómo afecta su elimnación a las tablas consursante
Por ejemplo, en la base de datos campeonato para eliminar los juegos y participa?
en los que no participa ningún concursante, redactaríamos la siguiente 3.- Se deben dar de baja los equipos de nombre  'Los rebeldes' y  'El
sentencia: parral'. Indica si se ha producido algún error y razona la causa.
Everaldo Coelho and
YellowIcon (GNU/GPL)

Mostrar retroalimentación
DELETE FROM juego

WHERE cdjuego NOT IN (SELECT cdjuego FROM participa);

1.-

DELETE FROM concursante

IMPORTANTE: Al igual que en la modificación de registros, si la sentencia de


WHERE cdconcur NOT IN (SELECT cdconcur FROM participa);
borrado incluye una subconsulta sobre la misma tabla donde se van a borrar los
registros, MySQL daría un error ya que la tabla estaría bloqueada y no se
permite realizar consultas.
2.-

Al igual que antes, sí se podrían realizar estas sentencias de borrado utilizando una tabla
temporal. DELETE FROM concursante

WHERE nombre LIKE 'Ismael Rojo' AND cdconcur='A33';

Por ejemplo, si quisiéramos elliminar aquellos juegos con menos megusta que la media de la
media de los megusta de todos los juegos, la sentencia de borrado tendría que ser:
Tabla concursante: como este concursante es ídolo de otros
concursantes (clave foránea ON DELETE SET NULL)  observa se pone a 
DELETE FROM juego
NULL el cdidolo de esos concursante.
WHERE megusta <(SELECT MIN(megusta) FROM (SELECT * FROM juego) as deriv);
Tabla participa:  en esta tabla el código de un concursante es clave
ajena con ON DELETE CASCADE, lo que implica que al eliminar al
consursante Ismael Rojo de código 'A33' se eliminarán en cascada
todas las filas que huiera de él en la tabla participa.
3.-

Para saber más DELETE FROM equipo

WHERE nombre LIKE 'Los rebeldes';


Para ver más ejemplos sobre  el uso de la sentencia DELETE puedes acceder al
siguietne enlace:

La sentencia DELETE en MySQL El sistema arroja un error de borrado haciendo referencia a claves
foráneas, el motivo es el siguiente: este equipo tiene su código como
clave ajena de las tablas concursante y juego con la restricción ON
DELETE RESTRICT, lo que implica que no se podrá eliminar un equipo si
tiene filas relacionadas en alguna de esas tablas; y resulta que el
equipo 'Los rebeldes' tiene filas relacionadas en esas tablas.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 39/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 40/62


16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

DELETE FROM equipo

WHERE nombre LIKE 'El parral'; 6.- Transacciones: Concepto.


El equipo El parral si se puede eliminar, pues no tiene filas
relacionadas en las tablas concursante ni en el tabla juego.
Caso práctico
Todas las consultas de edición que hemos ido
repasando con Noiba, Vindio y Naroba  tienen que
efectuase con precaución ya que alteran la
información contenida en una base de datos. Vindio
ya tiene experiencia y sabe lo que ocurre si alguien al
intentar borrar una fila de una tabla olvida la cláusula
WHERE en la instrucción SQL, no sólo desaparecerán
todas las filas de la tabla si no que la acción puede
afectar a otras tablas si se ha definido borrado en
cascada. ¿Qué ocurriría si mientras está registrando
Alain Bachellier (CC BY-NC-SA)
todas las actuaciones que se han llevado a cabo en
una reparación y los recambios que se han
sustituido, alguien desconectase el ordenador por error? Ellos ya saben que
existe una forma de dar marcha atrás siempre y cuando no se hayan validado
los cambios. ¿No te parece que deberías conocerla tú también?

Una de las ventajas de las bases de datos relacionales es la capacidad de realizar


transacciones. Ya habíamos hablado de ellas en una unidad anterior, las vemos ahora más
detenidamente.

Una transacción es un bloque diferenciado de operaciones de escritura sobre una o


más tablas, cuyo resultado puede ser confirmado o revocado en su totalidad. Un ejemplo
típico es la realización de una operación de transferencia bancaria entre dos cuentas. En el
caso de que surgiera algún problema, por ejemplo un corte en el suministro eléctrico,
podríamos haber realizado la anotación de salida en la cuenta de origen y no haber
realizado la anotación correspondiente de entrada en la cuenta de destino. Si ambas
operaciones no se ejecutan por completo se produce una base de datos inconsistente. 
Este problema podría evitarse si pudiéramos regresar al estado inicial.

Una transacción que cambia el contenido de una base de datos debe modificarla
de un estado consistente a otro. Un estado de una base de datos consistente es
cuando se satisfacen todas las restricciones de integridad de los datos.

Una transacción incompleta afecta a la integridad de la base de datos. Los SGBD


relacionales permiten al usuario definir restricciones; otras reglas de integridad, como la
integridad referencial, integridad de entidad, etc., son aplicadas por el propio sistema
cuando la estructura de la base de datos está bien definida, lo que le permite validar por sí
mismo algunas transacciones. Por ejemplo, añadir un vehículo que ya existe produce un
error en la regla de integridad de la clave primaria.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 41/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 42/62


16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

CIERTO. Cuando se infringe la restricción de clave ajena el registro no


se puede añadir.

Reflexiona NO ES LA OPCIÓN CORRECTA. Se infringe la restricción de clave


ajena. La fila no se actualiza.
Aunque el SGBD está diseñado para restaurar una base de datos al estado
consistente previo a una transacción, cuando algún suceso la interrumpe, las NO ES CORRECTO. Cuando se infringe la restricción de clave ajena la
transacciones en sí las define el usuario o el programador y deben estar bien fila no se añade.
definidas porque el SGBD no garantiza que el significado semántico de la
instrucción refleje el suceso real.

Algunas órdenes SQL llevan implícita la finalización de una transacción. En general esto
ocurre con todas las instrucciones que pertenecen al LDD como crear, modificar y borrar
tablas, bases de datos, índices, etc.
Solución
A continuación se listan los nombres de las sentencias de MySQL que provocan la
finalización de una transacción:

ALTER FUNCTION, ALTER PROCEDURE, ALTER TABLE, BEGIN, CREATE DATABASE, CREATE FUNCTION, 1. Incorrecto
CREATE INDEX, CREATE PROCEDURE, CREATE TABLE, DROP DATABASE, DROP FUNCTION, DROP INDEX, 2. Opción correcta
DROP PROCEDURE, DROP TABLE, LOAD MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, 3. Incorrecto
START TRANSACTION, TRUNCATE TABLE, UNLOCK TABLES. 4. Incorrecto

Si se incluyen en una transacción y esta falla, la transacción no podrá deshacerse.

Recuerda que en MySQL para poder utilizar transacciones necesitamos tablas


InnoDB. Actualmente son las tablas por defecto.

Autoevaluación
¿Qué ocurre en nuestra base de datos si añadimos una fila en la tabla
REPARACIONES referente a un vehículo que no hemos registrado y tampoco
a su propietario?

La matrícula no estaría relacionada pero no daría error de integridad.


No se puede. Nos daría error al introducir la matrícula por pérdida de
INTEGRIDAD REFERENCIAL.
Se actualizaría en cascada porque las tablas están definidas ON UPDATE
CASCADE.

Se añade la fila, pero nos avisa del error.

INCORRECTO. Cuando se infringe la restricción de clave ajena la fila no


se puede añadir.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 43/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 44/62


16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

Establecer un punto intermedio, o punto de salvaguarda o restauración,  con


SAVEPOINT, a partir del cual se podrá deshacer la transacción. Un punto de restauración
6.1.- Procesamiento de transacciones con es un marcador que puedes establecer dentro del contexto de la transacción.
Deshacer los cambios desde un punto de restauración (ROLLBACK TO SAVEPOINT). Debes
SQL. tener en cuenta que la sentencia ROLLBACK finaliza la transacción, pero ROLLBACK TO
SAVEPOINT no la finaliza

Aunque el instituto ANSI ha definido estándares también para las Ejemplo 1.


transacciones, no todas las versiones de SQL siguen el estándar
ANSI, por tanto nos referiremos a la versión que utiliza MySQL como En la base de datos campeonato, y estando activado autocommit en el servidor MySQL
en apartados anteriores. comprueba que la siguiente transacción permite deshacer cambios y que no queden
confirmados en la base de datos. (No se eliminan los juegos indicados)
Por defecto MySQL no trabaja con transacciones, por tanto cada
sentencia queda realmente ejecutada sobre la base de datos. Sin
embargo esto se puede modificar, de forma que no se actualice la
use campeonato;

base de datos al ejecutar INSERT, UPDATE o DELETE hasta que el


Everaldo Coelho and START TRANSACTION;

YellowIcon (GNU/GPL) usuario confirme esos cambios; permitiendo recuperar la información


DELETE FROM juego

si se produce un error o un fallo de software o de hardware.


WHERE cdequipo LIKE '03';

ROLLBACK;

-- comprobación

Por defecto MySQL trabaja con el modo AUTOCOMMIT activado. Si utilizas tablas
SELECT * FROM juego;
InnoDB y quieres trabajar con transacciones de forma permanente puedes
desactivar este modo poniendo:

SET AUTOCOMMIT=0;
Ejemplo 2.
COMMIT;
Prueba ahora esta transacción con un punto de salvaguarda o restauración. Comprobarás
Como habrás observado es necesario confirmar o ignorar los cambios que que se ha podido deshacer hasta el punto de restauración.
realizados.

use campeonato;

Aunque trabajes en modo AUTOCOMMIT=ON (AUTOCOMMIT activado), puedes trabajar con START TRANSACTION;

transacciones temporalmente. Los pasos para usar transacciones en MySQL son los DELETE FROM juego

siguientes: WHERE cdequipo LIKE '03';

SAVEPOINT sp1;

1.- Iniciar una transacción usando la sentencia BEGIN o START TRANSACTION. INSERT INTO juego VALUES('MIT', 'Mi Transacción', 'alta',1,'01');

2.- Realizar las operaciones de actualizar, insertar o eliminar filas de la base de datos. ROLLBACK TO SAVEPOINT sp1;

3.- Si se quieren validar los cambios en la base de datos usamos COMMIT para COMMIT;

completar la transacción. Si sucede algún problema podemos utilizar la sentencia -- comprobación

ROLLBACK para cancelar todos los cambios que se hayan realizado hasta ese momento. SELECT * FROM juego;

SELECT * FROM participa;

Workbench (Elaboración propia) Debes conocer


Como ves en la imagen, todas estas opciones se pueden seleccionar desde la barra de En el apartado anterior has visto cuáles son las principales sentencias para
herramientas de Workbench. trabajar con transacciones, pero existen otras sentencias relacionadas con el
uso de las transacciones.
Además es posible:
Sentencias relacionadas con el uso de transacciones en MySQL. (pdf -
0,42 MB)  

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 45/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 46/62


16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

Para saber más Solución


Si necesitas más documentación sobre el uso de comandos en transacciones
puedes acceder al manual en el siguiente enlace:

Comandos transaccionales en MySQL 1. Incorrecto


2. Incorrecto
3. Incorrecto
4. Opción correcta

Autoevaluación
La sentencia:
Ejercicio Resuelto
UPDATE RECAMBIOS SET Stock=Stock+2 WHERE IdRecambio='BJ_111_666';
Se ejecuta con el modo AUTO_COMMIT desactivado. ¿Se puede deshacer? Transacciones
La sentencia UPDATE no se puede deshacer.

En el servidor MySQL realiza lo siguiente:


No, previamente deberíamos haber ejecutado START TRANSACTION.

1.- Crea una base de datos, llamada transa, ccon una sola tabla llamada
No, es necesario activar AUTO_COMMIT. tabla1, que tenga una única columna de tipo entero llamada colum1.
Inserta en ella tres registros cualesquiera.
Sí, con ROLLBACK. 2.- Asegúrate que el modo AUTOCOMMIT está activado (para ello puedes
ejecutar el comando SHOW VARIABLES LIKE 'autocommit';).
3.- A continuación, comienza una transacción que incremente en 10 el
Incorrecto. En modo transacción la sentencia no se ejecuta si no se valor de al columna colum1 en todos los registros, y que inserte un nuevo
confirma. registro. Confirma la transacción y visualiza el nuevo contenido de la
tabla.
4.- Inicia una nueva transacción que inserte dos nuevos registros en la
No es correcto. Con AUTO_COMMIT desactivado los cambios no se ejecutan tabla y que incremente en 100 el valor de todos los registros. En este
realmente si no se confirman. caso la transacción no se confirmará, sino que se deshará. Visualiza el
contenido actual de la tabla.
5.- Ahora inicia una nueva transacción. Seguidamente, crea una
No es la opción correcta. Si activamos AUTO_COMMIT los cambios se segunda tabla, llamada tabla2, con un solo campo de tipo carácter.
ejecutan automáticamente. Inserta en la tabla dos registros. Por último, cancela la operación para
que no se efectúen estas operaciones, y comprueba si se ha creado la
tabla y se han insertado los registros en la misma. ¿Se ha podido
cancelar la operación?
Cierto. Con AUTO_COMMIT desactivado una sentencia UPDATE se puede 6.-   Por último, comienza una nueva transacción. Elimina la base de
deshacer. datos transa. Intenta deshacer la operación. Comprueba si se ha
eliminado la base de datos del servidor.

Mostrar retroalimentación

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 47/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 48/62


16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

6.2.- Propiedades de las transacciones.


-- 1

CREATE DATABASE transa;

use transa;

CREATE TABLE tabla1(


Las transacciones presentan una serie de propiedades que
colum1 INTEGER
garantizan su fiabilidad. Esas propiedades, denominadas ACID, son
);
las siguientes:
INSERT INTO tabla1 VALUES(1), (2),(3);

Atomicidad.- Una transacción es una unidad indivisible, o se


-- 2

ejecutan todas las órdenes de forma adecuada o no se guarda


SHOW VARIABLES LIKE 'autocommit';

ningún cambio producido sobre los datos.


Consistencia.- Cuando una transacción se ejecuta con éxito la


Everaldo Coelho and
-- 3

base de datos estará en un estado consistente, y si no se YellowIcon (GNU/GPL)

START TRANSACTION;

ejecuta con éxito se deshacen las órdenes de la transacción


UPDATE tabla1

regresando al estado de consistencia anterior.


SET colum1=colum1+10;

Durabilidad.- Los cambios que produce una transacción una vez finalizada son
INSERT INTO tabla1 VALUES(100);

permanentes, aunque se produzcan fallos posteriores en el sistema.


COMMIT;

Aislamiento.- Si varias transacciones se realizan de forma concurrente por distintos


select * from tabla1;

usuarios, el mismo elemento de datos que está siendo utilizado por una transacción

no puede ser utilizado por otra hasta que la anterior termine. Esto se traduce en que
-- 4

los cambios que produce una transacción no sean visibles por las demás hasta que
START TRANSACTION;

ésta termine. Si no se mantiene el nivel adecuado de aislamiento pueden darse


INSERT INTO tabla1 VALUES(5), (15);

distintos resultados al trabajar con varias transacciones.


UPDATE tabla1

Estos problemas derivados del  acceso concurrente a datos se tratan en el apartado


SET colum1=colum1+100;

siguiente.
ROLLBACK;

select * from tabla1;

En esta imagen de la configuración del servidor MySQL obtenida del programa MySQL
-- 5

Workbench, puedes ver el nivel de aislamiento de las transacciones en tablas InnoDB de


START TRANSACTION;

MySQL, tal como se establece en la configuración por defecto.


CREATE TABLE tabla2(

colum2 CHAR

);

INSERT INTO tabla2 VALUES('A'),('B');

ROLLBACK;

-- comprobación: no se ha podido deshacer, pues hay una sentencia DDL

SHOW TABLES;

SELECT * FROM tabla2;

-- 6

START TRANSACTION;

DROP DATABASE transa;

ROLLBACK;

-- comprobación: no se puede deshacer, pues es una sentencia DDL


Workbench (Elaboración propia)

SHOW DATABASES;

Autoevaluación
Relaciona los conceptos siguientes con su significado:

Ejercicio de relacionar
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 49/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 50/62
16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

Concepto Relación Significado

1 Una transacción sin éxito vuelve a su estado


7.- Formas de acceso a los datos: acceso
Atomicidad inicial.
concurrente.
En entornos multiusuario las bases de datos
2
han de tener la misma respuesta que en
Consistencia
entornos monousuario.

3
Cada transacción es una unidad indivisible.
Caso práctico
Durabilidad
Aunque con el uso de transacciones en las consultas
4 Una transacción finalizada produce cambios de edición, Noiba y sus compañeros se aseguran de
Aislamiento permanentes. que las operaciones de modificación de los datos se
ejecuten completamente o no se ejecuten, este no es el
Enviar único problema que puede hacer perder la consistencia
de una base de datos como TalleresFaber.
Todas estas propiedades pretenden evitar problemas derivados del
acceso de varias transacciones a los mismos datos. Son varias las personas que van a acceder a los datos
almacenados una vez que la base de datos esté en
explotación: personal de administración, la encargada
de recambios, etc.

¿Qué ocurriría si una persona de administración intenta Alain Bachellier (CC BY-NC-
modificar el precio de un recambio mientras la SA)

encargada de recambios está facturando una


reparación a un cliente que ha sustituido ese recambio? A esto se le
denomina acceso concurrente y nuestra base de datos debe saber controlar
el resultado de la ejecución concurrente de varias transacciones. ¿Quieres
saber cómo se hace?

Cuando una base de datos está diseñada para que la utilice un solo usuario no se nos
presenta el problema de que dos transacciones intenten acceder a la vez a los mismos
datos, pero en su mayoría, las bases de datos se diseñan para múltiples usuarios y esto
origina que se puedan dar transacciones concurrentes múltiples. Por eso el SGBD debe
disponer de controles que garanticen la consistencia y la integridad de la base de datos.

La coordinación de la ejecución simultánea de varias transacciones en un SGBD se


denomina control de concurrencia y si no se mantiene el nivel de aislamiento adecuado
se pueden dar los problemas siguientes:

Dirty Read - Se produce cuando una transacción modifica los datos y otra transacción los
lee antes de que la primera transacción termine.

Non Repeatable.- Una transacción lee un dato, otra lo modifica y termina. Si la primera
transacción intenta leer ese dato que ha sido modificado o borrado, obtiene un valor
distinto. Dos lecturas de la misma transacción sobre el mismo dato producen resultados
diferentes.

Phantom.- Mientras una transacción se está ejecutando, otra añade una fila, que es leída
por la primera transacción. Dos lecturas de la misma transacción, sobre la misma tabla,
producen resultados diferentes.

De los problemas que acabamos de ver se obtienen 4 niveles de aislamiento para una
base de datos:
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 51/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 52/62
16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

READ UNCOMMITED.- Con este nivel se permiten transacciones en las que se


pueden dar los 3 problemas que acabamos de ver. b Lectura Escritura
READ COMMITED.- No se pueden producir dirty reads, pero sí el resto de problemas.
REPEATABLE READ.- El único problema que puede presentar es el de phantoms. Es c Escritura Lectura
el nivel por defecto de las tablas InnoDB en MySQL.
SERIALIZABLE.- No se puede producir ninguno de los problemas que hemos visto. d Escritura Escritura
Nota: Denominamos operación de lectura a SELECT y de escritura a las
operaciones que modifican las tablas:
a

Para saber más


b
Problemas que puede ocasionar el acceso concurrente a los datos.

Ejemplos de problemas del acceso concurrente (pdf - 0,21 MB)


c
Si deseas obtener más información sobre los niveles de aislamiento de las
transacciones con tablas InnoDB en MySQL, puedes consultar el manual
desde el siguiente enlace:
d
Niveles de aislamiento de transacciones en MySQL.

Mostrar retroalimentación
Como estás viendo, estos problemas se producen porque las operaciones en una
transacción se ejecutan en serie y éstas no se pueden hacer en cualquier orden cuando
operan sobre los mismos datos o sobre datos relacionados.

El propio SGBD mediante el planificador se encarga de establecer el orden en


que se deben realizar las operaciones incluidas en las transacciones
concurrentes garantizando además el uso eficiente del procesador.
Solución

El planificador establece este orden basándose en algoritmos de control de concurrencia,


que dan lugar a distintos métodos de bloqueo. Veremos a continuación cuáles son esos 1. Incorrecto
métodos. 2. Correcto
3. Correcto
4. Correcto

Autoevaluación
¿Cuáles de las siguientes operaciones crees que pueden ser conflictivas
con relación al control de concurrencia?

Transacciones

Opción Transacción 1 Transacción 2

a Lectura Lectura
https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 53/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 54/62
16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

Por tanto, si una transacción necesita actualizar el dato (escribir) se emite un bloqueo
exclusivo. Los bloqueos compartidos permiten que varias transacciones lean a la vez el
7.1.- Políticas de bloqueo I. mismo elemento de datos.

Utilizando un bloqueo compartido/exclusivo un bloqueo puede tener 3 estados:


El bloqueo consiste en que el uso de los datos de una transacción desbloqueado, compartido y exclusivo
es exclusivo, es decir que otra transacción concurrente no puede
tener acceso a los datos que están siendo usados por la anterior.

El bloqueo se produce antes de iniciar la transacción y se libera


La posibilidad de compartir el bloqueo hace que el acceso sea más eficiente,
cuando la transacción se completa.
pero este sistema aumenta la carga de trabajo del sistema.
Este bloqueo se puede producir a nivel de:
Aunque los bloqueos impiden las inconsistencias serias de los datos, su uso puede
Base de datos. Everaldo Coelho and
YellowIcon (GNU/GPL) conducir a dos problemas importantes:
Tabla.
Fila. Que la programación de las transacciones pueda no ser serializable. La serialización
Atributo. de las operaciones de lectura y escritura consiste en ordenar esas operaciones para
un conjunto de transacciones concurrentes, de modo que los resultados de las
Algunos SGBD, como MySQL, permiten elegir el nivel de bloqueo, aunque hay sentencias
operaciones sean correctos. La serialización se puede garantizar mediante el
como ALTER TABLE que necesariamente producen bloqueo a nivel de tabla.
bloqueo de dos fases.
En el caso de las tablas InnoDB de MySQL por defecto el bloqueo se produce a nivel de Que en el programa se creen puntos muertos porque dos transacciones esperen a
fila. En las tablas MyISAM es a nivel de tabla. que la otra desbloquee los datos. Estos problemas pueden solucionarse mediante
métodos de prevención y de detección.
Independientemente del nivel de bloqueo un SGBD puede utilizar diferentes tipos de
bloqueo: Ambos métodos los veremos en el siguiente apartado.

Bloqueo binario:

Es la forma más simple de bloquear, ya que en este método cada transacción debe solicitar
el bloqueo del elemento que vaya a utilizar antes de acceder a él mediante una operación
de bloquear y liberar todos los bloqueos mediante una operación de desbloquear para que Autoevaluación
otra transacción los pueda utilizar.

Se denomina bloqueo binario porque tiene solo dos estados bloqueado (1) o desbloqueado Contesta si la siguiente afirmación es verdadera o falsa.
(0).
Si una transacción tiene un bloqueo compartido sobre una fila entonces:
La implementación de este método es muy simple, basta con mantener una tabla que
Una solicitud de bloqueo exclusivo de otra transacción no podrá ser
indique qué partes de los datos están bloqueados y por qué transacción, además estas
atendida inmediatamente
operaciones son programadas y manejadas por el SGBD y el usuario no tiene que
Una solicitud de bloqueo compartido de otra transacción si podrá ser
preocuparse. Cada SGBD tiene un mecanismo de bloqueo predeterminado.
atendida inmediatamente. En consecuencia ambas transacciones
mantendrán un bloqueo compartido sobre la fila.

Los bloqueos binarios son demasiado restrictivos porque bloquean incluso las Verdadero Falso
operaciones que no son conflictivas porque no actualizan datos.
Verdadero
Si el bloqueo es compartido se pueden realizar dos operaciones de
Bloqueo compartido/exclusivo: lectura simultáneamente sobre los mismos datos. Únicamente las
operaciones de escritura requieren bloqueo exclusivo.
Este método es menos restrictivo porque permite la compatibilidad de algunos bloqueos.

Bloqueo exclusivo: cuando el objeto sólo es accesible para la transacción que lo bloqueó.
Se utiliza cuando al menos una de las operaciones de la transacción es de escritura.

Bloqueo compartido: cuando todas las transacciones concurrentes son sólo de lectura.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 55/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 56/62


16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

Una fase de contracción: la transacción libera todos los bloqueos y no puede obtener
uno nuevo.
7.2.- Políticas de bloqueo II.
Ninguna operación de desbloqueo puede preceder a una operación de bloqueo en la misma
transacción. Algo que, como vemos, no se cumple en el ejemplo anterior.
Comenzamos viendo el bloqueo en dos fases.

Bloqueo de dos fases. Puede ocurrir que durante la fase de expansión más de una transacción esté
interesada en los mismos datos y por tanto ambas transacciones esperan a que
Si tenemos dos transacciones ejecutándose sobre los mismos elementos, puede darse la la otra desbloquee esos elementos, sin avanzar.
siguiente situación:

Ejemplo de problemas de serialización.


Puntos muertos.
Transacción Transacción
Valor de X
1 2 Como hemos visto se produce cuando una transacción espera a que otra desbloquee los
datos. Se denomina también abrazo mortal o deadlocks
Bloquear X

Leer X
Ejemplo: si tenemos dos transacciones que quieren acceder a los elementos X e Y puede
  10
Desbloquear darse el siguiente caso:
X

Bloquear X

Puntos muertos.
Leer X

  10 TRANSACCIÓN OPERACIÓN ESTADO


Desbloquear
X
Transacción 1 Bloquear X Bloqueado X
Bloquear X

Escribir Transacción 2 Bloquear Y Bloqueado Y


X=X+1
  11=10+1
Desbloquear Transacción 1 Bloquear X Esperando
X
Transacción 2 Bloquear Y Esperando
Bloquear X

Escribir 11=10+1>
.... .....
  X=X+1
(el último valor de X leído por la transacción 2 era
Desbloquear 10)
X Este caso únicamente puede darse cuando uno de los bloqueos es exclusivo.

El problema es que el dato debería haberse incrementado dos veces y sólo lo ha hecho Existen 3 técnicas básicas para controlar los puntos
una. El acceso exclusivo a un elemento mediante bloqueo no garantiza que las operaciones muertos:
se realicen correctamente. Es necesario un mecanismo que controle la liberación y
adquisición de bloqueos. Prevención de puntos muertos: cuando sea
previsible que una transacción que solicita un
El bloqueo en dos fases define de qué forma las transacciones van a adquirir y ceder los bloqueo pueda producir un punto muerto, la
bloqueos garantizando la serialización. Este sistema fuerza a las transacciones a realizar transacción es abortada y todos los bloqueos que
primero todas las operaciones de adquisición de bloqueos antes de la primera operación de haya obtenido se liberan. La transacción se Guindo (CC BY-NC-SA)
desbloqueo. reprograma de nuevo evitando las condiciones que
producen puntos muertos.
Estas dos fases son: Detección de puntos muertos: el SGBD comprueba periódicamente la existencia de
puntos muertos y si lo encuentra, una de las transacciones es reiniciada.
Una fase de expansión: en esta fase la transacción adquiere todos los bloqueos hasta Evitar los puntos muertos: que la transacción requiera que todos los bloqueos se
que esté en su punto bloqueado. Hasta que la transacción no tenga todos los obtengan en sucesión, aunque esto incrementa los tiempos de respuesta de las
bloqueos no se modifica ningún dato. acciones.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 57/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 58/62


16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

7.3.- Bloqueo de datos con MySQL.


Reflexiona
Normalmente el administrador del bloqueo del servidor bloquea las tablas
¿Por qué se afirma que el problema de puntos muertos sólo puede darse o las filas automáticamente cuando se necesita. Cuando el cliente ha
cuando uno de los bloqueos es exclusivo? terminado con ella, se anula el bloqueo. En MySQL el bloqueo de tablas
se puede hacer de forma explícita mediante el uso de dos comandos:
Mostrar retroalimentación
LOCK TABLES / UNLOCK TABLES
Everaldo Coelho and
YellowIcon (GNU/GPL)
La sintaxis de estos comandos es la siguiente:
Porque si ambos bloqueos son compartidos el valor podría estar
bloqueado por más de una transacción y no permanecería en espera.

LOCK TABLES NombreTabla1 [AS Alias] {READ | {[LOW_PRIORITY] WRITE},


NombreTabla2 [AS Alias] {READ |{ [LOW_PRIORITY] WRITE} …

UNLOCK TABLES

LOCK TABLES bloquea el acceso a las tablas indicadas en la lista NombreTabla1,


NombreTabla2,.., si esnecesario, hasta que puedan adquirirse todos los demás bloqueos.
Para bloquear múltiples tablas se deben bloquear todas con una única instrucción LOCK
TABLES.

NombreTabla1, NombreTabla2, ... Una o más tablas separadas por comas. Para cada tabla se
puede definir el tipo de bloqueo:

READ: bloqueo de sólo lectura. Esto bloquea a otros usuarios que quieran escribir en la
tabla, pero les permitiría leerla. Es un bloqueo compartido.
WRITE: bloqueo de escritura. Bloquea a otros usuarios impidiéndoles el acceso, tanto
para leer como para escribir. Es un bloqueo exclusivo.
LOW PRIORITY WRITE: por defecto las operaciones de escritura tienen prioridad sobre las
de lectura, por tanto si llega una petición de escritura se ejecutará antes que una de
lectura (si una operación de lectura está iniciada primero terminará esta). Cuando se
establece LOW_PRIORITY WRITE, una operación de escritura no tiene prioridad, sólo
cuando no haya operaciones de lectura en espera se realizará la operación de
escritura.
AS Alias: permite bloquear una tabla múltiples veces en una consulta bloqueando los
alias.

UNLOCK TABLES libera cualquier bloqueo realizado por la transacción actual. Las tablas se
liberan cuando la transacción realiza otro LOCK TABLES o cuando se cierra la conexión con el
servidor.

Un bloqueo de tabla protege la tabla de lecturas o escrituras de otros usuarios, pero el


usuario que tiene la tabla bloqueada aunque sea del tipo READ puede realizar cualquier
operación sobre la tabla, incluso borrarla.

Bloqueo en tablas InnoDB


InnoDB implementa bloqueo a nivel de fila, con dos tipos de bloqueo: compartido y
exclusivo. Normalmente está función la realiza el servidor automáticamente.

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 59/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 60/62


16/4/22, 18:27 GBD05.- Edición de los datos. 16/4/22, 18:27 GBD05.- Edición de los datos.

De forma adicional, InnoDB permite también que haya simultáneamente bloqueos de filas y
UPDATE CLIENTES

de tablas a esto se le llama granularidad múltiple.


SET Nombre='José'

En cuanto a la posibilidad de puntos muertos (deadlocks), cuando InnoDB lo detecta WHERE CodCliente='00009';
cancela automáticamente una o más transacciones, generalmente las más pequeñas. Esto
funciona así cuando las tablas son InnoDB y el bloqueo es a nivel de fila. Si lo hemos
cambiado con la sentencia LOCK TABLE no detecta los puntos muertos. Como verás la operación se ejecuta correctamente.
Para usar LOCK TABLES con tablas InnoDB debemos tener AUTOCOMMIT=0 y no desbloquear las Para finalizar queda deshacer la transacción y desbloquear las tablas.
tablas con UNLOCK TABLES hasta que hayamos confirmado (COMMIT) la transacción. No es
conveniente utilizarlo con este tipo de tablas porque InnoDB utiliza de forma automática el
bloqueo a nivel de filas y se pueden dar fácilmente puntos muertos (deadlocks).
ROLLBACK;

UNLOCK TABLES;

LOCK TABLES se utiliza cuando el motor de almacenamiento no soporta


transacciones, por ejemplo MyISAM y queremos asegurarnos de que no se ¿Podrías modificar el nombre del cliente ahora desde PhpMyAdmin?
ejecute ninguna transacción entre un SELECT y un UPDATE o para que la
actualización de tablas sea más rápida.
Mostrar retroalimentación

Efectivamente, ahora puedes modificarlo porque la tabla ha sido


desbloqueada.
Reflexiona
Para comprobar el efecto del bloqueo de una tabla vamos a realizar la
siguiente práctica utilizando dos sesiones distintas, una con MySQL
Workbench y otra con PhpMyAdmin. Lo mismo se puede demostrar abriendo
dos sesiones sobre el mismo programa, por ejemplo dos sesiones desde Para saber más
Workbench.

Desde MySQL Workbench desactiva el modo AUTOCOMMIT y escribe el código Si quieres saber más sobre bloqueo de tablas en MySQL puedes acceder al
para bloquear CLIENTES para escritura: manual desde los siguientes enlaces:

Sintaxis de las sentencias de bloqueo de tablas en MySQL


SET AUTOCOMMIT =0;
Métodos de bloqueo en MySQL
COMMIT;

LOCK TABLE CLIENTES WRITE;

Desde PhpMyAdmin escribe el siguiente código:

UPDATE CLIENTES

SET Nombre='José'

WHERE CodCliente='00009';

¿Qué ocurre? Esta operación se mantiene a la espera porque esa tabla está
bloqueada.

De nuevo, desde MySQL Workbench intenta ejecutar la operación anterior:

https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 61/62 https://www.adistanciafparagon.es/pluginfile.php/37290/mod_resource/content/1/GBD05_v1/ArchivosUnidad/Moodle/GBD05_completa_offline/… 62/62

También podría gustarte