Constrângerea CHECK în MySQL 8 (Validarea Datelor la Nivel de Tabel) în MySQL

Baze de date și tabele MySQL 8.0.16+

Validarea strictă a regulilor de business la nivelul motorului de baze de date: verificarea intervalelor numerice, a formatelor și a stărilor permise.

Sintaxă
CREATE TABLE utilizatori (varsta INT, CHECK (varsta >= 18));

În versiunile vechi (MySQL 5.7 și anterior), deși sintaxa CHECK era acceptată de parserul SQL, ea era complet ignorată de motorul de execuție. Începând cu MySQL 8.0.16, constrângerile CHECK sunt verificate și impuse strict de motorul InnoDB la fiecare instrucțiune INSERT și UPDATE.

Prin constrângerea CHECK, regulile fundamentale de integritate a datelor sunt garantate direct la nivelul bazei de date, împiedicând coruperea datelor chiar dacă un script backend are bug-uri sau dacă o inserare manuală este rulată greșit dintr-o unealtă de administrare.

Definirea regulilor de validare pe coloane individuale și la nivel de tabel
CREATE TABLE produse (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nume VARCHAR(100) NOT NULL,
    pret DECIMAL(10,2) NOT NULL,
    pret_promotional DECIMAL(10,2),
    stoc INT NOT NULL,
    status VARCHAR(20) NOT NULL,
    
    -- 1. Constrângere CHECK pe o singură coloană:
    CONSTRAINT chk_pret_pozitiv CHECK (pret > 0),
    CONSTRAINT chk_stoc_valid CHECK (stoc >= 0),
    
    -- 2. Constrângere de tip listă de valori permise (alternativă la ENUM):
    CONSTRAINT chk_status_valid CHECK (status IN ('activ', 'inactiv', 'arhivata')),
    
    -- 3. Constrângere la nivel de tabel (compară două coloane diferite):
    -- Prețul promoțional trebuie să fie întotdeauna strict mai mic decât prețul de bază!
    CONSTRAINT chk_promo_valida CHECK (
        pret_promotional IS NULL OR pret_promotional < pret
    )
);

-- Testare inserare invalidă:
-- INSERT INTO produse (nume, pret, pret_promotional, stoc, status) 
-- VALUES ('Telefon', 1000, 1200, 5, 'activ');
-- Rezultat: ERROR 3819 (HY000): Check constraint 'chk_promo_valida' is violated.

Gestionarea Constrângerilor Existente

Poți adăuga, dezactiva temporar sau șterge o constrângere CHECK prin ALTER TABLE:

-- Dezactivarea temporară a verificării (util la importuri masive de date vechi):
ALTER TABLE produse ALTER CONSTRAINT chk_promo_valida NOT ENFORCED;

-- Reactivarea verificării:
ALTER TABLE produse ALTER CONSTRAINT chk_promo_valida ENFORCED;

-- Ștergerea definitivă a constrângerii:
ALTER TABLE produse DROP CHECK chk_promo_valida;