Aller au contenu

SQLite : tables et types

Création et modification de la structure. Les exemples construisent la base boutique.db, réutilisée dans les pages suivantes.

SQLite n’impose pas de type strict par défaut : chaque colonne a une affinité qui influence la conversion des valeurs.

Affinité Contenu Exemples de déclaration
INTEGER Entiers INTEGER, INT
REAL Nombres à virgule flottante REAL, FLOAT
TEXT Texte TEXT, VARCHAR(100)
BLOB Données binaires BLOB
NUMERIC Nombres, convertis si possible NUMERIC, DECIMAL(10,2)

SQLite n’a pas de type date ni booléen : on utilise TEXT (date ISO 2026-10-05 14:30:00), INTEGER (horodatage Unix) et INTEGER 0 ou 1 pour les booléens.

Le mot-clé STRICT active un typage strict (disponible depuis SQLite 3.37) : une valeur du mauvais type est refusée.

PRAGMA foreign_keys = ON;
CREATE TABLE clients (
id INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
ville TEXT,
cree_le TEXT NOT NULL DEFAULT (datetime('now'))
) STRICT;
CREATE TABLE commandes (
id INTEGER PRIMARY KEY,
client_id INTEGER NOT NULL REFERENCES clients (id) ON DELETE CASCADE,
montant REAL NOT NULL CHECK (montant >= 0),
statut TEXT NOT NULL DEFAULT 'nouvelle' CHECK (statut IN ('nouvelle', 'payee', 'expediee', 'annulee')),
passee_le TEXT NOT NULL DEFAULT (datetime('now'))
) STRICT;
  • INTEGER PRIMARY KEY : clé primaire qui devient l’identifiant interne de ligne (rowid), numérotée automatiquement.
  • DEFAULT (datetime('now')) : valeur par défaut calculée (les expressions se mettent entre parenthèses).
  • CHECK remplace les types ENUM absents de SQLite.
  • Les montants exacts peuvent aussi se stocker en centimes (INTEGER) pour éviter les erreurs d’arrondi des nombres flottants.
.tables
.schema clients
PRAGMA table_info(clients);
PRAGMA foreign_key_list(commandes);
SELECT name, sql FROM sqlite_master WHERE type = 'table';
ALTER TABLE clients ADD COLUMN telephone TEXT;
ALTER TABLE clients RENAME COLUMN telephone TO tel;
ALTER TABLE clients DROP COLUMN tel;
ALTER TABLE clients RENAME TO clients_archive;
ALTER TABLE clients_archive RENAME TO clients;

ALTER TABLE ne permet pas de changer le type d’une colonne ni d’ajouter une contrainte. Pour cela, recréer la table :

BEGIN;
CREATE TABLE clients_nouveau (
id INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
ville TEXT,
cree_le TEXT NOT NULL DEFAULT (datetime('now'))
) STRICT;
INSERT INTO clients_nouveau SELECT id, nom, email, ville, cree_le FROM clients;
DROP TABLE clients;
ALTER TABLE clients_nouveau RENAME TO clients;
COMMIT;
CREATE TABLE lignes (
prix REAL NOT NULL,
qte INTEGER NOT NULL,
total REAL GENERATED ALWAYS AS (prix * qte) VIRTUAL
);
SELECT datetime('now'); -- 2026-10-05 14:30:00 (UTC)
SELECT datetime('now', 'localtime');
SELECT date('now', '-7 days');
SELECT strftime('%d/%m/%Y', 'now');
SELECT unixepoch(); -- horodatage Unix
SELECT json_extract('{"a": 1, "b": {"c": 2}}', '$.b.c'); -- 2
SELECT '{"nom": "Alice"}' ->> '$.nom'; -- Alice
SELECT json_object('id', 1, 'nom', 'Alice');
DELETE FROM commandes; -- vide la table (pas de TRUNCATE dans SQLite)
DROP TABLE IF EXISTS essai;
  • STRICT pour les nouvelles tables.
  • PRAGMA foreign_keys = ON à chaque connexion.
  • INTEGER PRIMARY KEY sur chaque table.
  • Dates en TEXT au format ISO 8601, ou en horodatage Unix.
  • Une base de plusieurs Go : ajouter des index sur les colonnes de recherche.