ProgrammatieDatabase engineer

Beschrijf de procedures en kenmerken van veilige verwijdering/schoonmaak (DELETE, TRUNCATE) van gegevens in SQL. Wat is het verschil tussen hen, wat zijn de beperkingen met betrekking tot transacties, vergrendelingen en triggers, en hoe voorkom je dat je gegevens per ongeluk verliest?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

DELETE en TRUNCATE zijn beide hulpmiddelen voor het opschonen van tabellen, maar werken op verschillende manieren:

  • DELETE verwijdert rijen op basis van een voorwaarde of allemaal, ondersteunt WHERE, kan worden teruggedraaid, activeert triggers. Kan traag zijn bij een groot aantal rijen (één rij per keer).
  • TRUNCATE maakt de hele tabel onmiddellijk leeg, kan geen WHERE gebruiken, wordt vaak niet per rij gelogd, activeert niet altijd triggers. In de meeste gevallen is de actie onomkeerbaar, kan niet worden teruggedraaid in bepaalde DBMS.

Fijnere punten:

  • DELETE ondersteunt transactieterugroeping (ROLLBACK), TRUNCATE niet of afhankelijk van DBMS.
  • TRUNCATE reset meestal de identity/sequence teller.
  • TRUNCATE is niet toepasbaar als er externe sleutels of verwijzingen naar de tabel zijn.

Voorbeeld:

-- Verwijder bestellingen ouder dan 3 jaar DELETE FROM orders WHERE created_at < CURRENT_DATE - INTERVAL '3 years'; -- Maak de tabel volledig leeg (snel) TRUNCATE TABLE logs;

Vragen met een valkuil

Kun je gegevens herstellen na TRUNCATE?

Typische fout: men denkt dat TRUNCATE, net als DELETE, kan worden teruggedraaid in een transactie. Maar TRUNCATE kan meestal niet worden teruggedraaid of een UNDO worden gemaakt, behalve in sommige DBMS (bijvoorbeeld PostgreSQL bij werken binnen een transactie).

Voorbeeld (in de meeste DBMS):

BEGIN; TRUNCATE TABLE orders; ROLLBACK; -- In de meeste DBMS zal dit niet werken, gegevens zijn verloren!

Voorbeelden van echte fouten door gebrek aan kennis van de fijne punten van het onderwerp


Geschiedenis

Verwijderen van tijdelijke gegevens in de productie-database met TRUNCATE in plaats van TEST. De audit-trigger voor het verwijderen van rijen werkte alleen op DELETE — informatie over verloren gegevens, tijd en gebruiker ontbreekt. Dit heeft de incidentanalyse beïnvloed.


Geschiedenis

Het opschonen van een tabel met TRUNCATE terwijl er een externe sleutel aanwezig is. SQL genereerde een fout vanwege de referentiële integriteitsbeperking, het script voltooide niet, de automatisering stopte. Oplossing: tijdelijk externe sleutels verwijderen of DELETE gebruiken.


Geschiedenis

Massale gegevensverwijdering via DELETE in grote tabellen zonder batching: door lange vergrendelingen "hing" de database, andere transacties wachtten op het vrijgeven van vergrendelingen. Het resultaat — stilstand van het systeem. Correct: gebruik DELETE LIMIT/OFFSET, als ondersteund, of batches.