Créer des tables SQL et modifier des données

Apprends à créer tes propres tables de base de données et à modifier leurs données en toute sécurité. Écris des instructions 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

  1. Écris des instructions CREATE TABLE qui 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 TABLE
      Dé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 colonne
      Choisis 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.
  2. 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 CHECK
      Dé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és
      Dé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ères
      Dé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é.
  3. 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 ... VALUES avec une liste de colonnes et des textes, nombres, dates et NULL correctement é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 doublons
      Copie des lignes avec INSERT ... SELECT, récupère les valeurs générées avec RETURNING et décide ce qui se passe lorsqu’une ligne insérée entre en conflit avec une ligne existante.
  4. Modifie des valeurs avec UPDATE et supprime des lignes avec DELETE, en veillant à ce que chaque instruction affecte exactement les lignes voulues.
    • Modifier des valeurs avec UPDATE
      Écris des instructions UPDATE qui définissent une ou plusieurs colonnes, calculent de nouvelles valeurs à partir des anciennes et respectent les contraintes de la table.
    • Supprimer des lignes avec DELETE
      Supprime des lignes choisies avec DELETE, distingue DELETE, TRUNCATE et DROP TABLE, et détermine quand il vaut mieux marquer une ligne comme supprimée que l’effacer.
    • Cibler exactement les lignes voulues
      Construis des conditions WHERE qui correspondent aux lignes à modifier et à elles seules, puis vérifie le résultat avant de le conserver.
  5. 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 modifications
      Démarre une transaction, conserve ses modifications avec COMMIT ou annule-les avec ROLLBACK, et comprends la validation automatique.
    • Gérer les erreurs, les points de sauvegarde et les modifications de structure dans une transaction
      Ré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, ALTER et DROP.
  6. 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 TABLE
      Utilise ALTER TABLE pour 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 TABLE
      Supprime des tables avec DROP TABLE, respecte les dépendances entre les tables et choisis entre supprimer une table, la vider et supprimer des lignes.

Créer des tables SQL : cours

6 chapitres

1

Cré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 products affiche l’instruction de création.
  • SQL dans SQLite : PRAGMA table_info(products); liste les colonnes et leurs types.
  • psql de PostgreSQL : \d products affiche 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
ValeursType utileRaison
Dénombrements entiersINTEGERLes dénombrements n’ont pas de partie fractionnaire.
Montants exacts dans PostgreSQLNUMERIC(p, s)Le calcul décimal conserve des montants exacts.
Montants exacts dans SQLiteCentimes en INTEGERLes centimes entiers évitent le stockage en virgule flottante.
MesuresREAL ou DOUBLE PRECISIONLes valeurs approximatives conviennent aux grandeurs mesurées.
Noms et codesTEXT 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.
2

Proté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éesDéclaration de clé primaire générée
SQLiteid INTEGER PRIMARY KEY
PostgreSQLid INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
MySQLid INT AUTO_INCREMENT PRIMARY KEY
SQL Serverid 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 DELETERésultat
NO ACTION ou RESTRICTLa suppression échoue tant que 101 et 102 référencent Ana.
CASCADEAna, 101 et 102 sont supprimés ; Ben et 103 restent.
SET NULLAna est supprimée ; toutes les commandes restent, 101 et 102 n’étant plus liées.
SET DEFAULTLes 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.
3

Ajouter 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
TypeExemple SQL
Texte'Desk lamp'
Texte contenant une apostrophe'O''Brien'
Nombre1250.50
Date ISO'2026-03-15'
Valeur manquanteNULL

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.
4

Modifier 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 :

IdentifiantStatutDate de commande
201cancelled2025-11-03
202shipped2025-12-19
203cancelled2026-01-08
204cancelled2025-10-30
205expired2026-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
InstructionLignes suppriméesCe qui reste
DELETE ... WHERE ...Lignes correspondantesTable et autres lignes
DELETE FROM orders;Toutes les lignesTable vide
TRUNCATE TABLE orders;Toutes les lignes, sans WHERETable vide
DROP TABLE orders;Toutes les lignes avec la tablePlus 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.
5

Regrouper 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
SQLiteL’instruction en échec est annulée ; la modification précédente de Maya reste en attente.
PostgreSQLLa 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.
6

Modifier 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 :

  1. 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.
  2. Démarre une transaction et crée une nouvelle table avec les règles voulues.
  3. Copie les lignes en indiquant explicitement les colonnes dans INSERT INTO new_products (...) SELECT ... FROM products;.
  4. Supprime l’ancienne table et renomme la nouvelle en products.
  5. Recrée les objets dépendants et exécute PRAGMA foreign_key_check;. Résous les problèmes signalés avant de valider.
  6. 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 vouluInstruction
Conserver la table et supprimer certaines lignesDELETE FROM orders WHERE ...;
Conserver une table videDELETE FROM orders;
Vider rapidement une table lorsque c’est possibleTRUNCATE TABLE orders;
Supprimer la table elle-mêmeDROP 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

6 Leçons Interactives

1

Créer et examiner une table de produits

