Ответ
В контексте работы с реляционными БД (PostgreSQL, MySQL) из Node.js-приложений, TRUNCATE обычно выполняется значительно быстрее DELETE без условия WHERE.
Основные различия:
| Аспект | TRUNCATE |
DELETE (без WHERE) |
|---|---|---|
| Скорость | Быстрее (операция уровня таблицы) | Медленнее (построчное удаление) |
| Логирование | Минимальное (только освобождение страниц) | Подробное (каждая удаленная строка) |
| Блокировки | Блокировка всей таблицы (кратковременно) | Блокировка строк (может привести к долгой блокировке) |
| Триггеры | Не вызывает триггеры ON DELETE |
Вызывает триггеры ON DELETE |
| Автоинкремент | Сбрасывает счетчик (в большинстве СУБД) | Сохраняет текущее значение |
| WHERE | Не поддерживает условия | Поддерживает условия |
Пример использования из Node.js с PostgreSQL:
const { Client } = require('pg');
async function clearTable(tableName, useTruncate = true) {
const client = new Client({
connectionString: process.env.DATABASE_URL
});
await client.connect();
try {
if (useTruncate) {
// Быстрее, но необратимо и сбрасывает sequence
await client.query(`TRUNCATE TABLE ${tableName} RESTART IDENTITY CASCADE`);
console.log(`Таблица ${tableName} очищена через TRUNCATE`);
} else {
// Медленнее, но безопаснее и вызывает триггеры
await client.query(`DELETE FROM ${tableName}`);
console.log(`Таблица ${tableName} очищена через DELETE`);
}
} catch (error) {
console.error('Ошибка при очистке таблицы:', error.message);
throw error;
} finally {
await client.end();
}
}
// Использование
await clearTable('user_sessions', true); // TRUNCATE
await clearTable('audit_log', false); // DELETE (чтобы сохранить триггеры)
Когда использовать:
TRUNCATE— при очистке временных данных, сбросе тестовых данных, когда не нужны триггеры и можно сбросить автоинкремент.DELETE— когда нужно удалить данные с условиями, важно вызвать триггеры, или требуется возможность отката (благодаря подробному логированию).
Важно для Node.js: При использовании TRUNCATE в продакшне учитывайте, что операция необратима и требует прав TRUNCATE (отдельных от DELETE). В ORM типа Sequelize или TypeORM используйте соответствующие методы (Model.truncate() vs Model.destroy({ truncate: true })).