Lição 9.3 · Tempo de leitura: ~6 min
O SQL TRUNCATE remove todas as linhas de uma tabela e mantém a tabela; o DROP TABLE remove a própria tabela, com os dados e a estrutura. Nesta lição, você vai aprender como funcionam as duas instruções, como diferem do DELETE em velocidade, rollback e comportamento do autoincremento, e como as chaves estrangeiras as afetam.
SQL TRUNCATE e DROP TABLE
É possível remover dados em três níveis: algumas linhas (DELETE ... WHERE), todas as linhas (TRUNCATE) ou a tabela inteira (DROP TABLE). O primeiro foi visto na Lição 8.3. TRUNCATE e DROP TABLE são instruções DDL: atuam sobre a tabela como um todo e são muito mais rápidas, mas também menos tolerantes a erros.
Os bancos de exemplo do SQLtest são somente leitura; os exemplos criam a sua própria tabela, por isso pode executá-los no playground num banco sem dados de exemplo.
TRUNCATE: Esvaziar a Tabela
TRUNCATE TABLE table_name;
Depois do TRUNCATE:
- todas as linhas desaparecem;
- a tabela, as suas colunas, índices e restrições permanecem;
- o contador de autoincremento recomeça em 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: uma linha, id = 1, payload = 'd'. A tabela foi esvaziada e o seu contador de id reiniciado.
DROP TABLE: Remover a Tabela
DROP TABLE table_name;
Depois do DROP TABLE, a tabela deixa de existir: os seus dados, colunas, índices e restrições desaparecem, e qualquer consulta que a use falha até que ela seja criada de novo.
DROP TABLE IF EXISTS old_reports;
O IF EXISTS salta a instrução sem erro quando a tabela não existe, o que é útil em scripts que recriam tabelas.
TRUNCATE vs DELETE vs DROP
DELETE | TRUNCATE | DROP TABLE | |
|---|---|---|---|
| Remove | Linhas selecionadas (WHERE) ou todas | Todas as linhas | As linhas e a tabela |
| A tabela permanece | Sim | Sim | Não |
| Velocidade em tabelas grandes | Lento: linha a linha | Rápido | Rápido |
| Autoincremento | Não é reiniciado | É reiniciado | Desaparece com a tabela |
| Rollback no MySQL | Sim, numa transação | Não: commit implícito | Não: commit implícito |
| Rollback no PostgreSQL, SQL Server | Sim | Sim, numa transação | Sim, numa transação |
Triggers ON DELETE | Disparam | Não disparam | Não disparam |
A linha do rollback é a mais importante. No MySQL e no MariaDB, as instruções DDL confirmam automaticamente a transação atual, por isso um TRUNCATE ou DROP TABLE feito por engano não pode ser desfeito com ROLLBACK. Só um backup ajuda.
Chaves Estrangeiras
As chaves estrangeiras protegem as tabelas que outras tabelas referenciam:
- O
DROP TABLEfalha se outra tabela tiver uma chave estrangeira para ela. Remova primeiro a tabela filha, ou a restrição. - No MySQL, o
TRUNCATEfalha numa tabela referenciada por uma chave estrangeira, mesmo que a tabela filha esteja vazia. ODELETE FROMfunciona nesse caso, porque verifica as linhas reais.
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)
);
-- Erro: Cannot truncate a table referenced in a foreign key constraint
TRUNCATE TABLE departments;
Qual Usar
- Remover algumas linhas →
DELETE ... WHERE. - Esvaziar uma tabela que vai voltar a encher, como uma tabela intermédia de importação →
TRUNCATE. - A tabela já não é necessária →
DROP TABLE.
Antes de um TRUNCATE ou DROP num banco real, confirme o nome da tabela e o banco a que está ligado: as duas instruções atuam instantaneamente e, no MySQL, sem volta atrás.
Principais conclusões:
TRUNCATE TABLEremove rapidamente todas as linhas e mantém a tabela; o contador de autoincremento é reiniciado.DROP TABLEremove a tabela com os seus dados e estrutura;IF EXISTSevita um erro.- O
DELETEpode remover parte das linhas e pode ser revertido; oTRUNCATEnão aceitaWHERE. - No MySQL e no MariaDB,
TRUNCATEeDROPfazem commit implícito e não podem ser revertidos. - As chaves estrangeiras impedem remover ou esvaziar uma tabela referenciada.
Perguntas Frequentes
Qual é a diferença entre TRUNCATE e DELETE?
O DELETE remove as linhas uma a uma, pode usar WHERE, dispara os triggers de remoção e pode ser revertido. O TRUNCATE remove todas as linhas de uma vez, é muito mais rápido, reinicia o contador de autoincremento e, no MySQL, não pode ser revertido.
Qual é a diferença entre TRUNCATE e DROP TABLE?
O TRUNCATE esvazia a tabela, mas mantém-na pronta para novas linhas. O DROP TABLE remove a tabela por completo; para voltar a usá-la, é preciso criá-la com CREATE TABLE.
O TRUNCATE pode ser revertido?
No MySQL e no MariaDB, não: provoca um commit implícito. No PostgreSQL e no SQL Server, sim, quando é executado dentro de uma transação.