Ce face Tabele STRICT
Cuvântul STRICT pus după paranteza de închidere schimbă regulile tabelului: fiecare coloană trebuie să aibă unul dintre tipurile INT, INTEGER, REAL, TEXT, BLOB sau ANY, iar valorile care nu pot fi convertite fără pierdere la tipul coloanei sunt refuzate cu eroare.
Conversiile sigure încă au loc: textul '12' intră ca 12 într-o coloană INTEGER, iar 12 devine 12.0 într-o coloană REAL. Dar 'doisprezece' sau 12.5 într-o coloană INTEGER dau eroare. Coloana ANY acceptă orice și păstrează valoarea exact cum a venit, fără nicio conversie.
Tabelele STRICT apar din SQLite 3.37.0 (2021). O bază cu tabele STRICT nu poate fi deschisă de versiuni mai vechi. Se pot combina cu WITHOUT ROWID: ) STRICT, WITHOUT ROWID;.
Parametri
| Parametru | Descriere |
|---|---|
INT / INTEGER |
Numere întregi. |
REAL |
Numere cu virgulă (întregii sunt convertiți). |
TEXT |
Text. |
BLOB |
Date binare. |
ANY |
Orice valoare, păstrată fără conversie. |
Exemple
Exemplul 1: Conversiile sigure sunt acceptate
'12' devine întreg, 4 devine 4.0 în coloana REAL, iar coloana ANY păstrează textul '12' ca text. Coloana strict din pragma_table_list confirmă tipul tabelului.
CREATE TABLE produse (
id INTEGER PRIMARY KEY,
nume TEXT NOT NULL,
pret INTEGER,
greutate REAL,
extra ANY
) STRICT;
INSERT INTO produse (nume, pret, greutate, extra) VALUES ('Caiet', '12', 4, '12');
SELECT pret, typeof(pret), greutate, typeof(greutate), extra, typeof(extra) FROM produse;
SELECT name, strict FROM pragma_table_list WHERE name = 'produse';
Rezultat
╭──────┬──────────────┬──────────┬──────────────────┬───────┬───────────────╮
│ pret │ typeof(pret) │ greutate │ typeof(greutate) │ extra │ typeof(extra) │
╞══════╪══════════════╪══════════╪══════════════════╪═══════╪═══════════════╡
│ 12 │ integer │ 4.0 │ real │ 12 │ text │
╰──────┴──────────────┴──────────┴──────────────────┴───────┴───────────────╯
╭─────────┬────────╮
│ name │ strict │
╞═════════╪════════╡
│ produse │ 1 │
╰─────────┴────────╯
Exemplul 2: O valoare greșită este refuzată
Același INSERT ar trece fără probleme într-un tabel obișnuit, cu textul salvat în coloana de preț. Tabelul STRICT îl oprește:
CREATE TABLE produse (id INTEGER PRIMARY KEY, nume TEXT NOT NULL, pret INTEGER) STRICT;
INSERT INTO produse (nume, pret) VALUES ('Caiet', 'doisprezece');
Rezultat (eroare)
Error near line 2: cannot store TEXT value in INTEGER column produse.pret
Exemplul 3: Tipuri nepermise în STRICT
DATETIME, VARCHAR sau BOOLEAN nu sunt acceptate într-un tabel STRICT. Datele calendaristice se țin ca TEXT ('2026-10-25') sau ca INTEGER (secunde Unix).
CREATE TABLE facturi (id INTEGER PRIMARY KEY, data DATETIME) STRICT;
Rezultat (eroare)
Parse error near line 1: unknown datatype for facturi.data: "DATETIME"
Greșeli frecvente
- Adaugi
STRICTunui tabel existent cuALTER TABLE. Nu se poate; creezi un tabel nou STRICT și copiezi datele. - Păstrezi tipuri ca
VARCHAR(50)sauDATETIMEși puiSTRICT. Primești eroare la creare; folosește doarINT,INTEGER,REAL,TEXT,BLOB,ANY. - Crezi că
STRICTverifică și lungimea sau formatul textului. Verifică doar clasa valorii; pentru reguli suplimentare foloseșteCHECK.
Comenzi înrudite
Afinitatea tipurilor și typeof(): În SQLite tipul aparține valorii, nu coloanei. Afinitatea coloanei doar încearcă să convertească valorile la inserare.CREATE TABLE: Creează un tabel nou. În SQLite tipul coloanei este opțional și doar sugerează cum se salvează valorile.WITHOUT ROWID: Creează un tabel fără coloana ascunsă rowid, organizat direct după cheia primară; util pentru chei compuse sau texte scurte.PRAGMA table_info: Afișează coloanele unui tabel: poziția, numele, tipul declarat, NOT NULL, valoarea implicită și cheia primară.