Aprenda cómo funcionan las sentencias TRUNCATE y DELETE en SQL, las diferencias entre ellas y cuándo debe preferir utilizar una sobre la otra.

Cuando trabaje con tablas de bases de datos, es posible que tenga que eliminar un subconjunto de filas o todas las filas. Para eliminar filas de una tabla de base de datos, puede utilizar las sentencias TRUNCATE o DELETE de SQL en función del caso de uso.

En este tutorial, examinaremos más detenidamente cada una de las sentencias, comprenderemos cómo funcionan y decidiremos cuándo es preferible utilizar TRUNCATE en lugar de DELETE y viceversa.

Antes de seguir adelante, es útil repasar los siguientes subconjuntos de SQL:

  • Las sentenciasdel Lenguaje de Definición de Datos (DDL ) se utilizan para crear y gestionar objetos de la base de datos como las tablas. Las sentencias SQL CREATE, DROP y TRUNCATE son ejemplos de sentencias DDL.
  • Las sentencias del Lenguaje deManipulación de Datos (DML) se utilizan para manipular los datos dentro de los objetos de la base de datos. Las sentencias DML se utilizan para realizar las operaciones de creación, lectura, actualización y eliminación de registros.
  • Las sentencias del Lenguaje deConsulta de Datos (DQL ) se utilizan para recuperar datos de las tablas de la base de datos. Todas las sentencias SELECT entran dentro del subconjunto DQL.

Cómo utilizar la sentencia SQL TRUNCATE

truncate-vs-delete

Sintaxis de la sentencia SQL TRUNCATE

La sintaxis para utilizar la sentencia SQL TRUNCATE es la siguiente:

TRUNCATE TABLE nombre_tabla;

Al ejecutar el comando TRUNCATE anterior se eliminan todas las filas de la tabla especificada por nombre_tabla yno se borra la tabla.

La operación de truncado no explora todos los registros de la tabla. Por lo tanto, es razonablemente más rápida cuando se trabaja con tablas de bases de datos de gran tamaño.

Ejemplo de uso de SQL TRUNCATE

📑 Nota: Si tiene MySQL instalado en su máquina, puede codificar a lo largo utilizando el cliente de línea de comandos MySQL. También puede seguir adelante en otro DBMS de su elección como PostgreSQL.

Creemos primero una base de datos con la que trabajar:

mysql> CREAR BASE DE DATOS db1;
Consulta OK, 1 fila afectada (1.50 seg)

A continuación, seleccione la base de datos que acabamos de crear

mysql> use db1;
Base de datos modificada

El siguiente paso es crear una tabla de base de datos. Ejecute la siguiente sentencia CREATE TABLE para crear una tabla de tareas sencilla:

-- Cree la tabla de tareas
CREAR TABLA tareas (
    task_id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    fecha_de_vencimiento FECHA,
    status ENUM('Pendiente', 'En curso', 'Completada') DEFAULT 'Pendiente',
    cesionario VARCHAR(100)
);

En este ejemplo, la tabla de tareas tiene las siguientes columnas

  • task_id: Un identificador único que se incrementa automáticamente para cada tarea.
  • title: El título o nombre de la tarea, limitado a 255 caracteres.
  • due_date: La fecha de vencimiento de la tarea, representada como una fecha.
  • estado: El estado de la tarea, que puede ser ‘Pendiente’, ‘En curso’ o ‘Completada’. El valor por defecto es ‘Pendiente’.
  • asignatario: La persona asignada para la tarea en particular.

Ahora que hemos creado la tabla de tareas, vamos a insertar registros en ella:

-- Insertar varios registros en la tabla de tareas
INSERT INTO tareas (título, fecha_de_vencimiento, estado, asignado)
VALORES
    ('Tarea 1', '2023-08-10', 'Pendiente', 'Juan'),
    ('Tarea 2', '2023-08-11', 'En curso', 'Jane'),
    ('Tarea 3', '2023-08-12', 'Completada', 'Mike'),
    ('Tarea 4', '2023-08-13', 'Pendiente', 'Alice'),
    ('Tarea 5', '2023-08-14', 'En curso', 'Bob'),
    ('Tarea 6', '2023-08-15', 'Completada', 'Emily'),
    ('Tarea 7', '2023-08-16', 'Pendiente', 'David'),
    ('Tarea 8', '2023-08-17', 'En curso', 'Olivia'),
    ('Tarea 9', '2023-08-18', 'Pendiente', 'Daniel'),
    ('Tarea 10', '2023-08-19', 'Completada', 'Sophia'),
    ('Tarea 11', '2023-08-20', 'Pendiente', 'Matthew'),
    ('Tarea 12', '2023-08-21', 'En curso', 'Ava'),
    ('Tarea 13', '2023-08-22', 'Completada', 'William'),
    ('Tarea 14', '2023-08-23', 'Pendiente', 'Ella'),
    ('Tarea 15', '2023-08-24', 'En curso', 'James'),
    ('Tarea 16', '2023-08-25', 'Completada', 'Lily'),
    ('Tarea 17', '2023-08-26', 'Pendiente', 'Benjamin'),
    ('Tarea 18', '2023-08-27', 'En curso', 'Mia'),
    ('Tarea 19', '2023-08-28', 'Pendiente', 'Henry'),
    ('Tarea 20', '2023-08-29', 'Completada', 'Isabella');