11 étapes
Définis une table vide, vérifie ses colonnes et choisis un stockage adapté à chaque valeur.
  1. 1
    IntroductionCommencer 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.

  2. 2
    ExplicationLire une définition de colonne

    Dans name TEXT NOT NULL, name est l’identifiant du champ, TEXT décrit son stockage et NOT NULL impose 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 INSERT ultérieur fournit ces lignes.

  3. 3
    ExempleCré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é.

  4. 4
    ConseilExaminer la définition réelle

    Utilise PRAGMA table_info(products); dans le SQL de SQLite ou .schema products dans 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.

  5. 5
    DéfiCela corrigera-t-il une ancienne table ?

    Une ancienne table products ne contient que id et name. Un script exécute CREATE 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 EXISTS ignore 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écessite ALTER TABLE ou une reconstruction volontaire.

  6. 6
    ExplicationDistinguer 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.

  7. 7
    ExempleLire 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.

  8. 8
    Point 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 NUMERIC dans PostgreSQL pour les montants décimaux exacts. Dans SQLite, stocke les centimes entiers sous forme d’entiers : 1 999 représente 19,99. Écrire NUMERIC(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.

  9. 9
    Dé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.

  10. 10
    Dé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 EXISTS pourrait 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 table STRICT adaptée renforce le contrôle des types.

  11. 11
    Ré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é.

2

Protéger les produits et les liens avec les clients

13 étapes
Suis les vérifications des contraintes, choisis des clés générées et prévois les actions des clés étrangères.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionVérifier les données au niveau de la base
  2. 2
    ExplicationDonner un rôle à chaque règle
  3. 3
    ExempleSuivre une ligne acceptée
  4. 4
    DéfiUne valeur par défaut corrige-t-elle un NULL explicite ?
  5. 5
    Point cléUn résultat de vérification inconnu est accepté
  6. 6
    ExplicationIdentifier la ligne entière
  7. 7
    ExempleLaisser le système choisir l’identifiant
  8. 8
    DéfiL’identifiant suivant indique-t-il le nombre de lignes ?
  9. 9
    ExplicationRelier chaque commande à son client
  10. 10
    ExempleSuivre une cascade
  11. 11
    DéfiConserver les commandes après la suppression
  12. 12
    DéfiCombiner les règles nécessaires
  13. 13
    RécapitulatifVérifier les valeurs, l’identité et les liens
3

Insérer des produits et copier des commandes

11 étapes
Associe les valeurs aux colonnes, examine les lignes copiées et distingue le remplacement de l’ajout au stock.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionChoisir l’origine des nouvelles lignes
  2. 2
    ExempleAssocier les valeurs d’un produit
  3. 3
    ConseilConserver les valeurs littérales intactes
  4. 4
    DéfiLire la liste explicite
  5. 5
    ExplicationAjouter un groupe en une instruction
  6. 6
    ExemplePrévisualiser la requête d’archivage
  7. 7
    ExempleUtiliser la requête comme entrée
  8. 8
    ExplicationDésigner la ligne proposée
  9. 9
    DéfiConserver ou remplacer ?
  10. 10
    DéfiCopier et relier sans deviner
  11. 11
    RécapitulatifSuivre l’entrée pendant l’écriture
4

Modifier exactement les lignes voulues

14 étapes
Applique des mises à jour calculées, suis les suppressions et teste les filtres avant de conserver une modification.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDistinguer les modifications du choix des lignes
  2. 2
    ExempleAttribuer deux nouvelles valeurs
  3. 3
    ExempleAugmenter un prix à partir de son ancienne valeur
  4. 4
    DéfiLes autres prix changeront-ils ?
  5. 5
    ExplicationSupprimer une ligne ou effacer un champ
  6. 6
    ExempleSuivre les anciennes commandes annulées
  7. 7
    DéfiConserver l’historique d’un client supprimé
  8. 8
    ConseilRéutiliser la condition prévisualisée
  9. 9
    ExempleAppliquer AND avant OR
  10. 10
    DéfiAppliquer une même règle de date aux deux statuts
  11. 11
    Point cléUne comparaison négative manque les NULL
  12. 12
    DéfiUtiliser une liste de clés clients
  13. 13
    DéfiExaminer une mise à jour de toutes les lignes
  14. 14
    RécapitulatifVérifier le sens et l’effet
5

Conserver ou annuler une modification complète

12 étapes
Suis un transfert, rétablis la situation après des erreurs et utilise un point de sauvegarde sans perdre la transaction englobante.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionUn transfert nécessite deux modifications
  2. 2
    ExplicationOuvrir une limite commune
  3. 3
    ExempleSoustraire le montant du transfert
  4. 4
    ExempleAjouter et examiner le dépôt
  5. 5
    DéfiAnnuler tout le transfert en attente
  6. 6
    ExempleSuivre une modification de solde en échec
  7. 7
    ExplicationRétablir la situation selon la base de données
  8. 8
    DéfiÉviter de conserver une opération incomplète
  9. 9
    ExempleMarquer une étape intermédiaire
  10. 10
    Point cléLibérer un point de sauvegarde ne valide pas la transaction
  11. 11
    DéfiCette suppression de table peut-elle être annulée ?
  12. 12
    RécapitulatifTerminer par une décision réfléchie
6

Modifier ou supprimer une table contenant des données

13 étapes
Ajoute des données obligatoires par étapes, reconstruis les tables SQLite lorsque c’est nécessaire et suis les dépendances lors des suppressions.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionTravailler avec des enregistrements déjà présents
  2. 2
    ExempleAjouter un champ acceptant les valeurs manquantes
  3. 3
    DéfiRendre un champ obligatoire après l’avoir rempli
  4. 4
    ConseilMettre à jour chaque utilisation externe du nom
  5. 5
    ExplicationReconnaître les limites de ALTER
  6. 6
    ExemplePréparer la table de remplacement
  7. 7
    ExempleCopier, remplacer et vérifier
  8. 8
    ExplicationDécider si la table doit rester
  9. 9
    ExempleSuivre les dépendances dans PostgreSQL
  10. 10
    DéfiDistinguer les deux sens de cascade
  11. 11
    ConseilPermettre la restauration des données et de la définition
  12. 12
    DéfiConserver les règles lors d’une reconstruction
  13. 13
    RécapitulatifSuivre la structure et ses dépendances

Créer des tables SQL : QCM

50 Questions Pratiques en 5 séries

Série 1 : Créer des tables et effectuer les premières modifications10 Questions Pratiques

Question 1 sur 10

Un nouveau champ SQLite doit conserver exactement le code de compte 00481. Quel type de stockage convient ?
  1. INTEGER
  2. TEXT
  3. REAL
  4. NUMERIC(5, 0)
Afficher la réponseMasquer la réponse
Réponse : B
Le code est un identifiant dont les caractères doivent être conservés : le texte préserve donc les deux zéros initiaux. Le stockage numérique considère que ces zéros n’ont pas d’effet sur le nombre et ne conserve pas cette forme écrite. La précision numérique décrit le stockage d’un nombre, pas le format d’un identifiant de longueur fixe.

Question 2 sur 10

Une colonne PostgreSQL utilise NUMERIC(6, 2). Quelle est sa plus grande valeur positive ?
  1. 999999,99
  2. 99,9999
  3. 999999
  4. 9999,99
Afficher la réponseMasquer la réponse
Réponse : D
La précision est de six chiffres au total et l’échelle en réserve deux pour les décimales, ce qui en laisse quatre avant la virgule. Le maximum est donc de 9 999,99. Considérer six comme le nombre de chiffres avant la virgule autoriserait trop de chiffres au total.

Question 3 sur 10

Une colonne SQLite est déclarée qty INTEGER NOT NULL DEFAULT 4 CHECK (qty >= 0). Une insertion fournit explicitement NULL pour qty. Que se passe-t-il ?
  1. L’insertion échoue à cause de la règle NOT NULL.
  2. La ligne est insérée avec la quantité 4.
  3. La ligne est insérée avec la quantité 0.
  4. La ligne est insérée avec la quantité NULL.
Afficher la réponseMasquer la réponse
Réponse : A
Un 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

Une table PostgreSQL doit générer des identifiants lorsque les insertions omettent id. Quelle définition de colonne permet ce comportement ?
  1. id INTEGER PRIMARY KEY NOT NULL CHECK (id > 0)
  2. id INTEGER UNIQUE NOT NULL DEFAULT 1
  3. id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
  4. id INTEGER NOT NULL CHECK (id >= 1)
Afficher la réponseMasquer la réponse
Réponse : C
Une déclaration d’identité fournit une valeur générée par une séquence, tandis que la clé primaire garantit l’identité de la ligne. Une simple clé primaire entière ne fait que vérifier les valeurs fournies ; elle ne génère pas un identifiant omis. Une valeur par défaut constante de 1 répéterait la même valeur au lieu de générer de nouveaux identifiants.

Question 5 sur 10

Le contrôle des clés étrangères est activé. Une ligne enfant utilise 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 ?
  1. Ajouter une autre clé primaire à la ligne enfant.
  2. Valider la ligne enfant avant d’ajouter le fournisseur.
  3. Créer d’abord la ligne du fournisseur correspondant.
  4. Donner à supplier_id une valeur par défaut non NULL.
Afficher la réponseMasquer la réponse
Réponse : C
La valeur fournie dans la ligne enfant doit correspondre à une clé parente existante : le fournisseur 18 doit donc exister avant l’insertion de cette référence avec le contrôle immédiat ordinaire. Une autre clé dans la table enfant ne corrige pas l’absence du parent. Une valeur par défaut ne remplace pas le 18 fourni explicitement.

Question 6 sur 10

Une table déclare name avant code. Une insertion utilise (code, name) avec les valeurs ('R7', 'Notebook'). Qu’est-ce qui est stocké dans name ?
  1. Le texte Notebook.
  2. Le texte R7.
  3. Le texte R7, Notebook.
  4. Une valeur manquante, NULL.
Afficher la réponseMasquer la réponse
Réponse : A
La liste explicite des colonnes détermine la correspondance : la deuxième valeur va dans la deuxième colonne listée, name. L’ordre de déclaration de la table ne remplace pas cette liste. Lire les valeurs dans l’ordre de la table inverserait à tort le code et le nom.

Question 7 sur 10

Une ligne a une quantité qty de 9. Quelle affectation réduit la quantité stockée de 3 ?
  1. SET qty = 3
  2. SET qty = 9 - qty
  3. SET qty = qty * 3
  4. SET qty = qty - 3
Afficher la réponseMasquer la réponse
Réponse : D
La nouvelle valeur doit être calculée à partir de la quantité stockée : soustraire 3 laisse donc 6. Attribuer la constante 3 remplace la quantité par 3 et ne signifie pas une diminution de 3. Utiliser la colonne dans l’expression applique aussi la même modification relative à d’autres quantités.

Question 8 sur 10

Une table contient 12 lignes. DELETE FROM logs; réussit. Que reste-t-il ?
  1. La définition de logs et les 12 lignes.
  2. Une table logs vide avec sa définition.
  3. Aucune table logs et aucune ligne restante.
  4. Une ligne logs contenant des valeurs manquantes.
Afficher la réponseMasquer la réponse
Réponse : B
Sans filtre, 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

Une connexion SQLite exécute BEGIN, fait passer une quantité de 8 à 11, puis exécute ROLLBACK. Quelle quantité cette connexion lit-elle ensuite ?
  1. 11
  2. 3
  3. 0
  4. 8
Afficher la réponseMasquer la réponse
Réponse : D
Le passage de 8 à 11 était encore en attente dans la transaction ouverte. Une annulation complète le défait et rétablit la valeur précédente, 8. L’augmentation de 3 est une quantité de changement, pas la quantité rétablie ; aucune étape validée n’a rendu 11 permanent.

Question 10 sur 10

Une table PostgreSQL contient des lignes et n’a pas de colonne phone. Chaque ligne doit à terme avoir son propre numéro de téléphone réel, et aucune valeur par défaut unique ne convient. Quelle suite d’étapes satisfait cette exigence ?
  1. Ajouter phone en acceptant les valeurs manquantes ; remplir des numéros valides ; appliquer NOT NULL.
  2. Ajouter phone avec NOT NULL ; remplir des numéros valides ; retirer sa valeur par défaut.
  3. Ajouter phone en acceptant les valeurs manquantes ; appliquer NOT NULL ; remplir des numéros valides.
  4. Ajouter phone avec DEFAULT NULL ; appliquer NOT NULL ; remplir des numéros valides.
Afficher la réponseMasquer la réponse
Réponse : A
Ajouter un champ qui accepte les valeurs manquantes permet aux enregistrements existants de rester valides pendant le remplissage de leurs numéros de téléphone réels. 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

Une table SQLite 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 ?
  1. La colonne est ajoutée et remplie de valeurs manquantes.
  2. La colonne remplace la colonne text existante.
  3. La colonne n’est pas ajoutée à la table existante.
  4. La colonne n’est ajoutée qu’après la prochaine insertion.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un script exécute CREATE TABLE tickets (id INTEGER PRIMARY KEY, label TEXT);. Aucune autre instruction n’est exécutée. Qu’existe-t-il ensuite ?
  1. Une table avec une ligne pour chaque colonne.
  2. Une table vide avec deux colonnes.
  3. Une table vide avec la seule colonne id.
  4. Deux tables vides nommées id et label.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Dans PostgreSQL, un score qui accepte les valeurs manquantes est soumis uniquement à CHECK (score BETWEEN 0 AND 100). Une insertion fournit NULL. Que se passe-t-il ?
  1. La valeur est rejetée car la vérification est fausse.
  2. La valeur est stockée comme borne inférieure, zéro.
  3. La valeur est acceptée après conversion de NULL en 100.
  4. La valeur est acceptée car la vérification est inconnue.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Un projet comporte deux tâches. Leur clé étrangère project_id utilise 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é ?
  1. La suppression échoue ; le projet et les deux tâches restent.
  2. Le projet est supprimé et les deux tâches perdent leur lien.
  3. Le projet et ses deux tâches sont supprimés.
  4. La suppression réussit et les deux tâches gardent l’ancienne clé.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Le stock du code R2 est de 7. Un enregistrement entrant indique un nombre de remplacement de 11. Quelle affectation d’upsert stocke le nombre voulu ?
  1. SET qty = stock.qty + excluded.qty
  2. SET qty = excluded.qty
  3. SET qty = stock.qty - excluded.qty
  4. SET qty = stock.qty
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une table contient des statuts manquants et non manquants. Une écriture doit cibler toutes les lignes dont le statut n’est pas « payé », y compris les statuts manquants. Quelle condition convient ?
  1. status <> 'paid' AND status IS NULL
  2. status <> 'paid' OR status = NULL
  3. status <> 'paid' OR status IS NULL
  4. status <> 'paid' AND status IS NOT NULL
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Une écriture doit définir la couleur et la quantité d’une ligne. Comment sépare-t-on les deux affectations dans SET ?
  1. Avec une virgule.
  2. Avec AND.
  3. Avec WHERE.
  4. Avec un autre SET.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une transaction SQLite commence avec les soldes 80 et 40. Une première mise à jour soustrait 15 du premier solde. Une seconde soustrait 50 du second et échoue à CHECK (balance >= 0). Avec la gestion ordinaire des contraintes, que conserverait COMMIT ?
  1. Les soldes 80 et 40.
  2. Les soldes 65 et -10.
  3. Les soldes 80 et -10.
  4. Les soldes 65 et 40.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une table SQLite contenant des données reçoit active INTEGER NOT NULL DEFAULT 1. Quelle valeur active ses lignes existantes ont-elles ?
  1. NULL
  2. 1
  3. 0
  4. Leurs identifiants de ligne.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une table d’archives temporaire doit cesser d’exister, y compris ses lignes et sa définition. Quelle instruction effectue cette suppression ?
  1. DELETE FROM archive;
  2. TRUNCATE TABLE archive;
  3. DROP TABLE archive;
  4. ALTER TABLE archive RENAME TO old_archive;
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

Un champ PostgreSQL est déclaré NUMERIC(5, 2). Qu’arrive-t-il à une valeur insérée de 48,726 ?
  1. Elle est stockée sous la forme 48,73.
  2. Elle est stockée sous la forme 48,72.
  3. Elle est stockée sous la forme 48,726.
  4. Elle échoue car elle dépasse cinq chiffres au total.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Une table possède 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') ?
  1. Elle échoue car la salle 4 est répétée.
  2. Elle échoue car deux salles partagent 09:00.
  3. Elle remplace l’enregistrement de la salle 4.
  4. Elle réussit car la paire est nouvelle.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Dans une table SQLite ordinaire, une clé primaire textuelle obligatoire est déclarée code TEXT PRIMARY KEY. Quelle règle supplémentaire comble l’exception historique de SQLite concernant les clés manquantes ?
  1. Ajouter DEFAULT NULL.
  2. Ajouter CHECK (code = code).
  3. Ajouter NOT NULL.
  4. Ajouter un autre UNIQUE.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Une insertion multiligne ordinaire dans PostgreSQL propose trois enregistrements. Le dernier répète un code unique existant. Qu’arrive-t-il aux deux premiers enregistrements proposés ?
  1. Les deux sont insérés avant l’erreur.
  2. Aucun des deux n’est inséré par cette instruction.
  3. Seul le premier enregistrement est inséré.
  4. Les deux sont insérés avec des codes manquants.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Une table SQLite possède un id généré, un name obligatoire et qty INTEGER NOT NULL DEFAULT 6. Quelle insertion ajoute une brosse en utilisant cette valeur par défaut ?
  1. INSERT INTO tools (name, qty) VALUES ('Brush', NULL);
  2. INSERT INTO tools (name, qty) VALUES ('Brush', DEFAULT);
  3. INSERT INTO tools (id, name) VALUES ('Brush', 6);
  4. INSERT INTO tools (name) VALUES ('Brush');
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une ligne de client doit rester, mais sa valeur facultative de téléphone doit devenir manquante. Quelle instruction le permet ?
  1. DELETE FROM clients WHERE id = 28;
  2. UPDATE clients SET phone = NULL WHERE id = 28;
  3. UPDATE clients SET phone = 'NULL' WHERE id = 28;
  4. ALTER TABLE clients DROP COLUMN phone;
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Les dossiers sont 71 (fermé, 2025-08-01), 72 (ouvert, 2026-02-02), 73 (fermé, 2026-03-01) et 74 (expiré, 2025-09-01). Quels identifiants correspondent à state = 'closed' OR state = 'expired' AND opened < '2026-01-01' ?
  1. 71, 73 et 74.
  2. 71 et 74 uniquement.
  3. 71 et 73 uniquement.
  4. 73 et 74 uniquement.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une transaction explicite fait passer un compteur de 5 à 8. Avant la validation, la même connexion interroge la ligne. Quel nombre lit-elle ?
  1. 5
  2. 3
  3. 8
  4. Aucune ligne avant la validation.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une transaction commence avec les compteurs a = 2 et b = 7. Elle augmente a de 3, crée le point de sauvegarde s, augmente b de 4, exécute ROLLBACK TO s, puis valide. Que reste-t-il ?
  1. a = 5 et b = 7.
  2. a = 2 et b = 7.
  3. a = 5 et b = 11.
  4. a = 2 et b = 11.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Dans PostgreSQL, invoices référence clients par une clé étrangère. DROP TABLE clients CASCADE; réussit. Que peut-il rester de invoices ?
  1. Sa table, avec toutes les lignes de factures supprimées.
  2. Ses lignes, toujours liées par l’ancienne clé étrangère.
  3. Aucune table invoices, car elle référençait clients.
  4. Sa table et ses lignes, sans cette clé étrangère.
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

Dans SQLite, CREATE TABLE t (a INTEGER b TEXT); réussit. L’examen ne montre que la colonne a. Pourquoi ?
  1. SQLite n’a créé b qu’après la première insertion.
  2. SQLite a fusionné les types identiques en une colonne.
  3. SQLite a traité b comme une valeur par défaut manquante.
  4. SQLite a lu les mots restants comme un seul nom de type.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Une table PostgreSQL utilisant une colonne d’identité possède actuellement les identifiants 2, 6 et 9. Combien de lignes COUNT(*) renvoie-t-il ?
  1. 9
  2. 7
  3. 3
  4. 6
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Le contrôle des clés étrangères est activé. L’équipe 8 compte les membres 81 et 82 ; l’équipe 9 compte le membre 83. La clé étrangère des membres accepte les valeurs manquantes et utilise ON DELETE SET NULL. Après la suppression de l’équipe 8, combien de membres restent liés à une équipe ?
  1. Trois membres, aucun sans lien.
  2. Un membre, deux membres sans lien.
  3. Un membre, les deux autres supprimés.
  4. Aucun membre, trois membres sans lien.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

La validation automatique est activée et aucune transaction explicite n’est ouverte. Une source contient les identifiants 61 et 62 avant une date limite et l’identifiant 63 après. Une table cible vide possède une clé primaire sur id. Un INSERT SELECT filtré copie les identifiants antérieurs à la date limite, puis la même instruction est relancée sans clause de conflit. Que contient finalement la table cible ?
  1. Les identifiants 61 et 62 une fois chacun ; la seconde copie échoue.
  2. Les identifiants 61 et 62 deux fois chacun ; les deux copies réussissent.
  3. Les identifiants 61, 62 et 63 une fois chacun ; la seconde copie échoue.
  4. Aucune ligne cible ; la seconde copie annule la première.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Une ligne de stock PostgreSQL porte le code K8 et une quantité qty de 14. Une instruction propose (K8, 6) avec 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 ?
  1. 20
  2. 12
  3. 26
  4. 14
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une mise à jour SQLite réussie correspond à quatre lignes ayant toutes déjà active = 1 et leur attribue active = 1. Quel nombre changes() indique-t-il ?
  1. 0
  2. 1
  3. 8
  4. 4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Les commandes ont les statuts et dates suivants : 91 (annulée, 2025-04-01), 92 (NULL, 2025-05-01), 93 (annulée, 2026-02-01), 94 (payée, 2025-06-01). Quelle condition cible les commandes annulées ou au statut manquant uniquement avant 2026 ?
  1. (status = 'cancelled' OR status IS NULL) AND day < '2026-01-01'
  2. status = 'cancelled' OR status IS NULL AND day < '2026-01-01'
  3. (status = 'cancelled' OR status = NULL) AND day < '2026-01-01'
  4. (status = 'cancelled' AND status IS NULL) AND day < '2026-01-01'
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Avec la validation automatique activée, un UPDATE autonome réussit. Un second UPDATE autonome échoue, puis ROLLBACK est exécuté. Qu’arrive-t-il à la première mise à jour ?
  1. Elle est aussi annulée.
  2. Elle reste validée.
  3. Elle attend un COMMIT.
  4. Elle est refaite ensuite.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Les tables dépendent les unes des autres dans cet ordre : line_items référence sales, et sales référence buyers. Les trois doivent être supprimées sans cascade. Quel ordre respecte leurs dépendances ?
  1. buyers, puis sales, puis line_items.
  2. sales, puis line_items, puis buyers.
  3. line_items, puis sales, puis buyers.
  4. line_items, puis buyers, puis sales.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une table SQLite est copiée avec CREATE TABLE saved AS SELECT * FROM original;. Que faut-il vérifier avant de considérer saved comme un remplacement complet ?
  1. Ses contraintes, qui n’ont pas été copiées.
  2. Ses lignes, qui sont toujours absentes.
  3. Son lien source, qui s’actualise en permanence.
  4. Son nom, qui doit toujours être original.
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

Une table SQLite ordinaire déclare value NUMERIC(7, 2). L’insertion de 6,789 réussit. Quelle valeur stockée faut-il attendre de cette seule déclaration ?
  1. 6,79
  2. 6,789
  3. 6,78
  4. 679
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un champ PostgreSQL est déclaré label TEXT NOT NULL sans autre règle. Que se passe-t-il lorsque la valeur fournie est la chaîne vide ?
  1. Elle est acceptée comme chaîne vide présente.
  2. Elle est rejetée comme valeur manquante.
  3. Elle est complétée par un espace avant stockage.
  4. Elle est acceptée après conversion en NULL.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Dans SQLite, avec le contrôle des clés étrangères activé, un lien enfant est déclaré 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é ?
  1. L’enfant reste et son lien devient 90.
  2. L’enfant reste et son lien devient NULL.
  3. Le parent et son enfant sont tous deux supprimés.
  4. La suppression échoue car la valeur par défaut n’a pas de parent.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Une ligne de stock contient une quantité de 9. Deux enregistrements de livraison proposent chacun 4, mais tous deux exécutent 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 ?
  1. Quantité stockée : 4 ; total correct : 13.
  2. Quantité stockée : 8 ; total correct : 17.
  3. Quantité stockée : 4 ; total correct : 17.
  4. Quantité stockée : 9 ; total correct : 8.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Une clé étrangère contrôlée utilise l’action de suppression bloquante par défaut. Une réservation est la seule ligne qui référence le client 44. Comment supprimer le client 44 tout en gardant cette réservation liée au client 45, qui existe et est valide ?
  1. Affecter la réservation à 45 ; supprimer le client 44.
  2. Supprimer le client 44 ; affecter la réservation à 45.
  3. Effacer la clé de la réservation ; conserver le client 44.
  4. Supprimer le client 45 ; affecter la réservation à 44.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une requête PostgreSQL sur les clients admissibles renvoie les identifiants 31 et 34. Leurs commandes doivent toutes deux être mises à jour. Le code utilise customer_id = (SELECT id FROM customers WHERE eligible = TRUE). Que se passe-t-il et quelle comparaison corrige le problème ?
  1. Elle met à jour les deux clients ; garder l’égalité.
  2. Elle met à jour le premier client ; utiliser IN.
  3. Elle échoue sur plusieurs lignes ; utiliser IN.
  4. Elle ne met aucun client à jour ; utiliser IS NULL.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Les soldes des comptes 1 et 2 sont initialement de 300 et 90. Une transaction transfère 40 du compte 1 au compte 2 et est validée. Une nouvelle transaction ajoute 10 au compte 2, crée le point de sauvegarde s, ajoute 5 au compte 1, revient à s, puis est entièrement annulée. Quels soldes restent ?
  1. 300 et 90, total 390.
  2. 260 et 140, total 400.
  3. 265 et 140, total 405.
  4. 260 et 130, total 390.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une transaction PostgreSQL met à jour la ligne A, crée le point de sauvegarde s, puis échoue à une vérification en mettant à jour B. Qu’est-ce qui peut rétablir la transaction tout en gardant la modification de A en attente ?
  1. Exécuter RELEASE s, puis continuer.
  2. Exécuter ROLLBACK TO s, puis continuer.
  3. Exécuter COMMIT, puis continuer la transaction.
  4. Exécuter un autre UPDATE B avant toute annulation.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une reconstruction SQLite nécessite une nouvelle vérification ; des index en dépendent et le contrôle des clés étrangères est activé. Quelle suite d’étapes préserve les règles voulues et vérifie les références ?
  1. Démarrer ; désactiver les clés étrangères ; copier sans règles ; remplacer ; valider ; réactiver les clés ; vérifier les objets ensuite.
  2. Désactiver les clés étrangères ; démarrer ; copier sans règles ; remplacer ; vérifier les clés ; valider ; laisser les clés désactivées.
  3. Désactiver les clés étrangères ; démarrer ; définir et copier ; remplacer ; valider ; vérifier les clés ; abandonner les index dépendants.
  4. Désactiver les clés étrangères ; démarrer ; définir et copier ; remplacer et restaurer les objets ; vérifier les clés ; valider ; réactiver les clés.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une colonne de stock PostgreSQL contient 5, NULL et -2. Elle doit devenir NOT NULL avec CHECK (stock >= 0), en conservant toutes les lignes. Les nombres manquants doivent devenir 0 et les nombres négatifs doivent être corrigés. Quelle suite d’étapes établit les deux règles ?
  1. Définir DEFAULT 0 ; corriger -2 ; ajouter les deux contraintes.
  2. Remplacer les NULL par 0 ; corriger -2 ; ajouter les deux contraintes.
  3. Remplacer les NULL par 0 ; garder -2 ; ajouter les deux contraintes.
  4. Remplacer les NULL par 0 ; corriger -2 ; ajouter seulement la vérification.
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

70 Mots-Clés, chacun avec sa définition

A

ADD COLUMN
L’opération ADD COLUMN ajoute un champ à une table et donne aux lignes existantes sa valeur par défaut ou NULL si aucune valeur par défaut n’est déclarée.
Ajouter active INTEGER NOT NULL DEFAULT 1 donne aux clients existants la nouvelle valeur 1 sans insertions séparées.
Affectation SET
Une affectation SET désigne une colonne et sa nouvelle valeur ou expression dans UPDATE ; des virgules séparent les affectations à plusieurs colonnes.
SET in_stock = in_stock - 1 diminue le nombre stocké, tandis que SET in_stock = 1 le remplace par un.
Affinité de type
L’affinité de type est la préférence de SQLite pour le type de stockage d’une colonne : elle peut convertir une entrée adaptée sans rejeter tous les autres types d’entrées.
Une colonne entière SQLite ordinaire convertit '5' en 5 mais peut conserver 'abc' comme texte sans erreur.
ALTER TABLE
L’instruction ALTER TABLE modifie la définition d’une table existante, notamment ses colonnes ou ses contraintes, tout en conservant ses lignes.
Ajouter un champ de téléphone modifie la structure avec ALTER TABLE ; remplir ensuite les numéros utilise UPDATE.
Atomicité
L’atomicité est la propriété du tout ou rien qui permet de conserver ou d’annuler les modifications liées d’une transaction comme une seule opération.
Un transfert effectué doit conserver les deux modifications de solde ; ne conserver que le retrait compromettrait l’opération.
AUTOINCREMENT
Le mot-clé SQLite AUTOINCREMENT empêche une clé primaire entière générée de réutiliser les numéros attribués à des lignes validées, au prix d’un travail supplémentaire.
Après les identifiants validés 1, 2 et 3, supprimer 3 conduit tout de même à un identifiant suivant égal à 4 avec AUTOINCREMENT.

C

CHECK
Une contrainte CHECK teste une condition sur une ligne et rejette un résultat faux ; un résultat inconnu dû à NULL est accepté.
CHECK (price > 0) rejette un prix négatif mais nécessite aussi NOT NULL lorsqu’un prix doit être fourni.
Clé composite
Une clé composite identifie une ligne par la combinaison de valeurs de plusieurs colonnes, sans exiger que chaque colonne soit unique à elle seule.
La paire formée par l’identifiant de commande et l’identifiant de produit identifie une ligne de commande tout en autorisant les deux valeurs dans d’autres paires.
Clé de substitution
Une clé de substitution est un identifiant artificiel sans signification descriptive, souvent généré pour que les informations du monde réel puissent changer indépendamment.
L’identifiant généré d’un client reste identique après un changement d’adresse e-mail, ce qui préserve les références des commandes.
Clé étrangère
Une clé étrangère exige que les valeurs enfants non manquantes correspondent à une clé primaire ou unique parente référencée lorsque le contrôle est activé.
Une commande portant l’identifiant client 99 échoue lorsqu’aucun client 99 n’existe et que l’association avec le client est contrôlée.
Clé naturelle
Une clé naturelle est une valeur du monde réel qui identifie déjà un enregistrement et sert de clé à la place d’un numéro artificiel.
L’ISBN d’un livre peut identifier son édition, tandis qu’un identifiant interne de livre généré serait une clé de substitution.
Clé primaire
Une clé primaire est une colonne ou une combinaison de colonnes qui identifie chaque ligne de manière unique et dont la valeur doit être présente.
Un identifiant client permet à une mise à jour de cibler un client même lorsque plusieurs clients ont le même nom.
Colonne d’identité
Une colonne d’identité génère des valeurs à partir d’une séquence dans PostgreSQL lorsqu’une insertion demande une valeur générée pour cette colonne.
INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY fournit de nouveaux identifiants sans numéro saisi manuellement à chaque insertion.
COMMIT
La commande COMMIT termine une transaction en rendant permanentes ses modifications en attente ; une annulation ultérieure ne peut plus défaire ce travail.
Après l’examen des deux soldes du transfert, la validation conserve le retrait et le dépôt comme un transfert effectué.
Condition WHERE
Une condition WHERE teste chaque ligne pour la choisir dans une requête ou une écriture ; seules les lignes pour lesquelles la condition est vraie sont sélectionnées.
Une mise à jour filtrée par la clé primaire du produit atteint une ligne au maximum, même si des noms de produits se répètent.
Contrainte
Une contrainte est une règle déclarée dans la base de données qui vérifie les données insérées ou mises à jour et rejette une modification qui l’enfreindrait.
Une vérification du prix d’un produit rejette un montant négatif quelle que soit l’application qui transmet l’écriture.
Contrainte nommée
Une contrainte nommée possède un identifiant choisi qui aide à repérer la règle dans les messages d’erreur et à la désigner lors de modifications ultérieures de structure.
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
Le contrôle des clés étrangères est la vérification active par la base de données des références et des actions déclarées lors de l’insertion, de la modification ou de la suppression de lignes liées.
SQLite nécessite PRAGMA foreign_keys = ON; sur la connexion avant une transaction pour vérifier les liens déclarés.
CREATE TABLE
L’instruction CREATE TABLE crée une nouvelle table avec des colonnes nommées, des types déclarés et des règles facultatives, initialement sans lignes.
CREATE TABLE labels (id INTEGER PRIMARY KEY, name TEXT); prépare une table avant l’insertion de libellés.
CREATE TABLE AS
L’instruction CREATE TABLE AS crée une table à partir des résultats d’une requête, en copiant les données sélectionnées sans les contraintes de la source dans SQLite et PostgreSQL.
Une copie 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
Une date ISO écrite sous la forme YYYY-MM-DD place l’année en premier, ce qui permet de trier chronologiquement des dates textuelles de format cohérent.
Les dates textuelles SQLite comme '2026-03-15' se trient par année, mois et jour lorsqu’elles utilisent toutes le même format.
DEFAULT
Un DEFAULT fournit une valeur lorsqu’une insertion omet une colonne ; il ne remplace pas une valeur manquante fournie explicitement.
Omettre une colonne de stock avec DEFAULT 0 donne zéro, tandis que fournir explicitement NULL laisse la valeur manquante.
DELETE
L’instruction DELETE supprime les lignes entières sélectionnées par une condition, ou toutes les lignes si aucune condition n’est fournie, tout en conservant la table.
Supprimer les anciennes commandes annulées laisse les autres commandes en place et conserve la table pour de futures insertions.
Dépendance
Une dépendance existe lorsqu’un objet de base de données repose sur la définition d’un autre objet, ce qui peut bloquer la suppression ou la modification de cet autre objet.
Une clé étrangère des commandes dépend des clients : supprimer d’abord les clients peut donc échouer tant que le lien existe.
DROP CASCADE
DROP CASCADE dans PostgreSQL supprime les objets dépendants avec l’objet nommé, notamment les clés étrangères qui le référencent et les vues dépendantes.
Supprimer les clients avec CASCADE peut laisser les commandes stockées tout en retirant la clé étrangère qui les reliait aux clients.
DROP COLUMN
L’opération DROP COLUMN retire d’une table une colonne et les valeurs qu’elle contient ; des règles ou objets dépendants peuvent la bloquer.
Supprimer un champ de téléphone mobile retire toutes les valeurs qu’il contient tout en laissant intacts les autres champs des clients.
DROP TABLE
L’instruction DROP TABLE supprime de la base de données une table ainsi que toutes ses lignes et ses propres contraintes, index et déclencheurs.
Après la suppression de la table d’archives, toute insertion dans celle-ci échoue tant qu’une table de ce nom n’a pas été recréée.

É

Échelle
L’échelle d’un type décimal est le nombre de chiffres après la virgule ; PostgreSQL arrondit les valeurs stockées à cette échelle.
Une colonne PostgreSQL NUMERIC(8, 2) stocke 12,345 sous la forme 12,35, car l’échelle déclarée est de deux.

E

excluded
Le nom excluded désigne la ligne proposée à l’insertion lors d’une mise à jour sur conflit dans PostgreSQL ou SQLite et rend ainsi disponibles ses valeurs entrantes.
Pour une livraison, stock.qty + excluded.qty ajoute la quantité entrante proposée à la quantité déjà stockée.

I

Identifiant
Un identifiant est le nom d’un objet de base de données, comme une table ou une colonne ; les guillemets doubles permettent d’y utiliser des espaces ou des mots réservés.
L’identifiant de colonne "order date" nécessite des guillemets, tandis que order_date évite les espaces et est plus facile à réutiliser.
IF EXISTS
La clause IF EXISTS évite une erreur d’absence dans une instruction de suppression, tout en supprimant l’objet nommé lorsqu’il existe.
DROP TABLE IF EXISTS archived_orders; réussit lorsque la table est absente et la supprime lorsqu’elle est présente.
IN
Le test IN vérifie si une valeur correspond à un membre d’une liste, notamment une liste de clés renvoyée par une requête SELECT imbriquée.
Les commandes de plusieurs clients californiens peuvent être sélectionnées à l’aide des identifiants clients renvoyés par une sous-requête.
INSERT
L’instruction INSERT ajoute des lignes à une table existante à l’aide de groupes de valeurs littérales ou de résultats de requête qui doivent respecter les règles de la destination.
Une boutique insère un nouveau produit avec son code SKU, son nom et son prix tout en laissant la base de données générer son identifiant.
INSERT SELECT
Une instruction INSERT SELECT copie les lignes renvoyées par une requête dans une table existante, en faisant correspondre les colonnes sélectionnées aux colonnes cibles selon leur ordre.
La boutique prévisualise les commandes antérieures à 2026, puis copie les enregistrements renvoyés dans sa table d’archives déjà définie.
Insertion multiligne
Une insertion multiligne fournit plusieurs groupes de valeurs entre parenthèses dans une seule instruction, vérifiée dans son ensemble avec la gestion ordinaire des contraintes.
Trois lignes de clients peuvent être ajoutées en une instruction ; un échec ordinaire de contrainte dans l’une rejette les trois.
INTEGER
Le type INTEGER représente des nombres entiers : il convient donc aux dénombrements et aux montants exacts stockés en centimes entiers.
Un montant exact de 19,99 dans SQLite peut être stocké sous la forme 1 999 dans une colonne de centimes entiers pour les calculs ultérieurs.
IS NULL
Le test IS NULL sélectionne directement les valeurs manquantes, contrairement à une égalité ordinaire avec NULL, qui n’est jamais vraie pour une valeur manquante.
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
Le langage de définition de données, ou LDD, est la famille d’instructions SQL qui crée, modifie et supprime la structure d’une base 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
Le langage de manipulation de données, ou LMD, est la famille d’instructions SQL qui ajoute, modifie et supprime des lignes dans les tables existantes.
Ajouter une commande utilise INSERT ; corriger son statut utilise UPDATE ; supprimer sa ligne utilise DELETE.
Liste de colonnes
La liste de colonnes d’une insertion nomme explicitement les champs de destination et détermine leur correspondance avec les valeurs fournies selon leur ordre.
La liste (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
Un littéral de chaîne est un texte écrit comme valeur en SQL entre apostrophes, les apostrophes internes étant doublées pour rester dans le texte.
Le littéral SQL '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
Le nombre de lignes affectées indique combien de lignes une instruction a mises à jour ; SQLite et PostgreSQL incluent les lignes correspondantes auxquelles leurs valeurs actuelles ont été attribuées.
Une mise à jour qui attribue à trois indicateurs actifs existants leurs valeurs inchangées peut tout de même indiquer trois lignes mises à jour.
NOT NULL
Une contrainte NOT NULL exige que la valeur d’une colonne soit présente dans chaque ligne, tout en acceptant la chaîne vide dans SQLite et PostgreSQL.
Un nom de produit obligatoire omis lors d’une insertion provoque un échec lorsqu’il n’a ni valeur par défaut ni valeur fournie.
NULL
NULL est le marqueur SQL d’une valeur manquante ou inconnue, distinct à la fois du zéro numérique et d’une chaîne de texte vide.
Un champ de téléphone facultatif utilise NULL lorsqu’aucun numéro n’est connu ; IS NULL trouve ces clients.

O

ON DELETE CASCADE
L’action ON DELETE CASCADE supprime automatiquement les lignes enfants qui référencent une ligne parente lorsque celle-ci est supprimée, sous le contrôle d’une clé étrangère.
Avec une cascade, supprimer la cliente Ana retire ses commandes 101 et 102, tandis que le client Ben et sa commande 103 restent présents.
ON DELETE SET NULL
L’action ON DELETE SET NULL conserve les lignes enfants après la suppression d’une ligne parente mais efface leurs liens, ce qui exige des colonnes de référence acceptant les valeurs manquantes.
Lorsqu’un fournisseur est supprimé, les produits peuvent rester avec des identifiants de fournisseur manquants si ce lien est facultatif.

P

Point de sauvegarde
Un point de sauvegarde est un point intermédiaire nommé dans une transaction qui permet d’annuler le travail ultérieur tout en conservant les modifications antérieures en attente.
Placer un point de sauvegarde après la première mise à jour permet d’annuler la seconde sans perdre la première.
Précision d’un type NUMERIC
La précision d’un type NUMERIC est le nombre total déclaré de chiffres décimaux, y compris ceux avant et après la virgule.
Dans PostgreSQL, NUMERIC(8, 2) autorise six chiffres avant la virgule et deux après, jusqu’à 999 999,99.
Priorité des opérateurs
La priorité des opérateurs détermine quelles parties d’une expression sont regroupées en premier ; SQL évalue AND avant OR, sauf si des parenthèses changent cet ordre.
Regrouper deux statuts entre parenthèses permet d’appliquer une même limite de date aux deux branches de la condition.

R

Reconstruction de table
Une reconstruction de table crée une définition de remplacement, copie les données existantes, remplace l’ancienne table et restaure les objets dépendants.
SQLite peut recevoir une nouvelle vérification sur une colonne existante grâce à une transaction qui reconstruit la table et vérifie les lignes copiées.
RELEASE
La commande RELEASE supprime un point de sauvegarde sans annuler les modifications ultérieures ni valider indépendamment la transaction englobante.
Après la libération d’un point de sauvegarde dans BEGIN, une annulation complète peut encore défaire le travail en attente de la transaction.
RETURNING
Une clause RETURNING permet à une écriture de renvoyer des valeurs choisies parmi les lignes affectées, notamment les identifiants générés dans PostgreSQL et les versions récentes de SQLite.
Une insertion de commande peut renvoyer son nouvel identifiant pour que l’insertion suivante relie les lignes de commande à la commande réelle.
ROLLBACK
La commande ROLLBACK annule les modifications en attente de la transaction en cours et la termine, sans annuler les transactions précédemment validées.
Une suppression non validée qui vide la table des commandes peut être annulée pour restaurer ses lignes d’origine.
ROLLBACK TO
La commande ROLLBACK TO annule les modifications effectuées après un point de sauvegarde nommé et laisse la transaction englobante ouverte pour d’autres opérations ou une décision finale.
Revenir au point de sauvegarde after_first, créé entre deux augmentations de solde, annule la seconde augmentation mais laisse la première en attente.
ROUND
La fonction ROUND demande un arrondi à un nombre choisi de décimales, ce qui est utile lorsque le stockage n’impose pas d’échelle décimale.
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
Une sous-requête est un SELECT imbriqué dans une autre instruction, qui fournit des valeurs ou des lignes utilisables par l’instruction englobante.
Une suppression peut utiliser order_id IN (SELECT id FROM orders WHERE status = 'cancelled') pour choisir les lignes de commande liées.
Suppression logique
Une suppression logique marque une ligne stockée comme supprimée à l’aide d’une valeur telle qu’un horodatage de suppression ; les requêtes sur les lignes actives doivent alors l’exclure.
Définir deleted_at pour un client conserve sa ligne : les requêtes sur les clients actifs ajoutent donc deleted_at IS NULL.

T

Table enfant
Une table enfant contient une clé étrangère qui pointe vers une table parente et relie ses lignes à des enregistrements référencés existants.
La table des commandes est une table enfant de celle des clients, tandis que les lignes de commande peuvent elles-mêmes être enfants des commandes.
Table intermédiaire
Une table intermédiaire contient temporairement des données importées afin qu’elles puissent être examinées et nettoyées avant leur copie vers leur destination finale soumise à des contraintes.
Les chaînes d’adresses e-mail importées, vides ou composées d’espaces, peuvent devenir NULL grâce à NULLIF(TRIM(email), '') pendant la requête de copie.
Table parente
Une table parente contient la clé référencée dans une association par clé étrangère : ses lignes correspondantes doivent donc exister avant les lignes enfants dépendantes.
La table des clients est la table parente lorsque l’identifiant client de chaque commande référence la clé primaire du client.
Transaction
Une transaction regroupe des instructions en une unité de travail dont les modifications en attente peuvent être conservées ensemble avec COMMIT ou annulées avec ROLLBACK.
Un transfert place son retrait et son dépôt dans une même transaction afin qu’un transfert incomplet puisse être annulé.
Transaction en échec
Une transaction en échec dans PostgreSQL suit une erreur d’instruction et refuse les commandes ordinaires jusqu’à son annulation ou son rétablissement à un point de sauvegarde antérieur.
Après le rejet d’une mise à jour de solde, un autre SELECT est refusé tant que la transaction reste en échec.
TRUNCATE
L’instruction TRUNCATE vide une table entière sans filtre WHERE dans les bases de données qui la prennent en charge ; SQLite ne la propose pas.
Une table PostgreSQL peut être vidée avec TRUNCATE TABLE, mais ses règles de dépendance et de transaction comptent toujours.
Type de données
Un type de données décrit le genre de valeurs stockées par une colonne et contribue à déterminer leur comparaison, leur tri et leur comportement dans les calculs.
Une quantité utilise un type numérique pour calculer des totaux, tandis qu’un code postal américain utilise du texte pour conserver ses zéros initiaux.

U

UNIQUE
Une contrainte UNIQUE empêche la répétition de valeurs ou de combinaisons de valeurs non manquantes ; le comportement pour les valeurs manquantes dépend de la base de données.
UNIQUE (order_id, product_id) autorise le même produit dans différentes commandes mais rejette une paire répétée.
UPDATE
L’instruction UPDATE attribue de nouvelles valeurs aux colonnes de lignes existantes et choisit ses lignes cibles au moyen d’une condition WHERE facultative.
UPDATE products SET price = 22.50 WHERE id = 3; modifie un produit sans insérer une nouvelle ligne de produit.
Upsert
Un upsert essaie d’insérer une ligne et peut mettre à jour une ligne existante lorsqu’une clé ou une valeur unique entre en conflit avec les nouvelles données proposées.
Une importation de stock peut ajouter un nouveau code SKU ou mettre à jour sa quantité avec ON CONFLICT (sku) DO UPDATE s’il existe.

V

Validation automatique
La validation automatique valide chaque instruction autonome réussie comme une transaction distincte, sauf si la session a ouvert une transaction explicite.
Avec la validation automatique, deux mises à jour de solde peuvent devenir permanentes séparément, laissant une opération incomplète si le processus s’arrête.
Validation implicite
Une validation implicite rend permanentes les modifications en attente comme effet automatique d’une autre instruction, par exemple une instruction ordinaire du LDD sur une table permanente dans MySQL.
Une création de table dans MySQL peut valider une mise à jour antérieure, qu’une annulation ultérieure ne pourra donc pas défaire.
Virgule flottante
La virgule flottante représente les nombres par des approximations binaires, ce qui permet de traiter efficacement des mesures mais peut produire de petites erreurs d’arrondi décimal.
SQLite peut évaluer 0.1 + 0.2 = 0.3 comme faux parce que ses littéraux décimaux utilisent un stockage approximatif.

À propos de cette unité

Par StudeliSignaler une erreur

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.

Commencer