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.
Types et affinités
Section intitulée « Types et affinités »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.
Tables STRICT
Section intitulée « Tables STRICT »Le mot-clé STRICT active un typage strict (disponible depuis SQLite 3.37) : une valeur du mauvais type est refusée.
Créer des tables
Section intitulée « Créer des tables »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).CHECKremplace les typesENUMabsents de SQLite.- Les montants exacts peuvent aussi se stocker en centimes (
INTEGER) pour éviter les erreurs d’arrondi des nombres flottants.
Inspecter le schéma
Section intitulée « Inspecter le schéma ».tables.schema clientsPRAGMA table_info(clients);PRAGMA foreign_key_list(commandes);SELECT name, sql FROM sqlite_master WHERE type = 'table';Modifier une table
Section intitulée « Modifier une 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;Colonnes générées
Section intitulée « Colonnes générées »CREATE TABLE lignes ( prix REAL NOT NULL, qte INTEGER NOT NULL, total REAL GENERATED ALWAYS AS (prix * qte) VIRTUAL);Dates et heures
Section intitulée « Dates et heures »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 UnixSELECT json_extract('{"a": 1, "b": {"c": 2}}', '$.b.c'); -- 2SELECT '{"nom": "Alice"}' ->> '$.nom'; -- AliceSELECT json_object('id', 1, 'nom', 'Alice');Vider et supprimer
Section intitulée « Vider et supprimer »DELETE FROM commandes; -- vide la table (pas de TRUNCATE dans SQLite)DROP TABLE IF EXISTS essai;Bonnes pratiques
Section intitulée « Bonnes pratiques »STRICTpour les nouvelles tables.PRAGMA foreign_keys = ONà chaque connexion.INTEGER PRIMARY KEYsur chaque table.- Dates en
TEXTau format ISO 8601, ou en horodatage Unix. - Une base de plusieurs Go : ajouter des index sur les colonnes de recherche.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel : CREATE TABLE et Datatypes
- Suite : Requêtes SQL