Tabele STRICT în SQLite

Un tabel STRICT verifică tipul fiecărei valori la scriere și refuză, cu eroare, valorile care nu se potrivesc cu coloana.

Sintaxă
CREATE TABLE nume (
  coloana INT | INTEGER | REAL | TEXT | BLOB | ANY,
  ...
) STRICT;

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 STRICT unui tabel existent cu ALTER TABLE. Nu se poate; creezi un tabel nou STRICT și copiezi datele.
  • Păstrezi tipuri ca VARCHAR(50) sau DATETIME și pui STRICT. Primești eroare la creare; folosește doar INT, INTEGER, REAL, TEXT, BLOB, ANY.
  • Crezi că STRICT verifică și lungimea sau formatul textului. Verifică doar clasa valorii; pentru reguli suplimentare folosește CHECK.

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ă.