Créer des tables SQL et modifier des données
CREATE TABLE avec des types de données adaptés, protège les données avec NOT NULL, UNIQUE, CHECK, des clés primaires et des clés étrangères, puis ajoute, modifie et supprime des lignes avec INSERT, UPDATE et DELETE. Entraîne-toi à cibler exactement les bonnes lignes, regroupe les modifications liées dans des transactions que tu peux valider ou annuler, et modifie ou supprime des tables avec ALTER TABLE et DROP TABLE. Les exemples utilisent du SQL standard compatible avec SQLite et PostgreSQL ; les différences avec MySQL, SQL Server et Oracle sont signalées lorsqu’elles comptent.DébutantUnité 6 sur 6 de la formation Formation : SQL : requêtes SELECT, jointures et agrégation
Ce que tu vas apprendre
- Écris des instructions
CREATE TABLEqui définissent une table et ses colonnes, et choisis pour chaque colonne un type de données adapté aux valeurs qu’elle contiendra.- Écrire une instruction CREATE TABLEDéfinis une nouvelle table avec des colonnes nommées, vérifie sa structure et évite les erreurs de syntaxe les plus fréquentes chez les débutants.
- Choisir un type de données pour chaque colonneChoisis des types entier, décimal exact, à virgule flottante, texte, date et booléen selon les valeurs contenues dans une colonne, et comprends en quoi le typage flexible de SQLite diffère de celui de bases de données plus strictes.
- Écrire une instruction CREATE TABLE
- Utilise des contraintes pour que la base de données rejette elle-même les valeurs manquantes, en double, hors plage ou sans correspondance, et donne une clé fiable à chaque ligne.
- Rendre obligatoires, prédéfinir et limiter des valeurs avec NOT NULL, DEFAULT, UNIQUE et CHECKDéclare les règles de colonne et de table qui imposent des valeurs présentes, distinctes et dans la plage autorisée, et prévois les insertions qu’une règle rejettera.
- Identifier les lignes par des clés primaires et des identifiants générésDéclare des clés primaires simples et composites, laisse la base de données numéroter les nouvelles lignes et comprends ce que garantissent ou non les identifiants générés dans chaque système de bases de données.
- Relier des tables par des clés étrangèresDéclare des clés étrangères qui maintiennent la validité des références entre tables, choisis ce qui se passe lorsqu’une ligne référencée est supprimée et active le contrôle là où il est désactivé.
- Rendre obligatoires, prédéfinir et limiter des valeurs avec NOT NULL, DEFAULT, UNIQUE et CHECK
- Ajoute de nouvelles lignes avec
INSERT, une par une, plusieurs à la fois ou en les copiant depuis une requête, et gère les clés générées et les doublons.- Insérer des lignes avec VALUESÉcris des instructions
INSERT ... VALUESavec une liste de colonnes et des textes, nombres, dates etNULLcorrectement écrits, puis lis les erreurs qui empêchent une insertion. - Insérer à partir de requêtes, renvoyer les nouvelles clés et gérer les doublonsCopie des lignes avec
INSERT ... SELECT, récupère les valeurs générées avecRETURNINGet décide ce qui se passe lorsqu’une ligne insérée entre en conflit avec une ligne existante.
- Insérer des lignes avec VALUES
- Modifie des valeurs avec
UPDATEet supprime des lignes avecDELETE, en veillant à ce que chaque instruction affecte exactement les lignes voulues.- Modifier des valeurs avec UPDATEÉcris des instructions
UPDATEqui définissent une ou plusieurs colonnes, calculent de nouvelles valeurs à partir des anciennes et respectent les contraintes de la table. - Supprimer des lignes avec DELETESupprime des lignes choisies avec
DELETE, distingueDELETE,TRUNCATEetDROP TABLE, et détermine quand il vaut mieux marquer une ligne comme supprimée que l’effacer. - Cibler exactement les lignes vouluesConstruis des conditions
WHEREqui correspondent aux lignes à modifier et à elles seules, puis vérifie le résultat avant de le conserver.
- Modifier des valeurs avec UPDATE
- Utilise des transactions pour conserver ou annuler dans leur ensemble des modifications liées, et rétablir correctement la situation lorsqu’une instruction échoue.
- Valider ou annuler un ensemble de modificationsDémarre une transaction, conserve ses modifications avec
COMMITou annule-les avecROLLBACK, et comprends la validation automatique. - Gérer les erreurs, les points de sauvegarde et les modifications de structure dans une transactionRéagis correctement lorsqu’une instruction échoue dans une transaction, annule une partie d’une transaction avec un point de sauvegarde et découvre quelles bases de données peuvent annuler
CREATE,ALTERetDROP.
- Valider ou annuler un ensemble de modifications
- Modifie la structure des tables existantes sans perdre leurs lignes et supprime en toute sécurité les tables devenues inutiles.
- Ajouter, renommer et supprimer des colonnes avec ALTER TABLEUtilise
ALTER TABLEpour ajouter, renommer et supprimer des colonnes, ainsi que pour modifier des types et des contraintes, et contourne les limites de SQLite. - Supprimer des tables avec DROP TABLESupprime des tables avec
DROP TABLE, respecte les dépendances entre les tables et choisis entre supprimer une table, la vider et supprimer des lignes.
- Ajouter, renommer et supprimer des colonnes avec ALTER TABLE
Créer des tables SQL : cours
1Créer des tables avec des types de colonnes adaptés
Une table doit avoir une structure claire avant de pouvoir contenir des données utiles. Commence par les informations enregistrées dans une ligne, donne un nom à chacune et choisis comment la base de données les stockera. Tu vas créer une table vide, examiner ce qui a réellement été créé et distinguer un nombre utilisé dans des calculs d’un texte qui ressemble seulement à un nombre. SQLite et PostgreSQL partagent une grande partie de leur syntaxe, mais leurs règles de typage peuvent produire des résultats très différents.
1.1 Écrire une instruction CREATE TABLE
La définition d’une table décrit ce que chaque ligne peut contenir. Elle n’ajoute aucune ligne. Dans une boutique en ligne, chaque produit nécessite des champs distincts pour son identifiant, son nom, son prix et son nombre d’articles en stock.
Construire la définition
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC(8, 2) NOT NULL,
in_stock INTEGER DEFAULT 0
);
Lis de l’extérieur vers l’intérieur. CREATE TABLE products nomme la nouvelle table. Les parenthèses contiennent les définitions de ses colonnes. Chaque ligne indique un nom de colonne, un type et les éventuelles règles de cette colonne. Les virgules séparent les définitions ; la dernière n’est pas suivie d’une virgule. Le point-virgule termine l’instruction. Après son exécution réussie, SELECT * FROM products; ne renvoie aucune ligne.
Cette déclaration de clé génère des identifiants dans SQLite. Dans PostgreSQL, utilise id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY pour les générer. La déclaration décimale se comporte aussi différemment selon le système ; choisir un stockage exact fait partie du choix du type.
Donner une colonne à chaque information
Une ligne de client pourrait contenir id, first_name, last_name, email et signup_date. Réunir « Ana Ruiz, ana@example.com » dans un seul champ rend difficiles la recherche et la vérification séparées du nom et de l’adresse e-mail. Nomme les champs selon leur contenu. Des noms courts en minuscules reliés par des tirets bas, comme unit_price, sont faciles à réutiliser.
Évite les mots-clés comme noms : orders fonctionne, tandis que order sans guillemets entre en conflit avec le mot-clé SQL ORDER. Un nom contenant des espaces doit être placé entre guillemets doubles, comme dans "order date", chaque fois que tu l’utilises. PostgreSQL convertit les noms sans guillemets en minuscules : Products et products sans guillemets désignent donc le même nom.
Les apostrophes ont un autre rôle : elles encadrent les valeurs textuelles comme 'Desk lamp'. Les guillemets doubles désignent les noms. PostgreSQL lit "Desk lamp" comme un nom de colonne, pas comme le texte d’un produit.
Vérifier ce qui a été créé
Une virgule finale avant ) provoque une erreur de syntaxe. Une virgule manquante en provoque souvent une aussi, mais SQLite peut lire plusieurs mots comme un seul nom de type. CREATE TABLE t (a INTEGER b TEXT); crée une colonne appelée a, et non deux colonnes. Examine la définition :
- Interpréteur SQLite :
.schema productsaffiche l’instruction de création. - SQL dans SQLite :
PRAGMA table_info(products);liste les colonnes et leurs types. - psql de PostgreSQL :
\d productsaffiche les colonnes, leurs types et leurs contraintes.
CREATE TABLE IF NOT EXISTS products (...) évite une erreur lorsque le nom est déjà présent. Cette instruction ne compare pas et ne met pas à jour l’ancienne définition. Une table à laquelle manque une colonne nécessaire reste dans cet état.
Créer une copie ponctuelle
CREATE TABLE cheap_products AS
SELECT name, price FROM products WHERE price < 10;
Cette instruction crée des colonnes et copie les lignes de la requête. Les modifications ultérieures des produits ne mettent pas la copie à jour. Dans SQLite et PostgreSQL, la nouvelle table n’hérite pas de la clé primaire ni des règles NOT NULL ou CHECK de la source.
CREATE, ALTER et DROP appartiennent au langage de définition de données, ou LDD : ils modifient la structure. INSERT, UPDATE et DELETE relèvent du langage de manipulation de données, ou LMD : ils modifient les lignes. SELECT lit les données ; selon les ouvrages, il est inclus dans le LMD ou placé dans une famille propre aux requêtes.
Points clés
- Les définitions de colonnes contiennent un nom, un type et des règles facultatives.
- Sépare les définitions par des virgules, sans virgule finale.
- Les apostrophes encadrent le texte ; les guillemets doubles encadrent les identifiants.
- Examine la structure obtenue, y compris après une instruction IF NOT EXISTS.
- CREATE TABLE AS copie les données d’une requête sans copier les contraintes de la source.
1.2 Choisir un type de données pour chaque colonne
Choisis un type selon l’usage de la valeur. Une quantité doit permettre les calculs. Un code postal américain doit conserver ses caractères, y compris les zéros initiaux. Les deux peuvent contenir des chiffres, mais doivent être stockés différemment.
Choisir les types numériques et textuels
| Valeurs | Type utile | Raison |
|---|---|---|
| Dénombrements entiers | INTEGER | Les dénombrements n’ont pas de partie fractionnaire. |
| Montants exacts dans PostgreSQL | NUMERIC(p, s) | Le calcul décimal conserve des montants exacts. |
| Montants exacts dans SQLite | Centimes en INTEGER | Les centimes entiers évitent le stockage en virgule flottante. |
| Mesures | REAL ou DOUBLE PRECISION | Les valeurs approximatives conviennent aux grandeurs mesurées. |
| Noms et codes | TEXT ou VARCHAR(n) | Les caractères et les zéros initiaux sont conservés. |
Dans PostgreSQL, NUMERIC(8, 2) compte huit chiffres au total, dont deux après la virgule. Sa plus grande valeur positive est 999 999,99. L’insertion de 12,345 stocke 12,35 ; 1 234 567,00 provoque un dépassement car il faut sept chiffres avant la virgule. DECIMAL est un autre nom pour cette famille de types.
SQLite accepte NUMERIC(8, 2) mais n’impose ni cette précision ni cette échelle. Il stocke 19,99 en virgule flottante et conserve 12,345 sans arrondi. Stocke 1 999 centimes entiers pour un montant exact de 19,99. La virgule flottante donne des approximations des fractions binaires : SELECT 0.1 + 0.2 = 0.3; dans SQLite renvoie 0. PostgreSQL traite ces littéraux décimaux sans conversion comme des valeurs numériques exactes ; convertis-les en DOUBLE PRECISION pour voir le résultat approximatif.
Les nombres textuels sont triés caractère par caractère : '100', '25', '9' apparaissent dans cet ordre. Les quantités numériques nécessitent des colonnes numériques. Le code postal américain '02139' doit être stocké sous forme de texte ; le stockage en entier fait perdre son zéro initial.
Dans PostgreSQL, VARCHAR(20) rejette un texte de plus de 20 caractères. Son type CHAR(n) complète les textes plus courts avec des espaces jusqu’à une longueur fixe. TEXT n’a pas de limite de caractères déclarée. SQLite traite VARCHAR(n) et CHAR(n) comme du texte, sans imposer la longueur ni ajouter de remplissage.
Stocker les dates et les valeurs oui/non
PostgreSQL possède DATE, TIME, TIMESTAMP et BOOLEAN. Il rejette une DATE impossible comme '2026-02-30'. SQLite n’a pas de type de stockage dédié aux dates. Utilise du texte ISO comme '2026-03-15', dont l’ordre des caractères correspond à celui des dates. Le texte au format américain classe mal les dates d’années différentes : '12/01/2025' est trié après '03/15/2026'.
Un horodatage ajoute une heure, comme dans '2026-03-15 14:30:00'. PostgreSQL utilise TRUE et FALSE pour les booléens ; SQLite stocke 1 et 0 et accepte ces mots-clés. MySQL traite BOOLEAN comme un petit entier ; SQL Server utilise BIT.
Savoir ce que le système impose
Les tables SQLite ordinaires utilisent l’affinité de type, une préférence de stockage. Une colonne INTEGER convertit '5' en 5 mais accepte 'abc' comme texte. PostgreSQL rejette un texte qui ne peut pas devenir un entier. SQLite 3.37.0 et les versions ultérieures prennent en charge les tables STRICT, dont les types autorisés sont INT, INTEGER, REAL, TEXT, BLOB et ANY.
Pour les commandes, choisis un id entier, une adresse e-mail textuelle, une DATE PostgreSQL ou une date en texte ISO dans SQLite, NUMERIC(10, 2) dans PostgreSQL ou des centimes entiers dans SQLite pour le total, et un indicateur booléen ou 0/1 pour le paiement. NULL signifie que la valeur est manquante ou inconnue ; ce n’est ni un type ni l’équivalent de zéro ou d’une chaîne vide. Une colonne l’accepte sauf si une règle l’interdit.
Points clés
- Choisis les types selon leur usage : calcul, texte, temps ou oui/non.
- La précision de NUMERIC compte tous les chiffres ; son échelle compte les décimales.
- Utilise NUMERIC dans PostgreSQL ou des centimes entiers dans SQLite pour des montants exacts.
- Les dates en texte ISO sont triées dans l’ordre des dates lorsqu’elles sont écrites de manière cohérente.
- L’affinité de SQLite permet des stockages de types différents ; STRICT renforce les contrôles de type.
- NULL marque une valeur manquante ou inconnue.
2Protéger les données avec des contraintes
Une base de données peut vérifier des règles au moment où les données changent, quel que soit le programme qui transmet la modification. Les règles de colonnes contrôlent les valeurs manquantes, les doublons et les plages ; les clés identifient les lignes et maintiennent la validité des liens entre les tables. Tu vas examiner des insertions acceptées et rejetées, choisir des identifiants générés et prévoir ce qui arrive aux commandes lorsqu’un client est supprimé. Ces règles se complètent : vérifier un prix n’a pas le même rôle qu’exiger sa présence.
2.1 Rendre obligatoires, prédéfinir et limiter des valeurs avec NOT NULL, DEFAULT, UNIQUE et CHECK
Une contrainte fait rejeter par la base de données les données qui enfreignent une règle déclarée. La vérification s’effectue lors de l’insertion ou de la mise à jour de lignes, quelle que soit l’application qui transmet l’instruction. Des règles différentes protègent différentes parties d’un enregistrement de produit.
Combiner des règles dans une table
Cette définition SQLite génère la clé et vérifie les autres champs. Pour PostgreSQL, remplace la ligne de clé par une clé primaire sur une colonne d’identité.
CREATE TABLE products (
id INTEGER PRIMARY KEY,
sku TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
price NUMERIC(8, 2) NOT NULL CHECK (price > 0),
in_stock INTEGER NOT NULL DEFAULT 0 CHECK (in_stock >= 0)
);
NOT NULL exige une valeur. UNIQUE empêche la répétition d’un code SKU. CHECK (price > 0) rejette les prix nuls ou négatifs. Le nombre d’articles en stock a pour valeur par défaut 0 et doit rester positif ou nul. La déclaration numérique de SQLite ne permet pas des calculs décimaux exacts : utilise donc des centimes entiers lorsque l’exactitude compte.
Distinguer une omission de NULL
Insère une lampe de bureau avec le code SKU 'LAMP-01', le nom 'Desk lamp' et le prix 24,99, en omettant le stock dans la liste des colonnes. L’insertion réussit et le stock reçoit 0. Un stock explicitement NULL ne demande pas la valeur par défaut : il échoue à cause de NOT NULL.
Une tasse à café au prix de -3,50 échoue à la vérification du prix. Un deuxième produit avec le code SKU 'LAMP-01' échoue à cause de UNIQUE, même si son nom et son prix diffèrent. Un stylo sans nom échoue à cause de NOT NULL. Lis la règle ou la colonne nommée dans l’erreur et corrige la saisie.
La chaîne vide est une valeur réelle. name TEXT NOT NULL accepte '' dans SQLite et PostgreSQL. Ajoute CHECK (name <> '') pour la rejeter. Oracle traite la chaîne vide comme NULL : la même saisie y est donc soumise à une règle différente.
Vérifier les combinaisons et les valeurs manquantes
Une règle de colonne suit son type. Une règle de table est un élément distinct dans la définition de la table et peut comparer des colonnes :
CHECK (end_date >= start_date),
UNIQUE (order_id, product_id)
La première rejette une date de fin antérieure à la date de début. La seconde rejette une paire répétée : un produit peut figurer dans différentes commandes, mais pas deux fois dans la même commande. Une table peut avoir plusieurs contraintes d’unicité.
Une vérification rejette une ligne lorsque sa condition est fausse. Si le prix est NULL, price > 0 est inconnu : la vérification est donc satisfaite. C’est pourquoi le prix du produit nécessite aussi NOT NULL. PostgreSQL, SQLite et MySQL autorisent normalement plusieurs NULL avec UNIQUE ; SQL Server en autorise un seul dans une contrainte d’unicité sur une colonne. PostgreSQL 15 et les versions ultérieures proposent UNIQUE NULLS NOT DISTINCT lorsque les valeurs manquantes doivent aussi entrer en conflit. Les versions de MySQL antérieures à 8.0.16 ignoraient les règles CHECK.
Donne un nom utile à une règle avec CONSTRAINT price_positive CHECK (price > 0). Ce nom aide à l’identifier dans une erreur et à la supprimer ultérieurement. Une contrainte vérifie exactement son expression : CHECK (email LIKE '%@%') repère l’absence d’arobase, mais ne peut pas détecter une faute de frappe dans une adresse qui correspond par ailleurs au motif.
Points clés
- NOT NULL rejette les valeurs manquantes mais ne rejette pas la chaîne vide dans SQLite ou PostgreSQL.
- DEFAULT remplit les colonnes omises ; un NULL explicite ne demande pas la valeur par défaut.
- UNIQUE peut protéger une colonne ou une combinaison de colonnes.
- CHECK rejette les conditions fausses ; ajoute NOT NULL si une condition inconnue doit aussi être rejetée.
- Les erreurs de contrainte indiquent les données à corriger.
2.2 Identifier les lignes par des clés primaires et des identifiants générés
Une clé primaire identifie une ligne de façon fiable. Elle peut être constituée d’une colonne ou d’une combinaison de colonnes, mais une table possède au plus une clé primaire. La clé doit être unique et présente pour que d’autres instructions puissent désigner une ligne sans dépendre de sa description.
Choisir un identifiant stable
Une clé naturelle est un identifiant existant dans le monde réel, comme l’ISBN d’un livre. Une clé de substitution est un identifiant artificiel, souvent un entier généré. L’adresse e-mail d’un client peut changer ; un identifiant client généré peut rester le même malgré ce changement.
Une clé composite identifie une combinaison :
PRIMARY KEY (order_id, product_id)
Une commande peut contenir plusieurs produits et un produit peut figurer dans plusieurs commandes. La paire identifie une ligne de commande. Aucune des deux colonnes n’a besoin d’être unique à elle seule.
PostgreSQL, MySQL et SQL Server imposent la présence des clés primaires. Les tables SQLite ordinaires conservent une exception historique : une clé primaire autre que INTEGER PRIMARY KEY peut contenir NULL. Utilise code TEXT PRIMARY KEY NOT NULL pour une clé textuelle. Les tables SQLite STRICT comblent aussi cette lacune.
Laisser la base de données générer le numéro
| Base de données | Déclaration de clé primaire générée |
|---|---|
| SQLite | id INTEGER PRIMARY KEY |
| PostgreSQL | id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY |
| MySQL | id INT AUTO_INCREMENT PRIMARY KEY |
| SQL Server | id INT IDENTITY(1, 1) PRIMARY KEY |
Omets id de la liste des colonnes de l’insertion pour demander une valeur générée. Dans PostgreSQL, un simple INTEGER PRIMARY KEY n’en génère pas. Le code PostgreSQL plus ancien utilise souvent SERIAL.
Dans SQLite, INTEGER PRIMARY KEY est un alias du numéro de ligne interne. Pars des identifiants générés 1, 2 et 3, puis supprime 3. L’identifiant normalement généré ensuite est de nouveau 3, soit un de plus que le maximum actuel. Avec INTEGER PRIMARY KEY AUTOINCREMENT, c’est 4 : un numéro attribué à une ligne validée n’est pas réutilisé. Un numéro issu d’une insertion annulée peut toutefois être réutilisé. Cette garantie plus forte entraîne un travail supplémentaire : choisis-la donc lorsque l’interdiction de réutiliser un numéro est nécessaire.
Lire les identifiants sans les prendre pour des décomptes
Les trous sont normaux. Les suppressions en laissent et PostgreSQL ne réattribue pas les numéros de séquence après des insertions qui échouent ou sont annulées. Utilise COUNT(*) pour compter les lignes et un horodatage pour connaître l’heure d’un événement. Le plus grand identifiant ne répond de manière fiable à aucune de ces deux questions.
La forme GENERATED ALWAYS de PostgreSQL rejette normalement un identifiant explicite comme 50. GENERATED BY DEFAULT et SERIAL acceptent les valeurs explicites, mais fournir 50 ne fait pas avancer le générateur au-delà de 50. Une valeur générée ultérieurement peut entrer en conflit avec celle-ci.
Pour utiliser la clé d’une nouvelle ligne dans une ligne liée, récupère-la :
INSERT INTO customers (first_name, last_name, email)
VALUES ('Dev', 'Patel', 'dev@example.com')
RETURNING id;
RETURNING fonctionne dans PostgreSQL et SQLite 3.35.0 ou version ultérieure. SQLite propose aussi last_insert_rowid(), MySQL propose LAST_INSERT_ID() et SQL Server utilise OUTPUT. Lis le résultat de l’insertion au lieu de deviner l’identifiant suivant.
Points clés
- Une clé primaire identifie une ligne ; une clé composite identifie une combinaison.
- Les clés générées utilisent des déclarations différentes selon les bases de données.
- AUTOINCREMENT dans SQLite empêche la réutilisation des identifiants validés, au prix d’un travail supplémentaire.
- Les trous dans les identifiants sont normaux ; utilise COUNT(*) pour compter les lignes.
- RETURNING permet de lire la clé effectivement générée.
2.3 Relier des tables par des clés étrangères
Le customer_id d’une commande doit pointer vers un client existant. Une clé étrangère fait vérifier ce lien par la base de données. La table qui contient la référence est la table enfant ; celle vers laquelle elle pointe est la table parente.
Déclarer et contrôler le lien
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers(id)
);
Ici, customers doit d’abord exister et son id doit être une clé primaire ou une clé unique. Fais correspondre les types des deux côtés. La forme de table, FOREIGN KEY (customer_id) REFERENCES customers(id), déclare le même lien séparément de la colonne.
Lorsque le contrôle est activé, une commande pour le client 99 échoue si aucun client 99 n’existe. Mettre à jour une commande pour l’associer à ce client absent échoue aussi. Une clé étrangère qui accepte les valeurs manquantes peut contenir NULL, ce qui signifie qu’il n’y a aucune ligne liée ; NOT NULL rend le lien obligatoire.
Dans SQLite, exécute PRAGMA foreign_keys = ON; à chaque nouvelle connexion avant de démarrer une transaction. Un changement de paramètre dans une transaction n’a aucun effet. PostgreSQL et SQL Server contrôlent normalement les clés étrangères, tout comme le moteur InnoDB utilisé par défaut dans MySQL.
Prévoir la suppression d’une ligne parente
Prenons les clients 1, Ana, et 2, Ben. Les commandes 101 et 102 appartiennent à Ana ; 103 appartient à Ben. Examinons la suppression du client 1 selon différentes déclarations :
| Action ON DELETE | Résultat |
|---|---|
NO ACTION ou RESTRICT | La suppression échoue tant que 101 et 102 référencent Ana. |
CASCADE | Ana, 101 et 102 sont supprimés ; Ben et 103 restent. |
SET NULL | Ana est supprimée ; toutes les commandes restent, 101 et 102 n’étant plus liées. |
SET DEFAULT | Les valeurs qui référencent la ligne prennent leur valeur par défaut déclarée. |
SET NULL nécessite une colonne qui accepte les valeurs manquantes. SET DEFAULT doit toujours respecter la clé étrangère : une valeur par défaut non manquante doit identifier une ligne parente existante. Une valeur par défaut NULL fonctionne lorsque les liens manquants sont autorisés.
Choisis selon le sens des données. Les lignes de commande appartiennent souvent entièrement à leur commande : une cascade peut donc convenir. Pour les commandes à conserver, il faut une action bloquante lorsqu’on essaie de supprimer leur client. Un lien facultatif vers un fournisseur peut être défini à NULL. Appliquer des cascades partout permet à une seule suppression d’effacer plus d’enregistrements que le nom de sa table ne le laisse penser.
Respecter l’ordre des dépendances
Crée les tables parentes avant les tables enfants et insère les lignes parentes avant les lignes qui les référencent. Pour supprimer des données ou des tables liées, commence par les enfants et termine par les parentes. Une action ON UPDATE offre les mêmes choix lorsque la clé parente change ; ON UPDATE CASCADE copie la nouvelle clé dans les lignes enfants.
RESTRICT vérifie immédiatement. NO ACTION, la valeur par défaut, peut attendre la fin de l’instruction, ou la fin de la transaction pour une contrainte différable. Les deux bloquent une suppression ordinaire qui laisserait des références sans correspondance. Garde les identifiants générés stables pour que la modification des informations d’un client ne nécessite pas celle de toutes les références à ce client.
Points clés
- Une clé étrangère relie les valeurs enfants à une clé primaire ou unique parente existante.
- NULL permet un lien facultatif sauf si NOT NULL l’interdit.
- CASCADE supprime les lignes enfants ; SET NULL les conserve sans leur lien.
- Active le contrôle des clés étrangères dans SQLite avant BEGIN à chaque connexion.
- Crée et insère les parents d’abord ; supprime les enfants d’abord.
- Choisis les actions selon les enregistrements à conserver.
3Ajouter des lignes avec INSERT
Ajouter des lignes consiste à associer chaque valeur à la bonne colonne et à laisser la base de données vérifier le résultat. Un produit peut être saisi directement, plusieurs clients peuvent être ajoutés ensemble et des commandes anciennes peuvent être copiées à partir d’une requête. Tu vas aussi récupérer une clé générée et choisir comment traiter un code SKU existant. Une même saisie peut représenter un nouveau nombre d’articles en stock ou une livraison supplémentaire : un upsert doit donc exprimer précisément la modification voulue.
3.1 Insérer des lignes avec VALUES
INSERT ajoute des lignes à une table existante. Sa liste de colonnes établit la correspondance entre les valeurs que tu fournis et les champs qui les reçoivent. Écris-la explicitement pour qu’une modification ultérieure de la table ne change pas silencieusement le sens de ta saisie.
Associer les valeurs selon leur ordre
INSERT INTO products (sku, name, price, in_stock)
VALUES ('LAMP-01', 'Desk lamp', 24.99, 12);
Lis les correspondances dans l’ordre : le code SKU reçoit 'LAMP-01', le nom reçoit 'Desk lamp', le prix reçoit 24,99 et le stock reçoit 12. Il faut quatre valeurs pour ces quatre colonnes. Un nombre incorrect, comme deux valeurs pour trois colonnes, provoque un échec.
Sans la liste, les valeurs suivent l’ordre des colonnes déclaré dans la table. SQLite exige une valeur pour toutes les colonnes ; PostgreSQL en accepte moins et attribue leurs valeurs par défaut aux colonnes finales. Une liste explicite évite de dépendre de l’un ou l’autre de ces comportements. Elle permet aussi de placer les colonnes dans un ordre clair pour la saisie.
Une paire inversée peut être pire qu’une erreur de syntaxe. Fournir 9,99 comme nom et 'Desk lamp' comme prix conduit PostgreSQL à rejeter le prix non numérique. L’affinité ordinaire de SQLite peut stocker le texte « 9.99 » comme nom et le texte « Desk lamp » comme prix sans erreur. Relis la ligne insérée avec SELECT pour vérifier la correspondance.
Écrire correctement les valeurs littérales
| Type | Exemple SQL |
|---|---|
| Texte | 'Desk lamp' |
| Texte contenant une apostrophe | 'O''Brien' |
| Nombre | 1250.50 |
| Date ISO | '2026-03-15' |
| Valeur manquante | NULL |
L’apostrophe doublée permet de stocker une seule apostrophe. Les nombres n’ont ni symbole monétaire ni séparateur de milliers ; une virgule sépare les valeurs, donc une virgule dans un montant sans guillemets modifie le nombre de valeurs. 'NULL' est le texte de quatre lettres « NULL », pas une valeur manquante.
Laisser les champs omis se remplir
Une colonne omise reçoit sa valeur par défaut, ou NULL si elle n’en a pas. Une clé générée reçoit une valeur générée. Ce dernier comportement dépend de la déclaration : INTEGER PRIMARY KEY dans SQLite génère des identifiants ; PostgreSQL nécessite une déclaration d’identité à cette fin. Dans PostgreSQL, une simple clé primaire entière omise lors d’une insertion provoque un échec car sa valeur serait NULL.
PostgreSQL, MySQL et SQL Server autorisent DEFAULT à la place d’une valeur. SQLite ne l’accepte pas dans une liste VALUES ; omets plutôt cette colonne. Un NULL explicite ne demande jamais la valeur par défaut.
Ajouter plusieurs lignes ensemble
INSERT INTO customers (first_name, last_name, email) VALUES
('Ana', 'Ruiz', 'ana@example.com'),
('Ben', 'Okafor', 'ben@example.com'),
('Chloe', 'Nguyen', 'chloe@example.com');
Dans une table vide dont la clé générée commence à 1, ces clients reçoivent les identifiants 1, 2 et 3. Avec la gestion ordinaire des contraintes, l’instruction multiligne réussit ou échoue dans son ensemble. Si une ligne enfreint une règle, aucune des lignes de cette instruction n’est insérée.
Une erreur UNIQUE indique une clé ou une valeur en double ; NOT NULL indique une donnée manquante ; CHECK indique une condition non satisfaite ; et une erreur de clé étrangère indique un lien invalide. Corrige la valeur ou la correspondance voulue avant de réessayer.
Points clés
- Liste les colonnes et associe chaque valeur à une colonne selon son ordre.
- Les champs omis reçoivent leur valeur par défaut ou NULL ; les identifiants générés nécessitent un générateur.
- Utilise des apostrophes pour le texte et double une apostrophe qu’il contient.
- NULL et le texte NULL sont différents.
- Une insertion multiligne ordinaire échoue dans son ensemble si une ligne enfreint une contrainte.
3.2 Insérer à partir de requêtes, renvoyer les nouvelles clés et gérer les doublons
Les lignes n’ont pas besoin d’être saisies une par une. Une requête peut fournir les lignes à insérer, et une règle de conflit peut déterminer ce qui se passe lorsqu’une valeur unique existe déjà. Dans les deux cas, il faut faire correspondre précisément les données voulues.
Copier le résultat d’une requête
INSERT INTO archived_orders (id, customer_id, order_date, total)
SELECT id, customer_id, order_date, total
FROM orders
WHERE order_date < '2026-01-01';
Il n’y a pas de clause VALUES : la requête fournit les valeurs. Fais correspondre les colonnes sélectionnées à la liste cible selon leur ordre. La table cible doit déjà exister et ses règles s’appliquent toujours.
Prévisualise le SELECT seul. Les commandes 201, 202 et 204 portent les dates 2025-11-03, 2025-12-19 et 2025-10-30 et les montants 45,00, 120,50 et 60,00. Les commandes 203 et 205 datent de 2026. La requête renvoie trois lignes pour un total de 225,50, et l’insertion copie ces trois lignes. Elle peut aussi ne copier aucune ligne si le filtre ne trouve rien.
Une seconde exécution essaie de les copier à nouveau. Une clé primaire dans la table cible provoque alors un échec au lieu de stocker silencieusement des doublons. INSERT ... SELECT est une opération de copie : elle ne supprime pas les lignes sources et ne maintient pas les deux tables synchronisées.
Les données importées d’un fichier passent souvent d’abord par une table intermédiaire. L’interpréteur SQLite utilise .import --csv file.csv staging ; psql utilise \copy. Dans une requête ultérieure, TRIM(email) supprime les espaces en début et en fin de chaîne et NULLIF(TRIM(email), '') transforme une adresse e-mail vide ou composée d’espaces en NULL. Les contraintes de la table de destination vérifient ensuite les lignes nettoyées.
Lire le résultat d’une écriture
INSERT INTO customers (first_name, last_name, email)
VALUES ('Dev', 'Patel', 'dev@example.com')
RETURNING id;
Le résultat fournit l’identifiant client généré à utiliser dans une ligne liée. PostgreSQL et SQLite 3.35.0 ou version ultérieure prennent en charge RETURNING pour les insertions, mises à jour et suppressions. MySQL utilise LAST_INSERT_ID() pour un identifiant généré ; SQL Server utilise OUTPUT.
Décider comment traiter les doublons
Avec stock (sku TEXT PRIMARY KEY, qty INTEGER NOT NULL), supposons que 'LAMP-01' ait une quantité de 12. Une insertion simple proposant le même code SKU et une quantité de 20 échoue. Dans SQLite et PostgreSQL :
INSERT INTO stock (sku, qty) VALUES ('LAMP-01', 20)
ON CONFLICT (sku) DO UPDATE
SET qty = stock.qty + excluded.qty;
stock.qty est la quantité existante, 12. excluded.qty est la quantité proposée, 20. Cette forme stocke 32, ce qui convient à une livraison supplémentaire. SET qty = excluded.qty stocke 20, ce qui convient à un nombre de remplacement. DO NOTHING conserve 12 et ignore la ligne en conflit. Chaque variante part de la même quantité initiale, 12.
Un upsert combine l’insertion d’une nouvelle ligne et une mise à jour en cas de conflit. La cible du conflit doit être protégée par une contrainte d’unicité adaptée. La famille d’instructions équivalente dans MySQL est ON DUPLICATE KEY UPDATE. Un simple INSERT ne corrige pas un client existant : il crée une autre ligne ou provoque une erreur d’unicité. Utilise UPDATE pour une ligne dont tu sais qu’elle existe, et un upsert lorsqu’elle existe peut-être déjà.
Points clés
- INSERT ... SELECT copie les résultats d’une requête dans une table existante.
- Relancer une copie exige une décision sur le traitement des doublons.
- RETURNING indique les valeurs des lignes effectivement écrites.
- excluded désigne la ligne proposée dans un upsert.
- Remplace le stock avec excluded.qty ; ajoute une livraison avec stock.qty + excluded.qty.
- DO NOTHING ignore un conflit d’unicité sans mettre à jour la ligne existante.
4Modifier et supprimer des lignes avec UPDATE et DELETE
Une instruction valide qui modifie des données peut néanmoins affecter les mauvaises lignes. Mettre à jour un prix, supprimer une commande et sélectionner les enregistrements à modifier sont des décisions distinctes. Tu vas calculer de nouvelles valeurs à partir de celles qui sont stockées, distinguer l’effacement d’un champ de la suppression d’une ligne et construire des conditions avec des dates, des valeurs manquantes et des alternatives regroupées. Un aperçu et une vérification du résultat rendent l’effet visible avant que la validation d’une transaction ne rende la modification permanente.
4.1 Modifier des valeurs avec UPDATE
UPDATE modifie des valeurs dans des lignes existantes. Il indique une table, attribue de nouvelles valeurs avec SET, puis choisit les lignes ciblées avec WHERE. Les contraintes de la table vérifient les valeurs obtenues.
Définir un ou plusieurs champs
UPDATE products
SET price = 22.50, in_stock = 30
WHERE id = 3;
Le produit de clé 3 reçoit les deux valeurs ; les autres lignes conservent les leurs. Les affectations sont séparées par des virgules. Écrire SET price = 22.50 AND in_stock = 30 ne signifie pas deux affectations. PostgreSQL rejette cette écriture ; SQLite traite le membre de droite comme une expression booléenne et peut stocker 0 ou 1 dans le prix.
L’absence de WHERE est du SQL valide et l’instruction s’applique à toutes les lignes. UPDATE products SET price = 0; fixe le prix de chaque produit à zéro si les règles de la table l’autorisent. Un aperçu avec la condition voulue montre si la cible comprend une ligne, plusieurs lignes ou aucune.
Calculer à partir de la valeur stockée
UPDATE products
SET price = price * 1.10;
Un prix de 20,00 devient 22,00 après une augmentation de 10 %. Un prix de 19,99 donne un résultat non arrondi de 21,989. PostgreSQL stocke 21,99 dans une colonne NUMERIC(8, 2). SQLite n’impose pas l’échelle : SET price = ROUND(price * 1.10, 2) demande donc deux décimales. Pour stocker des montants exacts dans SQLite, conserve des centimes entiers et indique explicitement comment les arrondir.
L’expression doit inclure l’ancienne valeur lorsque la modification est relative. SET in_stock = in_stock - 1 retire une unité ; SET in_stock = 1 remplace le nombre par un.
Dans SQLite et PostgreSQL, toutes les expressions à droite lisent la ligne avant la mise à jour. UPDATE t SET a = b, b = a; échange les valeurs d’une ligne, qui passent de 1 et 2 à 2 et 1. La mise à jour d’une seule table dans MySQL évalue les affectations de gauche à droite : la même forme fixe donc les deux valeurs à 2. Ne suppose pas que ce comportement est identique d’un système à l’autre.
Tenir compte des règles et des valeurs manquantes
Utilise SET phone = NULL pour effacer un champ de téléphone. Pour trouver les valeurs de téléphone manquantes, utilise WHERE phone IS NULL. Une égalité avec NULL ne les trouve pas.
Prenons les prix 12,00, 3,00 et 8,50 protégés par CHECK (price > 0). Soustraire 5 à chaque prix ferait passer le deuxième à -2,00. Avec la gestion ordinaire des contraintes, cet échec annule toute l’instruction : même les prix qui seraient valides restent donc inchangés.
La mise à jour d’une clé primaire doit aussi respecter les clés étrangères liées. Une modification de clé bloquée échoue tant que des lignes enfants pointent vers l’ancienne clé ; ON UPDATE CASCADE leur transmet la nouvelle valeur. Garder les identifiants générés stables évite ce travail supplémentaire lorsque les informations descriptives changent.
Interpréter le nombre de lignes affectées
psql indique un résultat comme UPDATE 3 ; changes() dans SQLite indique le nombre de lignes concernées par la dernière instruction de modification. Les deux comptent les lignes correspondantes et mises à jour même lorsque la valeur attribuée est égale à l’ancienne. Un décompte de trois ne garantit pas trois valeurs visiblement différentes. Compare le nombre à l’aperçu et examine ensuite les champs concernés, ou utilise RETURNING pour voir directement les lignes affectées.
Points clés
- SET attribue des valeurs ; WHERE choisit les lignes.
- Sépare les affectations par des virgules, pas par AND.
- Utilise l’ancienne valeur de la colonne dans un calcul relatif.
- Un échec ordinaire de contrainte annule toute l’instruction UPDATE.
- Le nombre de lignes affectées peut inclure des lignes dont les valeurs sont restées identiques.
4.2 Supprimer des lignes avec DELETE
DELETE supprime des lignes entières. Il laisse la table prête à contenir de nouvelles lignes. Pour effacer un seul champ, on utilise UPDATE ... SET column = NULL ; DELETE email FROM customers n’est pas du SQL valide.
Suivre une suppression filtrée
La boutique possède les commandes suivantes :
| Identifiant | Statut | Date de commande |
|---|---|---|
| 201 | cancelled | 2025-11-03 |
| 202 | shipped | 2025-12-19 |
| 203 | cancelled | 2026-01-08 |
| 204 | cancelled | 2025-10-30 |
| 205 | expired | 2026-02-14 |
DELETE FROM orders
WHERE status = 'cancelled'
AND order_date < '2026-01-01';
La commande 201 satisfait les deux conditions, tout comme 204. La commande 203 est annulée mais trop récente ; 202 est assez ancienne mais expédiée. L’instruction supprime deux lignes et conserve 202, 203 et 205. DELETE FROM orders; sans condition supprimerait les cinq.
Utiliser des données liées pour choisir les lignes
DELETE FROM order_items
WHERE order_id IN (
SELECT id FROM orders WHERE status = 'cancelled'
);
La requête interne produit les identifiants des commandes annulées. IN vérifie si l’order_id de chaque ligne de commande figure dans cette liste. Exécute la requête interne seule pour examiner les clés, puis prévisualise les lignes de commande avec la même condition.
Les clés étrangères influent aussi sur la suppression. Une ligne parente référencée par des lignes enfants peut être protégée par NO ACTION ou RESTRICT ; une cascade supprime les lignes enfants ; SET NULL les conserve mais efface le lien. Vérifie ces actions lorsque tu évalues l’effet de la suppression d’une ligne parente, car la table directement nommée n’est peut-être pas la seule modifiée.
Choisir ce qui doit rester
| Instruction | Lignes supprimées | Ce qui reste |
|---|---|---|
DELETE ... WHERE ... | Lignes correspondantes | Table et autres lignes |
DELETE FROM orders; | Toutes les lignes | Table vide |
TRUNCATE TABLE orders; | Toutes les lignes, sans WHERE | Table vide |
DROP TABLE orders; | Toutes les lignes avec la table | Plus de table orders |
PostgreSQL, MySQL, SQL Server et Oracle prennent en charge TRUNCATE ; SQLite ne le prend pas en charge. Les règles de transaction et de dépendance de cette instruction varient selon la base de données. Même une instruction qui semble vider rapidement une table doit respecter ces règles.
Conserver l’historique avec une suppression logique
UPDATE customers
SET deleted_at = '2026-03-15'
WHERE id = 7;
Une suppression logique marque la ligne sans l’effacer. Elle peut préserver l’historique et permettre une restauration par effacement de la marque. Les requêtes portant sur les clients actifs doivent inclure WHERE deleted_at IS NULL ; sinon, les clients marqués apparaissent toujours. Marquer des données ne les efface pas.
Une suppression validée ne peut pas être annulée par un ROLLBACK ultérieur. La restauration nécessite une copie enregistrée ou une sauvegarde. Dans une transaction ouverte, une annulation peut encore restaurer les lignes supprimées. Vérifie les identifiants sélectionnés et le nombre de lignes affectées avant de rendre le résultat permanent.
Points clés
- DELETE supprime des lignes ; UPDATE peut effacer un seul champ.
- Sans WHERE, la table est vidée mais sa structure est conservée.
- IN peut sélectionner des lignes à l’aide de clés provenant d’une autre table.
- Les actions des clés étrangères peuvent étendre ou bloquer une suppression.
- Une suppression logique nécessite des filtres sur les lignes actives et n’efface pas les données stockées.
- ROLLBACK ne restaure une suppression que tant que sa transaction n’est pas validée.
4.3 Cibler exactement les lignes voulues
Choisir les lignes est souvent la partie la plus difficile d’une modification. Le même filtre, sans conséquence dans une requête, peut supprimer ou mettre à jour trop de lignes lorsqu’il est réutilisé dans une écriture. Traduis la règle voulue en condition, puis examine les lignes auxquelles elle correspond réellement.
Prévisualiser la condition exacte
SELECT id, status, order_date FROM orders
WHERE status = 'cancelled'
AND order_date < '2026-01-01';
Cet aperçu renvoie les commandes 201 et 204 dans l’exemple des cinq commandes de la boutique. Réutilise exactement cette condition dans la suppression. La réécrire en changeant la commande crée une nouvelle sélection qui n’a pas été vérifiée.
Pour une ligne précise, utilise sa clé primaire : WHERE id = 42 correspond à une ligne au maximum. Un nom descriptif comme 'Desk lamp' peut être commun à plusieurs produits.
Regrouper explicitement les alternatives
AND est prioritaire sur OR. Compare :
WHERE status = 'cancelled'
OR status = 'expired' AND order_date < '2026-01-01'
avec :
WHERE (status = 'cancelled' OR status = 'expired')
AND order_date < '2026-01-01'
La première condition accepte toutes les commandes annulées, quelle que soit leur date, ainsi que les commandes expirées avant 2026. Elle correspond à 201, 203 et 204. La seconde applique le test de date aux deux statuts et correspond à 201 et 204. La commande 203 montre la différence parce qu’elle est annulée en 2026.
Inclure volontairement les valeurs manquantes
WHERE customer_id = NULL ne correspond à aucune ligne. Les valeurs manquantes nécessitent IS NULL ou IS NOT NULL. Un test négatif présente aussi une lacune : status <> 'shipped' n’inclut pas un statut manquant, car le résultat de la comparaison est inconnu.
Si un statut manquant appartient au groupe voulu, écris :
WHERE status <> 'shipped' OR status IS NULL
Lorsque tu ajoutes une autre condition, regroupe toute cette alternative entre parenthèses pour que les deux branches satisfassent cette condition.
La recherche par motif peut dépasser la description voulue. LIKE '%lamp%' correspond à « Desk lamp » et à « Clamp ». Le LIKE par défaut de SQLite ignore aussi la casse des lettres anglaises : il trouve donc « Lamp shade ». Un motif est utile pour trouver des correspondances possibles, mais examine-les avant de les modifier.
Choisir une comparaison à une liste pour une liste
UPDATE orders SET status = 'on hold'
WHERE customer_id IN (
SELECT id FROM customers WHERE state = 'CA'
);
La sous-requête peut fournir plusieurs identifiants de clients ; IN teste leur appartenance à la liste. Remplacer IN par = demande un seul résultat scalaire. PostgreSQL rejette plusieurs lignes dans ce cas, tandis que SQLite utilise silencieusement la première ligne renvoyée et manque les autres clients.
Après la modification, compare le nombre de lignes affectées à l’aperçu. PostgreSQL et SQLite peuvent aussi ajouter RETURNING * pour afficher les lignes affectées. Pour une écriture risquée, démarre une transaction avant de modifier les données, examine le résultat, puis choisis COMMIT ou ROLLBACK.
Points clés
- Prévisualise exactement la condition WHERE que l’écriture utilisera.
- Un filtre sur une clé primaire identifie une ligne au maximum.
- Les parenthèses permettent aux alternatives OR de partager une condition AND.
- IS NULL traite les valeurs manquantes ; les comparaisons ordinaires les ignorent.
- IN accepte une liste issue d’une sous-requête ; l’égalité scalaire ne l’accepte pas.
- Vérifie le nombre et le résultat avant de valider.
5Regrouper des modifications dans des transactions
Certaines modifications vont ensemble : un transfert nécessite à la fois un retrait et un dépôt. Les transactions permettent de décider une seule fois de conserver ou d’annuler ces instructions, tandis que les points de sauvegarde permettent de revenir à une étape intermédiaire. Tu vas suivre des soldes au fil de modifications réussies et d’erreurs, puis comparer la façon dont SQLite et PostgreSQL traitent une instruction en échec. Les paramètres de la base de données et du client comptent, en particulier lorsqu’une modification de structure peut valider un travail antérieur.
5.1 Valider ou annuler un ensemble de modifications
Une transaction regroupe des instructions liées en une seule unité de travail. Tu décides de conserver leurs modifications ensemble avec COMMIT ou de les annuler ensemble avec ROLLBACK. Cette propriété du tout ou rien s’appelle l’atomicité, le A de ACID.
Conserver les deux volets d’un transfert
Le compte de Maya, identifiant 1, contient 500,00. Le compte de Leo, identifiant 2, contient 120,00. Transférer 75,00 nécessite deux modifications :
BEGIN;
UPDATE accounts SET balance = balance - 75.00 WHERE id = 1;
UPDATE accounts SET balance = balance + 75.00 WHERE id = 2;
SELECT id, balance FROM accounts WHERE id IN (1, 2);
COMMIT;
Après la première mise à jour, Maya a 425,00. Après la seconde, Leo a 195,00. La vérification affiche les deux soldes avant la validation et le total reste de 620,00. Pour ces soldes décimaux exacts, utilise NUMERIC dans PostgreSQL ; dans SQLite, une version utilisant des montants exacts stocke 50 000 et 12 000 centimes et transfère 7 500 centimes.
Sans transaction explicite en mode de validation automatique, la première mise à jour pourrait devenir permanente avant l’exécution de la seconde. Une panne entre les deux conserverait le retrait sans le dépôt. Une transaction permet de décider une seule fois de conserver ou d’annuler les deux mises à jour. Si une instruction échoue, traite l’erreur avant de considérer le transfert comme terminé.
Comprendre la délimitation par défaut
Avec la validation automatique de la base de données, chaque instruction autonome réussie est validée comme une transaction distincte. C’est le comportement initial habituel de SQLite, PostgreSQL, MySQL et SQL Server. Une bibliothèque de programmation ou un client peut choisir d’autres paramètres et démarrer une transaction pour toi.
BEGIN; démarre une transaction explicite dans SQLite et PostgreSQL. SQLite et SQL Server utilisent aussi BEGIN TRANSACTION ; PostgreSQL et MySQL acceptent START TRANSACTION. Oracle démarre une transaction lors d’une modification de données et attend normalement COMMIT dans des outils comme SQL*Plus, sauf si la validation automatique est activée.
COMMIT termine la transaction et conserve ses modifications. ROLLBACK la termine et annule ses modifications non validées. Une annulation ultérieure ne peut pas revenir sur une validation antérieure.
Examiner et annuler
BEGIN;
DELETE FROM orders;
SELECT * FROM orders;
ROLLBACK;
Ta connexion voit une table vide au moment du SELECT, puis voit de nouveau les cinq commandes après l’annulation. Le résultat vide était réel dans la transaction, mais n’était pas encore permanent. Les autres connexions ne voient normalement pas les modifications non validées.
Une transaction ne peut te protéger d’une mauvaise sélection de lignes que si tu examines le résultat et choisis de l’annuler. SQL peut mettre à jour une ligne non voulue sans erreur : aucune règle de la base de données ne sait quel compte tu voulais désigner. Compare les identifiants, valeurs et nombres renvoyés au résultat voulu avant de valider.
Garde les transactions courtes et termine-les. Les transactions ouvertes peuvent conserver des verrous qui font attendre les autres connexions ; SQLite n’autorise qu’une seule connexion en écriture à la fois. Fermer une connexion avec une transaction inachevée annule ses modifications en attente. Lorsqu’une bibliothèque démarre automatiquement une transaction, le programme doit appeler sa méthode de validation pour conserver le travail.
Points clés
- L’atomicité permet de conserver ou d’annuler ensemble des modifications liées.
- La validation automatique rend permanente une instruction autonome réussie.
- Ta connexion peut examiner ses propres modifications en attente.
- COMMIT et ROLLBACK terminent tous deux la transaction.
- ROLLBACK ne peut pas annuler le travail d’une transaction validée antérieurement.
5.2 Gérer les erreurs, les points de sauvegarde et les modifications de structure dans une transaction
Une instruction en échec n’a pas le même effet dans toutes les bases de données. Tu dois savoir ce qui reste en attente avant de décider comment rétablir la situation. Un point de sauvegarde peut fournir une étape plus proche à laquelle revenir dans une transaction ouverte.
Suivre une erreur
Après le transfert, Maya a 425,00 et Leo a 195,00. La table comporte CHECK (balance >= 0). Démarre une transaction et soustrais 30,00 du solde de Maya : son solde en attente est de 395,00. Essaie ensuite de soustraire 300,00 du solde de Leo. Son solde serait alors de -105,00 : la deuxième instruction échoue donc.
| Base de données | État après l’erreur ordinaire de contrainte |
|---|---|
| SQLite | L’instruction en échec est annulée ; la modification précédente de Maya reste en attente. |
| PostgreSQL | La transaction est en échec et les commandes ordinaires suivantes sont refusées. |
Dans SQLite, valider à ce stade conserverait uniquement la déduction du solde de Maya. Dans PostgreSQL, COMMIT sur la transaction en échec la termine en l’annulant. Une procédure claire consiste à exécuter ROLLBACK, à corriger la cause et à relancer les instructions liées. Les deux soldes reviennent alors à 425,00 et 195,00 avant la nouvelle tentative corrigée.
Annuler une partie ultérieure avec un point de sauvegarde
BEGIN;
UPDATE accounts SET balance = balance + 10 WHERE id = 1;
SAVEPOINT after_first;
UPDATE accounts SET balance = balance + 10 WHERE id = 2;
ROLLBACK TO after_first;
COMMIT;
Le point de sauvegarde vient après l’augmentation du solde de Maya. ROLLBACK TO annule l’augmentation ultérieure du solde de Leo mais conserve celle de Maya. Les soldes finaux sont de 435,00 et 195,00. Cette instruction ne termine pas la transaction englobante ; c’est COMMIT qui le fait.
RELEASE after_first supprime le point de sauvegarde sans annuler les modifications effectuées après lui. Ce n’est pas une validation permanente indépendante au sein de la transaction englobante. PostgreSQL permet aussi à ROLLBACK TO un point de sauvegarde établi avant une erreur de quitter l’état d’échec et de poursuivre à partir de ce point.
Vérifier si les modifications de structure peuvent être annulées
SQLite et PostgreSQL autorisent CREATE TABLE, ALTER TABLE et DROP TABLE dans des transactions. Par exemple, BEGIN; DROP TABLE orders; ROLLBACK; restaure la table et ses lignes.
Dans MySQL et Oracle, les instructions ordinaires du LDD sur les tables permanentes entraînent des validations implicites. Un CREATE TABLE, ALTER TABLE, DROP TABLE ou TRUNCATE TABLE peut valider les modifications antérieures en attente tout en effectuant sa propre opération de structure. Une annulation ultérieure ne peut pas annuler ce travail antérieur. Ne suppose pas qu’une transaction autour d’un script donne le même comportement à tous les dialectes SQL.
Pour une modification de données risquée, démarre la transaction, exécute l’écriture, examine les valeurs et le nombre de lignes, puis valide ou annule. Par exemple, examine les prix des articles d’éclairage après UPDATE products SET price = ROUND(price * 1.10, 2) WHERE category = 'lighting';. Prends rapidement ta décision pour que la transaction ne fasse pas attendre d’autres opérations.
Points clés
- Une erreur ordinaire de contrainte dans SQLite laisse en attente les modifications antérieures de la transaction.
- Une erreur PostgreSQL laisse la transaction en échec jusqu’à son annulation ou son rétablissement à un point de sauvegarde.
- ROLLBACK TO annule le travail ultérieur sans terminer la transaction.
- RELEASE supprime un point de sauvegarde sans valider la transaction englobante.
- La possibilité d’annuler les instructions du LDD dépend de la base de données.
6Modifier la structure des tables avec ALTER TABLE et DROP TABLE
Les tables ont parfois besoin d’un nouveau champ, d’un nom plus clair ou d’une règle plus stricte alors qu’elles contiennent déjà des données. Modifier cette structure exige de vérifier les lignes existantes et les objets qui dépendent de la table. Tu vas ajouter et remplir des colonnes, reconnaître les cas où SQLite nécessite une reconstruction et distinguer la suppression d’enregistrements de celle de leur contenant. Les dépendances déterminent aussi l’ordre de travail lorsque des tables liées sont retirées.
6.1 Ajouter, renommer et supprimer des colonnes avec ALTER TABLE
ALTER TABLE modifie la structure d’une table existante tout en conservant ses lignes. UPDATE modifie les valeurs contenues dans ces lignes. L’ajout d’un champ de remise nécessite ALTER TABLE ; l’augmentation des remises déjà stockées nécessite UPDATE.
Ajouter et renommer des champs
ALTER TABLE customers ADD COLUMN phone TEXT;
ALTER TABLE customers RENAME COLUMN phone TO mobile;
ALTER TABLE customers RENAME TO clients;
SQLite et PostgreSQL utilisent ces mêmes formes. Une nouvelle colonne donne sa valeur par défaut aux lignes existantes, ou NULL si elle n’en a pas. ADD COLUMN active INTEGER NOT NULL DEFAULT 1 attribue la valeur 1 à active dans chaque ligne actuelle. Ajouter email TEXT NOT NULL sans valeur par défaut échoue sur une table contenant des lignes, car les lignes existantes n’auraient pas une valeur obligatoire.
SQLite prend en charge RENAME COLUMN depuis la version 3.25.0 et DROP COLUMN depuis la version 3.35.0. Lors d’un renommage, mets à jour le code applicatif et les requêtes enregistrées qui utilisent l’ancien nom. Le code SQL extérieur à la base de données ne peut pas découvrir automatiquement le nouveau nom.
Remplir les données avant de les rendre obligatoires
Dans PostgreSQL, ajoute une colonne qui accepte les valeurs manquantes, remplis les lignes existantes avec des valeurs adaptées, puis rends-la obligatoire :
ALTER TABLE customers ADD COLUMN email TEXT;
UPDATE customers SET email = 'unknown@example.com'
WHERE email IS NULL;
ALTER TABLE customers ALTER COLUMN email SET NOT NULL;
Cet exemple illustre le remplissage d’un champ obligatoire ; il ne déclare pas l’adresse e-mail unique. Une véritable colonne d’adresses e-mail uniques nécessite des valeurs valides et distinctes. SET NOT NULL échoue s’il reste des valeurs manquantes. PostgreSQL permet aussi de modifier un type avec ALTER COLUMN price TYPE NUMERIC(10, 2), de définir une valeur par défaut et d’ajouter une vérification nommée. Les lignes existantes doivent satisfaire toute nouvelle règle ajoutée.
Supprimer un champ ou reconstruire une table
ALTER TABLE customers DROP COLUMN mobile; supprime le champ et toutes les valeurs qu’il contient. Des dépendances peuvent bloquer l’opération. SQLite refuse de supprimer une colonne de clé primaire, unique, indexée ou de clé étrangère, ou encore une colonne utilisée par un autre objet du schéma. PostgreSQL peut supprimer les objets dépendants avec CASCADE, notamment une vue qui utilise la colonne.
SQLite ne peut pas modifier le type d’une colonne existante ni ajouter des contraintes de clé primaire, d’unicité, de clé étrangère ou de vérification à des colonnes existantes avec un simple ALTER. La version 3.53.0 ajoute ALTER COLUMN ... SET NOT NULL et DROP NOT NULL, mais pas la modification générale des contraintes. Une colonne nouvellement ajoutée peut comporter une vérification ou une référence autorisée, mais ne peut pas avoir PRIMARY KEY ou UNIQUE ; lorsque le contrôle des clés étrangères est activé, une référence ajoutée nécessite une valeur par défaut NULL.
Pour une modification plus large dans SQLite :
- Note les index, déclencheurs et vues à recréer. Si le contrôle des clés étrangères est activé, désactive-le avant la transaction.
- Démarre une transaction et crée une nouvelle table avec les règles voulues.
- Copie les lignes en indiquant explicitement les colonnes dans
INSERT INTO new_products (...) SELECT ... FROM products;. - Supprime l’ancienne table et renomme la nouvelle en
products. - Recrée les objets dépendants et exécute
PRAGMA foreign_key_check;. Résous les problèmes signalés avant de valider. - Valide, puis réactive le contrôle des clés étrangères s’il était activé auparavant.
MySQL modifie les définitions avec MODIFY COLUMN ; SQL Server utilise ALTER COLUMN. Traduis une modification de structure dans la syntaxe prise en charge par la base de données cible avant de l’exécuter.
Points clés
- ALTER TABLE modifie la structure ; UPDATE modifie les valeurs stockées.
- Les colonnes ajoutées donnent aux lignes existantes une valeur par défaut ou NULL.
- Remplis une nouvelle colonne obligatoire avant d’ajouter NOT NULL.
- Supprimer une colonne retire ses valeurs et peut être bloqué par des dépendances.
- SQLite nécessite une reconstruction pour de nombreuses modifications de types et de contraintes.
- Les reconstructions doivent préserver les objets dépendants et vérifier les clés étrangères.
6.2 Supprimer des tables avec DROP TABLE
DROP TABLE supprime le contenant ainsi que son contenu. Après DROP TABLE archived_orders;, les requêtes ne peuvent plus lire cette table parce qu’elle n’existe plus. Ses contraintes, ses index et ses déclencheurs sont supprimés avec elle.
Choisir le niveau de suppression
| Résultat voulu | Instruction |
|---|---|
| Conserver la table et supprimer certaines lignes | DELETE FROM orders WHERE ...; |
| Conserver une table vide | DELETE FROM orders; |
| Vider rapidement une table lorsque c’est possible | TRUNCATE TABLE orders; |
| Supprimer la table elle-même | DROP TABLE orders; |
DROP TABLE IF EXISTS archived_orders; évite une erreur si la table est absente. Il supprime néanmoins une table existante et ses données. Un script d’installation qui supprime et recrée des tables détruit des données s’il est exécuté sur une base contenant des enregistrements que tu souhaites conserver.
Respecter les liens entre les tables
Supprime les tables enfants avant les parentes, dans l’ordre inverse de la création habituelle. Dans PostgreSQL, supprimer customers alors qu’une clé étrangère de commande en dépend échoue. DROP TABLE customers CASCADE; supprime aussi la clé étrangère dépendante et les éventuelles vues dépendantes. La table des commandes et ses lignes restent, mais l’association avec le client n’est plus contrôlée.
Ce CASCADE de PostgreSQL diffère du ON DELETE CASCADE d’une clé étrangère. Le premier supprime des objets dépendants de la base de données lors d’une modification de structure. Le second supprime des lignes enfants lorsqu’une ligne parente est supprimée. Savoir quelle action est utilisée évite de prévoir incorrectement les données restantes.
Lorsque le contrôle des clés étrangères est activé dans SQLite, la suppression d’une table entraîne d’abord une suppression implicite de ses lignes. Les lignes enfants qui les référencent peuvent la bloquer. Si l’association déclare ON DELETE CASCADE, ces lignes enfants peuvent être supprimées ; SET NULL peut effacer leurs liens. Supprimer une table exige donc la même attention aux références que supprimer des lignes, ainsi qu’une attention à la structure de table supprimée.
Préserver une possibilité de restauration
Avant de supprimer ou de reconstruire une table contenant des données réelles, conserve une copie utilisable. Voici une copie rapide des données à l’intérieur de la base :
CREATE TABLE products_backup AS
SELECT * FROM products;
Dans SQLite et PostgreSQL, cette instruction conserve les données sélectionnées mais pas les contraintes d’origine. Elle ne permet pas de reconstruire entièrement la définition de la table. Une exportation ou une sauvegarde de la base conserve les données nécessaires à la restauration à l’extérieur de la table modifiée.
SQLite et PostgreSQL permettent aussi de tester une suppression de table dans une transaction :
BEGIN;
DROP TABLE archived_orders;
ROLLBACK;
L’annulation restaure la table et ses lignes parce que la suppression n’a pas été validée. Une fois validée, la suppression ne peut pas être annulée par un ROLLBACK ultérieur. Dans les bases de données qui valident implicitement les instructions du LDD, encadrer la suppression par une syntaxe de transaction n’offre pas cette possibilité d’annulation. Examine la base de données cible et les tables concernées avant d’exécuter un script de reconstruction.
Points clés
- DROP TABLE supprime la table et ses lignes, contraintes, index et déclencheurs.
- IF EXISTS évite une erreur si la table est absente, mais n’empêche pas la suppression d’une table existante.
- Supprime les tables enfants avant leurs parentes.
- DROP CASCADE dans PostgreSQL supprime les objets dépendants, tandis que les tables enfants peuvent rester.
- Une copie des seules données ne conserve pas les contraintes d’origine.
Créer des tables SQL : exemples
1Créer et examiner une table de produits
11 étapes
- 1IntroductionCommencer par un produit
Une boutique doit enregistrer l’identifiant, le nom, le prix et le nombre d’articles en stock d’un produit. Une définition de table donne à chaque information son propre champ avant l’ajout de lignes de produits.
Nous allons construire la structure, l’examiner, puis vérifier si les types préservent le sens des valeurs. Les exemples utilisent SQLite et indiquent les changements pour PostgreSQL lorsqu’ils influent sur le résultat.
- 2ExplicationLire une définition de colonne
Dans
name TEXT NOT NULL,nameest l’identifiant du champ,TEXTdécrit son stockage etNOT NULLimpose une valeur.La table liste ces définitions entre parenthèses, séparées par des virgules. Le point-virgule termine l’instruction de création. Créer la structure relève du LDD ; cela n’ajoute aucune ligne de produit. Un
INSERTultérieur fournit ces lignes. - 3ExempleCréer quatre champs
CREATE TABLE products ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, price NUMERIC(8, 2) NOT NULL, in_stock INTEGER DEFAULT 0 );Il y a quatre définitions de colonnes et trois virgules de séparation. SQLite génère cette clé primaire entière. PostgreSQL nécessite une déclaration d’identité si un identifiant omis doit être généré.
- 4ConseilExaminer la définition réelle
Utilise
PRAGMA table_info(products);dans le SQL de SQLite ou.schema productsdans son interpréteur de commandes. Dans psql pour PostgreSQL, utilise\d products.L’examen révèle plus que les erreurs de syntaxe. SQLite peut lire une virgule manquante comme faisant partie d’un nom de type composé de plusieurs mots, ce qui laisse une seule colonne là où tu en attendais deux.
SELECT * FROM products;affiche une table vide, mais l’absence de lignes ne permet pas de vérifier toutes les règles. - 5DéfiCela corrigera-t-il une ancienne table ?
Une ancienne table
productsne contient queidetname. Un script exécuteCREATE TABLE IF NOT EXISTS products (...)avec les quatre colonnes souhaitées. Combien de colonnes la table existante possède-t-elle ensuite ?---reveal---
Elle en possède toujours deux.
IF NOT EXISTSignore la création lorsque le nom est présent. Il ne compare pas les définitions et n’ajoute pas les champs manquants. Une modification de structure nécessiteALTER TABLEou une reconstruction volontaire. - 6ExplicationDistinguer les quantités des codes
Stocke les quantités sous forme de nombres pour que les calculs et le tri numérique fonctionnent. Stocke les codes sous forme de texte lorsque leurs caractères ont un sens.
Le code postal américain
'02139'perd son zéro initial s’il est stocké comme entier. Les valeurs textuelles'100','25'et'9'sont triées dans cet ordre de caractères, ce qui ne convient pas à des quantités numériques. La décision dépend de l’usage du champ, pas de la présence de chiffres dans ses exemples. - 7ExempleLire la précision et l’échelle
Dans PostgreSQL,
NUMERIC(8, 2)autorise huit chiffres au total, dont deux après la virgule. Il en reste six avant, jusqu’à 999 999,99.Une valeur de 12,345 est stockée sous la forme 12,35. Une valeur de 1 234 567,00 échoue parce qu’elle nécessite sept chiffres avant la virgule. SQLite accepte la même déclaration mais n’impose ni cette précision ni cette échelle : cette prévision ne s’applique donc pas à SQLite.
- 8Point cléConserver des montants exacts
La virgule flottante binaire peut introduire de minuscules écarts dans les calculs décimaux.
SELECT 0.1 + 0.2 = 0.3;dans SQLite renvoie faux.Utilise
NUMERICdans PostgreSQL pour les montants décimaux exacts. Dans SQLite, stocke les centimes entiers sous forme d’entiers : 1 999 représente 19,99. ÉcrireNUMERIC(8, 2)dans SQLite ne crée pas un stockage décimal exact à échelle fixe. Les types approximatifs restent adaptés aux mesures comme les températures. - 9DéfiGarder les dates dans l’ordre
Une table SQLite stocke les dates sous forme de texte. Pourquoi remplacer
'12/01/2025'et'03/15/2026'par des dates ISO aide-t-il à trier les dates par ordre croissant ?---reveal---
Les formes ISO sont
'2025-12-01'et'2026-03-15'. La comparaison textuelle vérifie alors l’année, le mois et le jour dans cet ordre, ce qui place la date la plus ancienne en premier. Un texte qui commence par le mois compare celui-ci avant d’atteindre l’année et place ces deux dates dans le mauvais ordre chronologique. - 10DéfiVérifier la table et le type
Un script SQLite crée une table manquante avec
CREATE TABLE IF NOT EXISTS readings (qty INTEGER);. Une insertion fournit'abc'comme valeur de qty et réussit. Que dois-tu vérifier avant de supposer que qty contient toujours des nombres ?---reveal---
Examine la définition réelle, car
IF NOT EXISTSpourrait avoir ignoré une table plus ancienne. Tiens aussi compte de l’affinité ordinaire de SQLite : une déclaration entière peut tout de même stocker du texte non numérique. Une tableSTRICTadaptée renforce le contrôle des types. - 11RécapitulatifAdapter la structure à l’usage
Une instruction de création définit les champs, les types et les règles ; une insertion fournit les enregistrements. Examine la structure existante au lieu de supposer qu’un script exécuté avec succès a créé la définition voulue.
Pour chaque champ, demande-toi ce qui doit être préservé : les calculs numériques, les centimes exacts, les caractères d’un identifiant ou l’ordre chronologique. Tiens compte du comportement des types dans la base de données cible pour prévoir le résultat stocké.
2Protéger les produits et les liens avec les clients
13 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionVérifier les données au niveau de la base
- 2ExplicationDonner un rôle à chaque règle
- 3ExempleSuivre une ligne acceptée
- 4DéfiUne valeur par défaut corrige-t-elle un NULL explicite ?
- 5Point cléUn résultat de vérification inconnu est accepté
- 6ExplicationIdentifier la ligne entière
- 7ExempleLaisser le système choisir l’identifiant
- 8DéfiL’identifiant suivant indique-t-il le nombre de lignes ?
- 9ExplicationRelier chaque commande à son client
- 10ExempleSuivre une cascade
- 11DéfiConserver les commandes après la suppression
- 12DéfiCombiner les règles nécessaires
- 13RécapitulatifVérifier les valeurs, l’identité et les liens
3Insérer des produits et copier des commandes
11 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionChoisir l’origine des nouvelles lignes
- 2ExempleAssocier les valeurs d’un produit
- 3ConseilConserver les valeurs littérales intactes
- 4DéfiLire la liste explicite
- 5ExplicationAjouter un groupe en une instruction
- 6ExemplePrévisualiser la requête d’archivage
- 7ExempleUtiliser la requête comme entrée
- 8ExplicationDésigner la ligne proposée
- 9DéfiConserver ou remplacer ?
- 10DéfiCopier et relier sans deviner
- 11RécapitulatifSuivre l’entrée pendant l’écriture
4Modifier exactement les lignes voulues
14 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDistinguer les modifications du choix des lignes
- 2ExempleAttribuer deux nouvelles valeurs
- 3ExempleAugmenter un prix à partir de son ancienne valeur
- 4DéfiLes autres prix changeront-ils ?
- 5ExplicationSupprimer une ligne ou effacer un champ
- 6ExempleSuivre les anciennes commandes annulées
- 7DéfiConserver l’historique d’un client supprimé
- 8ConseilRéutiliser la condition prévisualisée
- 9ExempleAppliquer AND avant OR
- 10DéfiAppliquer une même règle de date aux deux statuts
- 11Point cléUne comparaison négative manque les NULL
- 12DéfiUtiliser une liste de clés clients
- 13DéfiExaminer une mise à jour de toutes les lignes
- 14RécapitulatifVérifier le sens et l’effet
5Conserver ou annuler une modification complète
12 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionUn transfert nécessite deux modifications
- 2ExplicationOuvrir une limite commune
- 3ExempleSoustraire le montant du transfert
- 4ExempleAjouter et examiner le dépôt
- 5DéfiAnnuler tout le transfert en attente
- 6ExempleSuivre une modification de solde en échec
- 7ExplicationRétablir la situation selon la base de données
- 8DéfiÉviter de conserver une opération incomplète
- 9ExempleMarquer une étape intermédiaire
- 10Point cléLibérer un point de sauvegarde ne valide pas la transaction
- 11DéfiCette suppression de table peut-elle être annulée ?
- 12RécapitulatifTerminer par une décision réfléchie
6Modifier ou supprimer une table contenant des données
13 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionTravailler avec des enregistrements déjà présents
- 2ExempleAjouter un champ acceptant les valeurs manquantes
- 3DéfiRendre un champ obligatoire après l’avoir rempli
- 4ConseilMettre à jour chaque utilisation externe du nom
- 5ExplicationReconnaître les limites de ALTER
- 6ExemplePréparer la table de remplacement
- 7ExempleCopier, remplacer et vérifier
- 8ExplicationDécider si la table doit rester
- 9ExempleSuivre les dépendances dans PostgreSQL
- 10DéfiDistinguer les deux sens de cascade
- 11ConseilPermettre la restauration des données et de la définition
- 12DéfiConserver les règles lors d’une reconstruction
- 13RécapitulatifSuivre la structure et ses dépendances
Créer des tables SQL : QCM
Série 1 : Créer des tables et effectuer les premières modifications10 Questions Pratiques
Question 1 sur 10
00481. Quel type de stockage convient ?Afficher la réponseMasquer la réponse
Question 2 sur 10
NUMERIC(6, 2). Quelle est sa plus grande valeur positive ?Afficher la réponseMasquer la réponse
Question 3 sur 10
qty INTEGER NOT NULL DEFAULT 4 CHECK (qty >= 0). Une insertion fournit explicitement NULL pour qty. Que se passe-t-il ?Afficher la réponseMasquer la réponse
NULL explicite est vérifié comme une valeur manquante fournie : il enfreint donc NOT NULL. La valeur par défaut 4 est utilisée lorsque la colonne est omise, pas lorsqu’une valeur manquante est envoyée explicitement. La vérification imposant une valeur positive ou nulle ne remplace pas la règle de présence.Question 4 sur 10
Afficher la réponseMasquer la réponse
Question 5 sur 10
supplier_id = 18, mais le fournisseur 18 n’existe pas. Que faut-il faire pour insérer avec succès cette même référence non NULL ?Afficher la réponseMasquer la réponse
Question 6 sur 10
(code, name) avec les valeurs ('R7', 'Notebook'). Qu’est-ce qui est stocké dans name ?Afficher la réponseMasquer la réponse
Question 7 sur 10
Afficher la réponseMasquer la réponse
Question 8 sur 10
DELETE FROM logs; réussit. Que reste-t-il ?Afficher la réponseMasquer la réponse
DELETE supprime les 12 lignes et laisse la structure de la table disponible pour de futures insertions. Il ne supprime pas les colonnes et ne remplace pas les enregistrements par des valeurs manquantes. Supprimer la table elle-même nécessite DROP TABLE, une opération de structure distincte.Question 9 sur 10
BEGIN, fait passer une quantité de 8 à 11, puis exécute ROLLBACK. Quelle quantité cette connexion lit-elle ensuite ?Afficher la réponseMasquer la réponse
Question 10 sur 10
Afficher la réponseMasquer la réponse
SET NOT NULL ne peut réussir qu’une fois toutes les valeurs manquantes renseignées. Exiger les valeurs avant de les remplir échoue, car les lignes existantes contiendraient encore NULL.Série 2 : Diagnostiquer les erreurs SQL courantes10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
labels possède déjà uniquement les colonnes id et text. Un script exécute CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY, text TEXT, color TEXT);. Qu’arrive-t-il à color ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
CREATE TABLE tickets (id INTEGER PRIMARY KEY, label TEXT);. Aucune autre instruction n’est exécutée. Qu’existe-t-il ensuite ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
CHECK (score BETWEEN 0 AND 100). Une insertion fournit NULL. Que se passe-t-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
ON DELETE SET NULL, et project_id est aussi soumis à NOT NULL. Le contrôle des clés étrangères est activé. Que se passe-t-il lorsque le projet est supprimé ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
CHECK (balance >= 0). Avec la gestion ordinaire des contraintes, que conserverait COMMIT ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
active INTEGER NOT NULL DEFAULT 1. Quelle valeur active ses lignes existantes ont-elles ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 3 : Suivre les résultats stockés10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
NUMERIC(5, 2). Qu’arrive-t-il à une valeur insérée de 48,726 ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
UNIQUE (room_id, start_time). Elle contient (4, '09:00') et (5, '09:00'). Que se passe-t-il lors de l’insertion de (4, '10:00') ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
code TEXT PRIMARY KEY. Quelle règle supplémentaire comble l’exception historique de SQLite concernant les clés manquantes ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
qty INTEGER NOT NULL DEFAULT 6. Quelle insertion ajoute une brosse en utilisant cette valeur par défaut ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
state = 'closed' OR state = 'expired' AND opened < '2026-01-01' ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
ROLLBACK TO s, puis valide. Que reste-t-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
DROP TABLE clients CASCADE; réussit. Que peut-il rester de invoices ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 4 : Choisir une suite d’étapes fiable10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
CREATE TABLE t (a INTEGER b TEXT); réussit. L’examen ne montre que la colonne a. Pourquoi ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
COUNT(*) renvoie-t-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
ON CONFLICT (code) DO UPDATE SET qty = stock.qty + excluded.qty. La même instruction est ensuite relancée. Quelle quantité qty est stockée ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
CREATE TABLE saved AS SELECT * FROM original;. Que faut-il vérifier avant de considérer saved comme un remplacement complet ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 5 : Appliquer les règles à des modifications combinées10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
value NUMERIC(7, 2). L’insertion de 6,789 réussit. Quelle valeur stockée faut-il attendre de cette seule déclaration ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
label TEXT NOT NULL sans autre règle. Que se passe-t-il lorsque la valeur fournie est la chaîne vide ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
parent_id INTEGER DEFAULT 90 REFERENCES parents(id) ON DELETE SET DEFAULT. Le parent 90 n’existe pas. L’enfant 12 pointe vers le parent 7. Que se passe-t-il lorsque le parent 7 est supprimé ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
DO UPDATE SET qty = excluded.qty. Quelle quantité est stockée après les deux importations et quel total une addition correcte aurait-elle produit ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
customer_id = (SELECT id FROM customers WHERE eligible = TRUE). Que se passe-t-il et quelle comparaison corrige le problème ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Tu bloques sur ton propre exercice ? Aide aux Devoirs
Mots-Clés
A
ADD COLUMN
active INTEGER NOT NULL DEFAULT 1 donne aux clients existants la nouvelle valeur 1 sans insertions séparées.Affectation SET
SET in_stock = in_stock - 1 diminue le nombre stocké, tandis que SET in_stock = 1 le remplace par un.Affinité de type
'5' en 5 mais peut conserver 'abc' comme texte sans erreur.ALTER TABLE
ALTER TABLE ; remplir ensuite les numéros utilise UPDATE.Atomicité
AUTOINCREMENT
C
CHECK
CHECK (price > 0) rejette un prix négatif mais nécessite aussi NOT NULL lorsqu’un prix doit être fourni.Clé composite
Clé de substitution
Clé étrangère
Clé naturelle
Clé primaire
Colonne d’identité
INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY fournit de nouveaux identifiants sans numéro saisi manuellement à chaque insertion.COMMIT
Condition WHERE
Contrainte
Contrainte nommée
CONSTRAINT price_positive CHECK (price > 0) donne un nom à la règle de prix positif pour sa maintenance ultérieure.Contrôle des clés étrangères
PRAGMA foreign_keys = ON; sur la connexion avant une transaction pour vérifier les liens déclarés.CREATE TABLE
CREATE TABLE labels (id INTEGER PRIMARY KEY, name TEXT); prépare une table avant l’insertion de libellés.CREATE TABLE AS
cheap_products contient les produits sélectionnés lors de sa création, même après la modification des prix à la source.D
Date ISO
'2026-03-15' se trient par année, mois et jour lorsqu’elles utilisent toutes le même format.DEFAULT
DEFAULT 0 donne zéro, tandis que fournir explicitement NULL laisse la valeur manquante.DELETE
Dépendance
DROP CASCADE
DROP COLUMN
DROP TABLE
É
Échelle
NUMERIC(8, 2) stocke 12,345 sous la forme 12,35, car l’échelle déclarée est de deux.E
excluded
stock.qty + excluded.qty ajoute la quantité entrante proposée à la quantité déjà stockée.I
Identifiant
"order date" nécessite des guillemets, tandis que order_date évite les espaces et est plus facile à réutiliser.IF EXISTS
DROP TABLE IF EXISTS archived_orders; réussit lorsque la table est absente et la supprime lorsqu’elle est présente.IN
INSERT
INSERT SELECT
Insertion multiligne
INTEGER
IS NULL
WHERE phone IS NULL trouve les clients sans numéro de téléphone ; WHERE phone = NULL ne trouve aucune de ces lignes.L
Langage de définition de données
CREATE TABLE, ALTER TABLE et DROP TABLE modifient la structure de la base de données à différentes étapes.Langage de manipulation de données
INSERT ; corriger son statut utilise UPDATE ; supprimer sa ligne utilise DELETE.Liste de colonnes
(sku, name, price) fait de la première valeur fournie un code SKU même si le prix a été déclaré plus tôt dans la table.Littéral de chaîne
'O''Brien' stocke le nom « O'Brien » avec une seule apostrophe au lieu de terminer la valeur trop tôt.N
Nombre de lignes affectées
NOT NULL
NULL
NULL lorsqu’aucun numéro n’est connu ; IS NULL trouve ces clients.O
ON DELETE CASCADE
ON DELETE SET NULL
P
Point de sauvegarde
Précision d’un type NUMERIC
NUMERIC(8, 2) autorise six chiffres avant la virgule et deux après, jusqu’à 999 999,99.Priorité des opérateurs
R
Reconstruction de table
RELEASE
RETURNING
ROLLBACK
ROLLBACK TO
after_first, créé entre deux augmentations de solde, annule la seconde augmentation mais laisse la première en attente.ROUND
ROUND(price * 1.10, 2) demande un résultat à deux décimales pour un calcul de prix SQLite qui produirait 21,989.S
Sous-requête
order_id IN (SELECT id FROM orders WHERE status = 'cancelled') pour choisir les lignes de commande liées.Suppression logique
deleted_at pour un client conserve sa ligne : les requêtes sur les clients actifs ajoutent donc deleted_at IS NULL.T
Table enfant
Table intermédiaire
NULL grâce à NULLIF(TRIM(email), '') pendant la requête de copie.Table parente
Transaction
Transaction en échec
TRUNCATE
TRUNCATE TABLE, mais ses règles de dépendance et de transaction comptent toujours.Type de données
U
UNIQUE
UNIQUE (order_id, product_id) autorise le même produit dans différentes commandes mais rejette une paire répétée.UPDATE
UPDATE products SET price = 22.50 WHERE id = 3; modifie un produit sans insérer une nouvelle ligne de produit.Upsert
ON CONFLICT (sku) DO UPDATE s’il existe.V
Validation automatique
Validation implicite
Virgule flottante
0.1 + 0.2 = 0.3 comme faux parce que ses littéraux décimaux utilisent un stockage approximatif.- 1Modèle relationnel
- 2Requêtes SELECT en SQL
- 3Colonnes calculées SQL
- 4Fonctions d’agrégation SQL
- 5Jointures SQL
- 6Créer des tables SQL
À propos de cette unité
Crée ton propre Matériel d'Étude
Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.