Al ejecutar la sentencia de inserción, debería ver una salida similar:

Consulta OK, 20 filas afectadas (0.18 seg)
Registros: 20 Duplicados: 0 Advertencias: 0

Ejecute ahora el comando TRUNCATE table para eliminar todos los registros de la tabla tasks:

TRUNCATE TABLE tareas;
Consulta OK, 0 filas afectadas (0.72 seg)

Al hacerlo se eliminan todos los registros y no la tabla. Puede verificar esto ejecutando SHOW TAB LES; de la siguiente manera:

SHOW TABLES;
 --------------- 
| Tables_in_db1 |
 --------------- 
| tareas |
 --------------- 
1 fila en el conjunto (0.00 seg)

Y una consulta SELECT para recuperar datos de la tabla de tareas devuelve un conjunto vacío:

SELECT * FROM tareas;
Conjunto vacío (0.00 seg)

Cómo utilizar la sentencia DELETE de SQL

A woman standing in front of a blackboard explaining the differences between truncate and delete SQL statements.

Sintaxis de la sentencia DELETE de SQL

La sintaxis general para utilizar la sentencia DELETE de SQL es la siguiente:

DELETE FROM nombre_tabla 
Condición WHERE;

La condición de la cláusula WHERE es el predicado que determina qué filas deben eliminarse. La sentencia DELETE elimina todas las filas para las que el predicado es True.

La sentencia DELETE, por tanto, le permite tener un mayor control sobre cuáles de los registros se eliminan.

Pero, ¿qué ocurre cuando se utiliza la sentencia DELETE sin la cláusula WHERE?🤔

DELETE FROM nombre_tabla;

Al ejecutar la sentencia DELETE como se muestra, se eliminan todas las filas de la tabla de la base de datos.

Si una sentencia DELETE o un conjunto de sentencias DELETE forman parte de una transacción no comprometida, puede deshacer los cambios. Sin embargo, se recomienda tener una copia de seguridad de los datos en otro lugar.

Ejemplo de uso de DELETE SQL

Veamos ahora la sentencia SQL delete en acción.

Hemos eliminado todos los registros de la tabla de tareas. Así que puede volver a ejecutar la sentencia INSERT (que ejecutamos anteriormente) para insertar registros:

-- Inserción de varios registros en la tabla de tareas
INSERT INTO tareas (título, fecha_de_vencimiento, estado, asignado)
VALORES
    ('Tarea 1', '2023-08-10', 'Pendiente', 'Juan'),
    ('Tarea 2', '2023-08-11', 'En curso', 'Jane'),
    ('Tarea 3', '2023-08-12', 'Completada', 'Mike'),
    ...
    ('Tarea 18', '2023-08-27', 'En curso', 'Mia'),
    ('Tarea 19', '2023-08-28', 'Pendiente', 'Henry'),
    ('Tarea 20', '2023-08-29', 'Completada', 'Isabella');

Primero utilicemos la sentencia DELETE con la cláusula WHERE. La siguiente consulta elimina todas las filas cuyo estado sea ‘Completado’:

DELETE FROM tareas WHERE estado = 'Completado';
Consulta OK, 6 filas afectadas (0.14 seg)

Ahora ejecute esta consulta SELECT

SELECT * FROM tareas;

Verá que actualmente hay 14 filas:

 --------- --------- ------------ ------------- ---------- 
| task_id | title | due_date | status | assignee | asignatario
 --------- --------- ------------ ------------- ---------- 
