Î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.
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;