CREATE TABLE în SQLite

Tabele și tipuri de date Toate versiunile SQLite 3

Creează un tabel nou. În SQLite tipul coloanei este opțional și doar sugerează cum se salvează valorile.

Sintaxă
CREATE TABLE [IF NOT EXISTS] nume (
  coloana [tip] [constrângeri],
  ...
  [constrângeri de tabel]
) [STRICT] [, WITHOUT ROWID];
CREATE TABLE nume AS SELECT ...;

Ce face CREATE TABLE

Sintaxa de bază este cea din orice bază SQL, dar SQLite are câteva particularități. Tipul coloanei poate lipsi cu totul (CREATE TABLE t (a, b)) și poate fi orice text: VARCHAR(50), DATETIME sau BOOLEAN sunt acceptate, dar SQLite nu verifică lungimea și nu are tipuri speciale pentru dată sau boolean. Din numele tipului deduce doar afinitatea coloanei.

Constrângerile funcționează: NOT NULL, UNIQUE, CHECK, DEFAULT, PRIMARY KEY. REFERENCES (cheile străine) este verificat doar dacă ai pornit PRAGMA foreign_keys = ON. La final poți adăuga STRICT (tipuri verificate) și WITHOUT ROWID.

CREATE TABLE ... AS SELECT creează un tabel din rezultatul unei interogări, dar copiază doar numele coloanelor și afinitatea, fără cheie primară, NOT NULL sau alte constrângeri.

Parametri

Parametru Descriere
IF NOT EXISTS Nu dă eroare dacă tabelul există deja (nici nu îl modifică).
tip Opțional. Stabilește afinitatea: INTEGER, TEXT, REAL, NUMERIC sau BLOB.
STRICT Tipurile coloanelor sunt verificate la fiecare scriere (din 3.37.0).
WITHOUT ROWID Tabelul nu are coloana ascunsă rowid; cere o cheie primară.

Exemple

Exemplul 1: Tabel cu constrângeri

CHECK și DEFAULT se comportă ca în alte baze de date. datetime('now') între paranteze este o valoare implicită calculată la inserare; aici o afișăm doar ca prezentă, pentru că se schimbă la fiecare rulare.

CREATE TABLE IF NOT EXISTS produse (
  id INTEGER PRIMARY KEY,
  nume TEXT NOT NULL UNIQUE,
  pret INTEGER NOT NULL CHECK (pret > 0),
  stoc INTEGER DEFAULT 0,
  adaugat TEXT DEFAULT (datetime('now'))
);
INSERT INTO produse (nume, pret) VALUES ('Caiet', 12), ('Pix', 4);
SELECT id, nume, pret, stoc, adaugat IS NOT NULL AS are_data FROM produse;

Rezultat

╭────┬───────┬──────┬──────┬──────────╮
│ id │ nume  │ pret │ stoc │ are_data │
╞════╪═══════╪══════╪══════╪══════════╡
│  1 │ Caiet │   12 │    0 │        1 │
│  2 │ Pix   │    4 │    0 │        1 │
╰────┴───────┴──────┴──────┴──────────╯

Exemplul 2: Tipuri libere și coloane fără tip

SQLite acceptă VARCHAR(5), dar nu taie textul mai lung de 5 caractere. Coloana nota nu are tip deloc. Valoarea reală a fiecărei celule se vede cu typeof().

CREATE TABLE elevi (nume VARCHAR(5), activ BOOLEAN, nota);
INSERT INTO elevi VALUES ('Alexandra', TRUE, 9.5);
SELECT nume, length(nume) AS litere, activ, typeof(activ) AS tip_activ, nota, typeof(nota) AS tip_nota
FROM elevi;

Rezultat

╭───────────┬────────┬───────┬───────────┬──────┬──────────╮
│   nume    │ litere │ activ │ tip_activ │ nota │ tip_nota │
╞═══════════╪════════╪═══════╪═══════════╪══════╪══════════╡
│ Alexandra │      9 │     1 │ integer   │  9.5 │ real     │
╰───────────┴────────┴───────┴───────────┴──────┴──────────╯

Exemplul 3: CREATE TABLE … AS SELECT pierde constrângerile

Tabelul copie are aceleași coloane, dar .schema arată că nu mai are PRIMARY KEY sau NOT NULL, iar tipurile sunt rescrise după afinitate.

CREATE TABLE produse (id INTEGER PRIMARY KEY, nume TEXT NOT NULL, pret INTEGER);
INSERT INTO produse (nume, pret) VALUES ('Caiet', 12), ('Pix', 4);
CREATE TABLE copie AS SELECT * FROM produse WHERE pret > 5;
.schema copie
SELECT * FROM copie;

Rezultat

CREATE TABLE copie(id INT,nume TEXT,pret INT);
╭────┬───────┬──────╮
│ id │ nume  │ pret │
╞════╪═══════╪══════╡
│  1 │ Caiet │   12 │
╰────┴───────┴──────╯

Greșeli frecvente

  • Te bazezi pe VARCHAR(n) ca să limitezi lungimea. SQLite ignoră lungimea; folosește CHECK (length(nume) <= 50).
  • Declari chei străine și crezi că sunt verificate. Fără PRAGMA foreign_keys = ON, pe fiecare conexiune, REFERENCES nu are niciun efect.
  • Scrii AUTO_INCREMENT ca în MySQL. În SQLite, id INTEGER PRIMARY KEY primește automat valori; AUTOINCREMENT (fără underscore) există, dar rareori e necesar.

Comenzi înrudite

  • Afinitatea tipurilor și typeof(): În SQLite tipul aparține valorii, nu coloanei. Afinitatea coloanei doar încearcă să convertească valorile la inserare.
  • Tabele STRICT: Un tabel STRICT verifică tipul fiecărei valori la scriere și refuză, cu eroare, valorile care nu se potrivesc cu coloana.
  • rowid și INTEGER PRIMARY KEY: Orice tabel SQLite obișnuit are o coloană ascunsă rowid; o coloană INTEGER PRIMARY KEY devine alias al ei și primește automat valori.
  • ALTER TABLE: Modifică un tabel existent: redenumire, coloane adăugate sau șterse. Schimbarea tipului unei coloane nu se poate face direct.
  • PRAGMA foreign_keys: Pornește verificarea cheilor străine. În SQLite este oprită implicit și trebuie pornită la fiecare conexiune.
  • .schema: Afișează instrucțiunile CREATE pentru tabelele, indexurile, vederile și declanșatorii din bază, exact cum au fost scrise.