| 1 Tarea 1 Pendiente 2023-08-10 Juan
| 2 Tarea 2 2023-08-11 En curso Jane
| 4. Tarea 4. 2023-08-13. Pendiente. Alice
| 5 | Tarea 5 | 2023-08-14 | En curso | Bob | En curso
| 7 | Tarea 7 | 2023-08-16 | Pendiente | David | 8 | Tarea 8 | Pendiente
| 8 | Tarea 8 | 2023-08-17 | En curso | Olivia | En curso
| 9 | Tarea 9 | 2023-08-18 | Pendiente | Daniel
| 11 | Tarea 11 | 2023-08-20 | Pendiente | Matthew | En proceso
| 12 | Tarea 12 | 2023-08-21 | En proceso | Ava | En proceso
| 14 | Tarea 14 | 2023-08-23 | Pendiente | Ella | En proceso
| 15 | Tarea 15 | 2023-08-24 | En proceso | James | En proceso
| 17 Tarea 17 2023-08-26 Pendiente Benjamín
| 18 Tarea 18 2023-08-27 En curso Mia
| 19 | Tarea 19 | 2023-08-28 | Pendiente | Henry |
 --------- --------- ------------ ------------- ---------- 
14 filas en el conjunto (0.00 seg)

La ejecución de la siguiente sentencia DELETE elimina los 14 registros restantes de la tabla:

DELETE FROM tareas;
Consulta OK, 14 filas afectadas (0.20 seg)

Y la tabla de tareas está ahora vacía:

SELECT * FROM tareas;
Conjunto vacío (0,00 seg)

La sentencia SQL DROP

Hasta ahora, hemos aprendido

  • La sentencia TRUNCATE elimina todas las filas de la tabla.
  • La sentencia DELETE-sin cláusula WHERE-elimina todos los registros de la tabla.

Sin embargo, las sentencias TRUNCATE y DELETE no eliminan la tabla. Si desea eliminar la tabla de la base de datos, puede utilizar el comando DROP TABLE del siguiente modo

DROP TABLE nombre_tabla;

Ahora vamos a borrar la tabla de tareas de la base de datos:

mysql> DROP TABLE tareas;
Consulta OK, 0 filas afectadas (0.43 seg)

Verá que SHOW TABLES; devuelve un conjunto vacío (ya que hemos borrado la única tabla que estaba presente en la base de datos):

mysql> SHOW TABLES;
Conjunto vacío (0.00 seg)

Cuándo utilizar TRUNCATE frente a DELETE en SQL

FunciónTRUNCATEBORRAR
SintaxisTRUNCATE TABLE nombre_tabla;Con cláusula WHERE DELETE FROM nombre_tabla WHERE condición;
Sin cláusula WHERE: DELETE TABLE nombre_tabla;
Subconjunto SQLLenguaje de definición de datos (DDL)Lenguaje de manipulación de datos (DML)
EfectoElimina todas las filas de la tabla de la base de datos.Cuando se ejecuta sin la cláusula WHERE, la sentencia DELETE elimina todos los registros de la tabla de la base de datos.
RendimientoMás eficiente que la sentencia DELETE cuando se trabaja con tablas grandes.Menos eficaz que la sentencia TRUNCATE.

Resumiendo:

  • Cuando necesite eliminar todas las filas de una tabla de base de datos de gran tamaño, utilice la sentencia TRUNCATE.
  • Para eliminar un subconjunto de filas basándose en condiciones específicas, utilice la sentencia DELETE.

Resumiendo

Terminemos nuestra discusión con un resumen:

  • Cuando trabaje con tablas de bases de datos, es posible que desee eliminar el subconjunto de filas o todas las filas de una tabla concreta. Para ello puede utilizar las sentencias TRUNCATE o DELETE.
  • La sentencia TRUNCATE tiene la sintaxis TRUNCATE TABLA nombre_tabla;. Borra todas las filas de la tabla especificada por nombre_tabla pero no borra la tabla en sí.
  • La sentencia DELETE toma la sintaxis: DELETE FROM nombre_tabla WHERE condición;. Esto elimina las filas para las que la condición del predicado es verdadera.
  • La ejecución de la sentencia DELETE de SQL sin la cláusula WHERE elimina todas las filas de la tabla. Por tanto, funcionalmente, esto consigue el mismo resultado que la sentencia SQL TRUNCATE.
  • Ejecutar TRUNCATE es especialmente más rápido cuando se trabaja con tablas más grandes, ya que no escanea toda la tabla. Por lo tanto, cuando necesite eliminar todas las filas de una tabla de base de datos de gran tamaño, ejecutar TRUNCATE puede resultar más eficaz.
  • Cuando necesite eliminar un subconjunto de filas -basándose en una condición específica- puede utilizar la sentencia DELETE de SQL.

Si desea un repaso rápido de los comandos SQL más utilizados, consulte esta hoja de trucos SQL.