Listado completo de tutoriales

9 - Borrado de registros de una tabla (delete)


Ver video

Para eliminar los registros de una tabla usamos el comando "delete":

delete from usuarios;

La ejecución del comando indicado en la línea anterior borra TODOS los registros de la tabla.

Si queremos eliminar uno o varios registros debemos indicar cuál o cuáles, para ello utilizamos el comando "delete" junto con la clausula "where" con la cual establecemos la condición que deben cumplir los registros a borrar. Por ejemplo, queremos eliminar aquel registro cuyo nombre de usuario es 'Leonardo':

delete from usuarios where nombre='Leonardo';

Si solicitamos el borrado de un registro que no existe, es decir, ningún registro cumple con la condición especificada, no se borrarán registros, pues no encontró registros con ese dato.

El comando delete hay que tener mucho cuidado en su uso, una vez eliminado un registro no hay forma de recuperarlo. Si por ejemplo ejecutamos el comando:

delete from usuarios;

Si la tabla tiene 1000000 de filas, todas ellas serán eliminadas.

En MySQL hay una variable de configuración llamada SQL_SAFE_UPDATES que puede almacenar los valores 1 (activa) y 0 (desactiva). Cuando tiene el valor 1 no permite ejecutar comandos delete sin indicar un where y que dicho where se relacione a una clave primaria, tema que veremos más adelante.

Servidor de MySQL instalado en forma local.

Ingresemos al programa "Workbench" y ejecutamos los siguientes comandos SQL donde utilizamos entre otros el comando delete:

drop table if exists  usuarios;

create table usuarios (
  nombre varchar(30),
  clave varchar(10)
);

insert into usuarios (nombre, clave) values ('Leonardo','payaso');
insert into usuarios (nombre, clave) values ('MarioPerez','Marito');
insert into usuarios (nombre, clave) values ('Marcelo','River');
insert into usuarios (nombre, clave) values ('Gustavo','River');

delete from usuarios;

delete from usuarios where nombre='Leonardo';

select nombre,clave from usuarios;

delete from usuarios where clave='River';

select nombre,clave from usuarios;


Si ejecutamos este conjunto de comandos SQL se produce un error en el primer comando 'delete' debido a que la variable 'SQL_SAFE_UPDATES' tiene el valor 1 (es decir está activa), en MySQL 8.0 se instala por defecto para la variable 'SQL_SAFE_UPDATES' con el valor 1:

MySQL SQL_SAFE_UPDATES

Soluciones

La idea de que no se puedan ejecutar ciertos comandos 'delete' es para evitar borrados masivos de datos que luego no podemos recuperar.

Tenemos dos soluciones para resolver el problema de los 'delete', la primera es encerrar todo el bloque donde ejecutamos los comandos delete cambiando el esta de la variable 'SQL_SAFE_UPDATES':

  1. El primer método es cambiar el estado de la variable SQL_SAFE_UPDATES en forma temporal:

    drop table if exists  usuarios;
    
    create table usuarios (
      nombre varchar(30),
      clave varchar(10)
    );
    
    insert into usuarios (nombre, clave) values ('Leonardo','payaso');
    insert into usuarios (nombre, clave) values ('MarioPerez','Marito');
    insert into usuarios (nombre, clave) values ('Marcelo','River');
    insert into usuarios (nombre, clave) values ('Gustavo','River');
    
    set SQL_SAFE_UPDATES=0;
    
    delete from usuarios;
    
    delete from usuarios where nombre='Leonardo';
    
    select nombre,clave from usuarios;
    
    delete from usuarios where clave='River';
    
    select nombre,clave from usuarios;
    
    set SQL_SAFE_UPDATES=1;
    

    Tengamos en cuenta que disponer la variable SQL_SAFE_UPDATES para que los borrados sean solo seguros es muy conveniente cuando hay programadores que recién están comenzando en SQL y hay datos valiosos ya almacenados.

    Podemos saber el estado global de la variable 'SQL_SAFE_UPDATES' mediante la consulta:

    select @@sql_safe_updates;
    
  2. El segundo método es cambiar el estado de la variable SQL_SAFE_UPDATES a nivel general, para ello desde el programa "Workbench" ingresamos a la opción Edit -> Preferences...:

    MySQL SQL_SAFE_UPDATES

    En en la pestaña "SQL Editor" debemos desmarcar la opción "Safe Updates (eject Updates and Deletes with not restrictions)", con esto se permite ejecutar cualquier comando SQL delete, sin importar la cantidad de filas que se borran:

    MySQL SQL_SAFE_UPDATES

    Debemos cerrar y volver a entrar al programa "Workbench" para que el cambio se haga efectivo.

Si prueba en el servidor tutorialesprogramacionya.com el comando SQL 'delete' verá que no hay restricciones en el borrado de filas, es decir que la variable SQL_SAFE_UPDATES se encuentra en '0'.

Seguramente cambiará el estado de la variable 'SQL_SAFE_UPDATES' a '0' en su servidor, pero es bueno tener cuidado cada vez que ejecutamos un comando SQL 'delete':

Retornar