Omezení (Constraints) jsou pravidla vynucovaná databází na datech v tabulkách — zaručují integritu dat na úrovni databáze (ne jen v kódu aplikace). Hlavní z nich jsou: PRIMARY KEY, FOREIGN KEY, UNIQUE, , a .
Omezení (Constraints) jsou pravidla vynucovaná databází na datech v tabulkách — zaručují integritu dat na úrovni databáze (ne jen v kódu aplikace). Hlavní z nich jsou: PRIMARY KEY, FOREIGN KEY, UNIQUE, , a .
NOT NULLCHECKDEFAULTCREATE TABLE users (
id INT PRIMARY KEY, -- unique + not null identifier
email VARCHAR(255) UNIQUE NOT NULL, -- must be unique AND present
age INT CHECK (age >= 0 AND age <= 120), -- must satisfy a condition
country VARCHAR(2) DEFAULT 'US', -- default value if not provided
role VARCHAR(20) NOT NULL DEFAULT 'user',
manager_id INT REFERENCES users(id) -- FOREIGN KEY (referential integrity)
);
PRIMARY KEY → uniquely identifies a row (unique + not null, indexed)
FOREIGN KEY → references another table's key (referential integrity)
UNIQUE → no duplicate values allowed in this column
NOT NULL → the column must have a value (can't be NULL)
CHECK → the value must satisfy a condition (age >= 0, status IN (...))
DEFAULT → a value used when none is provided on insert
-- ❌ relying only on application code to enforce uniqueness:
-- a race condition or a bug or a different app could insert a duplicate
-- ✅ a UNIQUE constraint guarantees it at the DB level — ALWAYS enforced,
-- regardless of which code or how many apps access the database
email VARCHAR(255) UNIQUE
Omezení databáze jsou poslední linií obrany pro integritu dat — jsou vynucovány bez ohledu na to, jaký kód vkládá data (více aplikací, skripty, ruční změny nebo chybný kód), a řeší race conditions, které kontroly na úrovni aplikace minout mohou.
CHECK (price > 0) -- prices must be positive
CHECK (status IN ('active', 'inactive')) -- only valid statuses
CHECK (end_date > start_date) -- logical consistency
CHECK vynucuje obchodní/doménová pravidla přímo ve schématu.
Omezení jsou nezbytná pro údržbu integrity dat — zaručují, že data v databázi splňují pravidla (jedinečnost, přítomnost, platné hodnoty, platné reference) na úrovni databáze, což je zásadní pro spolehlivé aplikace, takže jejich pochopení je důležité.
Znalost typů omezení (PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK, DEFAULT) a toho, co každé z nich vynucuje, je nezbytná pro správný návrh schématu.
Nejdůležitější koncepční bod je proč vynucovat na úrovni databáze místo pouze v kódu aplikace: omezení databáze jsou poslední linií obrany pro integritu dat — jsou vždy vynucovány bez ohledu na to, který kód nebo kolik aplikací k datům přistupuje, zachycují chyby, které by kontroly aplikace mohly minout, a zásadně řeší race conditions, které ověřování na úrovni aplikace nezvládá (např. dva současné vklady, oba projdou kontrolou jedinečnosti v aplikaci, ale UNIQUE omezení správně zamítne duplikát).
Polítat se jen na aplikační kód pro integritu je riskantní; omezení poskytují záruku.
Pochopení CHECK omezení pro vynucování doménových/obchodních pravidel (platné rozsahy, povolené hodnoty, logická konzistence) přímo ve schématu je také cenné.
Protože je integrita dat kritická pro spolehlivé aplikace a protože omezení poskytují záruky na úrovni databáze, které chrání před chybami, race conditions a nekonzistentními daty způsoby, kterými samotný aplikační kód není schopen, je pochopení omezení — jejich typů, jejich záruk integrity a důležitosti vynucování na úrovni databáze — důležité, základní znalosti pro navrhování robustních databází a klíčový aspekt budování aplikací, jejichž data zůstávají konzistentní a platná.