Mantén SQLtest vivo: Ayuda a cubrir los costos del servidor de este mes de $100 para mantener todas las lecciones y el playground de SQL en línea. Apoya el proyecto →
Código SQL copiado al portapapeles

Lección 9.2 · Tiempo de lectura: ~6 min

SQL TRUNCATE elimina todas las filas de una tabla y conserva la tabla; DROP TABLE elimina la tabla misma, con sus datos y su estructura. En esta lección aprenderás cómo funcionan ambas sentencias, en qué se diferencian de DELETE en velocidad, rollback y comportamiento del autoincremento, y cómo les afectan las claves foráneas.

SQL TRUNCATE y DROP TABLE

Puedes eliminar datos en tres niveles: algunas filas (DELETE ... WHERE), todas las filas (TRUNCATE) o la tabla completa (DROP TABLE). El primero se vio en la lección 8.3. TRUNCATE y DROP TABLE son sentencias DDL: trabajan con la tabla como un todo y son mucho más rápidas, pero también perdonan menos los errores.

Las bases de datos de ejemplo de SQLtest son de solo lectura; los ejemplos crean su propia tabla, así que puedes ejecutarlos en el playground en una base sin datos de ejemplo.

SQL DELETE, TRUNCATE y DROP TABLE: DELETE elimina las filas seleccionadas, TRUNCATE elimina todas las filas y conserva la tabla, DROP TABLE elimina la tabla y su estructura

TRUNCATE: vaciar la tabla

TRUNCATE TABLE table_name;

Después de TRUNCATE:

  • todas las filas desaparecen;
  • la tabla, sus columnas, índices y restricciones se conservan;
  • el contador de autoincremento vuelve a empezar desde 1.
CREATE TABLE daily_import (
    id INT AUTO_INCREMENT PRIMARY KEY,
    payload VARCHAR(100)
);
INSERT INTO daily_import (payload) VALUES ('a'), ('b'), ('c');

TRUNCATE TABLE daily_import;

INSERT INTO daily_import (payload) VALUES ('d');
SELECT * FROM daily_import;

Resultado: una fila, id = 1, payload = 'd'. La tabla se vació y su contador de id se reinició.


DROP TABLE: eliminar la tabla

DROP TABLE table_name;

Después de DROP TABLE, la tabla ya no existe: sus datos, columnas, índices y restricciones desaparecen, y cualquier consulta que la use falla hasta que se vuelva a crear.

DROP TABLE IF EXISTS old_reports;

IF EXISTS omite la sentencia sin error cuando la tabla no existe, lo que es útil en scripts que vuelven a crear tablas.


TRUNCATE vs DELETE vs DROP

DELETETRUNCATEDROP TABLE
EliminaFilas seleccionadas (WHERE) o todasTodas las filasLas filas y la tabla
La tabla se conservaSíSíNo
Velocidad en tablas grandesLento: fila por filaRápidoRápido
AutoincrementoNo se reiniciaSe reiniciaDesaparece con la tabla
Rollback en MySQLSí, en una transacciónNo: commit implícitoNo: commit implícito
Rollback en PostgreSQL, SQL ServerSíSí, en una transacciónSí, en una transacción
Triggers ON DELETESe ejecutanNo se ejecutanNo se ejecutan

La fila del rollback es la más importante. En MySQL y MariaDB, las sentencias DDL confirman automáticamente la transacción actual, así que un TRUNCATE o DROP TABLE por error no se puede deshacer con ROLLBACK. Solo sirve una copia de seguridad.


Claves foráneas

Las claves foráneas protegen las tablas que otras tablas referencian:

  • DROP TABLE falla si otra tabla tiene una clave foránea hacia ella. Elimina primero la tabla hija, o la restricción.
  • En MySQL, TRUNCATE falla en una tabla referenciada por una clave foránea, aunque la tabla hija esté vacía. DELETE FROM sí funciona en ese caso, porque revisa las filas reales.
CREATE TABLE departments (department_id INT PRIMARY KEY);
CREATE TABLE staff (
    staff_id INT PRIMARY KEY,
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments (department_id)
);

-- Error: Cannot truncate a table referenced in a foreign key constraint
TRUNCATE TABLE departments;

Cuál usar

  • Eliminar algunas filas → DELETE ... WHERE.
  • Vaciar una tabla que vas a volver a llenar, como una tabla intermedia de importación → TRUNCATE.
  • La tabla ya no se necesita → DROP TABLE.

Antes de un TRUNCATE o DROP en una base real, revisa el nombre de la tabla y la base a la que estás conectado: ambas sentencias actúan al instante y, en MySQL, sin vuelta atrás.


Conclusiones clave:

  • TRUNCATE TABLE elimina rápidamente todas las filas y conserva la tabla; el contador de autoincremento se reinicia.
  • DROP TABLE elimina la tabla junto con sus datos y estructura; IF EXISTS evita un error.
  • DELETE puede eliminar parte de las filas y se puede deshacer; TRUNCATE no admite WHERE.
  • En MySQL y MariaDB, TRUNCATE y DROP hacen un commit implícito y no se pueden deshacer.
  • Las claves foráneas impiden eliminar o vaciar una tabla referenciada.

Preguntas frecuentes

¿Cuál es la diferencia entre TRUNCATE y DELETE?

DELETE elimina las filas una por una, puede usar WHERE, ejecuta los triggers de borrado y se puede deshacer. TRUNCATE elimina todas las filas de una vez, es mucho más rápido, reinicia el contador de autoincremento y, en MySQL, no se puede deshacer.

¿Cuál es la diferencia entre TRUNCATE y DROP TABLE?

TRUNCATE vacía la tabla pero la conserva, lista para filas nuevas. DROP TABLE elimina la tabla por completo; para volver a usarla, hay que crearla con CREATE TABLE.

¿Se puede deshacer un TRUNCATE?

En MySQL y MariaDB, no: provoca un commit implícito. En PostgreSQL y SQL Server, sí, cuando se ejecuta dentro de una transacción.