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șteCHECK (length(nume) <= 50). - Declari chei străine și crezi că sunt verificate. Fără
PRAGMA foreign_keys = ON, pe fiecare conexiune,REFERENCESnu are niciun efect. - Scrii
AUTO_INCREMENTca în MySQL. În SQLite,id INTEGER PRIMARY KEYprimeș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.