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.
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
DELETE | TRUNCATE | DROP TABLE | |
|---|---|---|---|
| Elimina | Filas seleccionadas (WHERE) o todas | Todas las filas | Las filas y la tabla |
| La tabla se conserva | Sí | Sí | No |
| Velocidad en tablas grandes | Lento: fila por fila | Rápido | Rápido |
| Autoincremento | No se reinicia | Se reinicia | Desaparece con la tabla |
| Rollback en MySQL | Sí, en una transacción | No: commit implícito | No: commit implícito |
| Rollback en PostgreSQL, SQL Server | Sí | Sí, en una transacción | Sí, en una transacción |
Triggers ON DELETE | Se ejecutan | No se ejecutan | No 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 TABLEfalla si otra tabla tiene una clave foránea hacia ella. Elimina primero la tabla hija, o la restricción.- En MySQL,
TRUNCATEfalla en una tabla referenciada por una clave foránea, aunque la tabla hija esté vacía.DELETE FROMsí 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 TABLEelimina rápidamente todas las filas y conserva la tabla; el contador de autoincremento se reinicia.DROP TABLEelimina la tabla junto con sus datos y estructura;IF EXISTSevita un error.DELETEpuede eliminar parte de las filas y se puede deshacer;TRUNCATEno admiteWHERE.- En MySQL y MariaDB,
TRUNCATEyDROPhacen 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.