Aller au contenu

Un mot pour Fahmio

Tu écris. Tu continues.

Un problème, une idée — assez pour qu’on comprenne, puis tu retournes à ta copie.

On lit. Tu n’as rien d’autre à faire.

Où veux-tu aller ?

↑ ↓ pour parcourir · Entrée pour ouvrir · Échap pour fermer

Fahmio
Fahmio
Bac Tunisie
BD-CBases de données et SQL

CREATE TABLE et ALTER — contraintes d’une bibliothèque

Idée directrice

Écriture de commandes SQL LDD : CREATE TABLE avec clé primaire / clé étrangère, puis ALTER TABLE pour ajouter une colonne. Transposition textuelle du devoir bibliothèque i-s1-04 (sans recopier le barème).

Ce qui aide à reconnaître la démarche

« Créer les tables »

« Ajouter la colonne »

« en maintenant les intégrités référentielles »

Besoin d’un point de départ ? Voir la méthode
  • CREATE TABLE : colonnes + types + PRIMARY KEY + FOREIGN KEY … REFERENCES.
  • ALTER TABLE … ADD pour une colonne nouvelle ; DROP/MODIFY selon le dialecte du sujet.
  • Toujours créer d’abord les tables mères (EDITEURS, LECTEURS) avant les filles.
Les pièges à vérifier dans ta démarche
  • Créer PRET avant LIVRES (échec de la FK).
  • Oublier NOT NULL sur une colonne « obligatoire » du cahier des charges.
  • Mettre la FK dans EDITEURS au lieu de LIVRES.
Sujet principal

Exercice — dans l'esprit des sujets du bac

3 questionsCorrigé masqué

On reprend le schéma : LIVRES (NumLV, Titre, NomAuteur, ValeurLV, NumED#) et PRET (NumLV#, NumLE#, DateP, DateRet), avec EDITEURS et LECTEURS déjà créées.

  1. Écrire la commande SQL CREATE TABLE de LIVRES en imposant : NumLV clé primaire numérique, Titre chaîne obligatoire, NumED clé étrangère vers EDITEURS(NumED).
  2. Écrire le CREATE TABLE de PRET en maintenant les intégrités référentielles vers LIVRES et LECTEURS.
  3. Écrire l’ALTER TABLE qui ajoute à LIVRES la colonne NBpage (numérique, 3 chiffres, obligatoire).
Voir la correction commentéeAprès avoir posé votre démarche
1.
CREATE TABLE LIVRES (
  NumLV NUMERIC(6) PRIMARY KEY,
  Titre VARCHAR(25) NOT NULL,
  NomAuteur VARCHAR(25),
  ValeurLV NUMERIC(6,3),
  NumED NUMERIC(6),
  CONSTRAINT fk_liv_ed FOREIGN KEY (NumED) REFERENCES EDITEURS(NumED)
);
2.
CREATE TABLE PRET (
  NumLV NUMERIC(6),
  NumLE NUMERIC(6),
  DateP DATE,
  DateRet DATE,
  PRIMARY KEY (NumLV, NumLE, DateP),
  FOREIGN KEY (NumLV) REFERENCES LIVRES(NumLV),
  FOREIGN KEY (NumLE) REFERENCES LECTEURS(NumLE)
);

La clé primaire retenue est (NumLV, NumLE, DateP) : deux prêts du même livre au même lecteur ne peuvent se distinguer que par leur date.
3.
ALTER TABLE LIVRES ADD NBpage NUMERIC(3) NOT NULL;

CREATE + FK + ALTER ADD\boxed{\text{CREATE + FK + ALTER ADD}}

Changer d’énoncé, garder le raisonnement

Choisis un seul transfert après le sujet principal. Qu’est-ce qui change ? Quel résultat ou quelle méthode peux-tu réutiliser ? Les autres exercices restent disponibles pour une prochaine séance.

Exercices d'entraînement — une nuance à la fois

1 Drill BD-C.1 — CREATE patient / ordonnance
Entraînement 01 / 07

Drill BD-C.1 — CREATE patient / ordonnance

3 questionsCorrigé masqué

Tables d’un cabinet : patient (numero PK, Nom, …) et ordonnance (code PK, numero# → patient, Matricule# → medecin, …).

  1. Écrire le CREATE TABLE de patient avec numero entier en clé primaire.
  2. Écrire le CREATE TABLE d’ordonnance avec les deux clés étrangères.
  3. Écrire l’ALTER qui ajoute adresse (chaîne) à patient.
Voir la correction commentéeAprès avoir posé votre démarche

1. CREATE TABLE patient (numero INT PRIMARY KEY, Nom VARCHAR(30), …);

2. `CREATE TABLE ordonnance (
code VARCHAR(10) PRIMARY KEY,
numero INT,
Matricule VARCHAR(10),
FOREIGN KEY (numero) REFERENCES patient(numero),
FOREIGN KEY (Matricule) REFERENCES medecin(Matricule)
);`

3. ALTER TABLE patient ADD adresse VARCHAR(50); CREATE patient/ordonnance + ALTER\boxed{\text{CREATE patient/ordonnance + ALTER}}

2 Drill BD-C.2 — CREATE Fichiers avec FK type
Entraînement 02 / 07

Drill BD-C.2 — CREATE Fichiers avec FK type

2 questionsCorrigé masqué

Table Types (Type CHAR(1) PK, Designat VARCHAR(25)) déjà créée. Table Fichiers : CodeF PK chaîne 6, TypeF FK vers Types, Taille numérique, Datcreat date obligatoire.

  1. Écrire le CREATE TABLE Fichiers en maintenant l’intégrité référentielle sur le type.
  2. Que se passe-t-il si l’on insère un fichier avec TypeF = 'X' alors que 'X' est absent de Types ?
Voir la correction commentéeAprès avoir posé votre démarche
1.
CREATE TABLE Fichiers (
  CodeF VARCHAR(6) PRIMARY KEY,
  NomF VARCHAR(25),
  Extension CHAR(4),
  TypeF CHAR(1),
  Taille NUMERIC(4,2),
  Datcreat DATE NOT NULL,
  FOREIGN KEY (TypeF) REFERENCES Types(Type)
);

2. L’insertion est rejetée : violation de l’intégrité référentielle (FK vers une clé primaire inexistante). FK TypeF \toTypes ; insert orphelin refuseˊ\boxed{\text{FK TypeF \to Types ; insert orphelin refusé}}

3 Drill BD-C.3 — clé primaire composée de trois champs : CONSTRAINT … PRIMARY KEY et deux clés étrangères
Entraînement 03 / 07

Drill BD-C.3 — clé primaire composée de trois champs : CONSTRAINT … PRIMARY KEY et deux clés étrangères

3 questionsCorrigé masqué

Un lycée enregistre les notes de ses élèves dans une base où les tables Eleve ( numInsc , nomEl , classe ) et Matiere ( codeMat , libMat , coef ) sont déjà créées. On veut créer la table Note ( numInsc# , codeMat# , trimestre , valeur ) à partir de la description suivante :

ColonneTypeTailleContraintes
numInscEntierClé primaire, clé étrangère (Eleve)
codeMatTexte4Clé primaire, clé étrangère (Matiere)
trimestreEntierClé primaire
valeurDécimal(4,2)Non nul
  1. Écrire la requête SQL permettant de créer la table Note, en nommant pkNote la contrainte de clé primaire.
  2. Expliquer pourquoi le couple (numInsc, codeMat) ne suffirait pas comme clé primaire.
  3. L'élève 1203 et la matière « MATH » existent. On exécute dans l'ordre les trois requêtes ci-dessous : lesquelles sont acceptées ?
INSERT INTO Note
VALUES (1203, 'MATH', 2, 14.50);
INSERT INTO Note
VALUES (1203, 'MATH', 2, 16.00);
INSERT INTO Note
VALUES (1203, 'MATH', 3, 16.00);
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : une clé de plusieurs colonnes se déclare en fin de table par CONSTRAINT … PRIMARY KEY (…) ; chaque clé étrangère référence la clé primaire de sa table mère.

CREATE TABLE Note (
  numInsc INT,
  codeMat CHAR(4),
  trimestre INT,
  valeur DECIMAL(4,2) NOT NULL,
  CONSTRAINT pkNote
    PRIMARY KEY (numInsc, codeMat, trimestre),
  CONSTRAINT fkEleve FOREIGN KEY (numInsc)
    REFERENCES Eleve (numInsc),
  CONSTRAINT fkMat FOREIGN KEY (codeMat)
    REFERENCES Matiere (codeMat)
);

2. Un élève a une note par matière et par trimestre : le couple (1203, « MATH ») revient trois fois dans l'année, il ne peut donc pas identifier une note. Le trimestre complète la clé.

3. La première est acceptée ; la deuxième est refusée, car le triplet (1203, « MATH », 2) existe déjà (intégrité de table) ; la troisième est acceptée, le trimestre 3 formant un triplet nouveau.

4 Drill BD-C.4 — contraintes de domaine : liste IN, BETWEEN et comparaison de deux colonnes
Entraînement 04 / 07

Drill BD-C.4 — contraintes de domaine : liste IN, BETWEEN et comparaison de deux colonnes

3 questionsCorrigé masqué

Un lycée technique suit les stages d'été de ses élèves dans la table Stage ( numStage , entreprise , dateDebut , dateFin , nbHeures , mention ), décrite ainsi :

ColonneTypeContrainte
numStageEntierClé primaire
entrepriseTexte (40)Non vide
dateDebutDateNon vide
dateFinDateNon vide ; strictement postérieure à dateDebut
nbHeuresEntierEntre 60 et 240 heures
mentionTexte (10)« Passable », « Bien » ou « Très bien »
  1. Écrire la requête SQL permettant de créer la table Stage, en nommant ckHeures, ckMention et ckDates les trois contraintes de domaine.
  2. La table ayant été créée sans la contrainte ckDates, écrire la requête permettant de l'ajouter.
  3. Dire si chacune des deux lignes suivantes serait acceptée par la table complète, et justifier.
numStageentreprisedateDebutdateFinnbHeuresmention
1ElecSud2025-07-012025-07-31240Bien
2Nour Textile2025-07-142025-07-1460Passable
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : une contrainte qui ne porte que sur une colonne s'écrit avec IN ou BETWEEN ; une contrainte qui compare deux colonnes se déclare au niveau de la table.

CREATE TABLE Stage (
  numStage INT PRIMARY KEY,
  entreprise VARCHAR(40) NOT NULL,
  dateDebut DATE NOT NULL,
  dateFin DATE NOT NULL,
  nbHeures INT,
  mention VARCHAR(10),
  CONSTRAINT ckHeures
    CHECK (nbHeures BETWEEN 60 AND 240),
  CONSTRAINT ckMention
    CHECK (mention IN ('Passable', 'Bien',
                       'Très bien')),
  CONSTRAINT ckDates
    CHECK (dateDebut < dateFin)
);

2. Idée : une contrainte ajoutée à une table existante passe par ALTER TABLE … ADD CONSTRAINT.

ALTER TABLE Stage
ADD CONSTRAINT ckDates
CHECK (dateDebut < dateFin);

3. Ligne 1 acceptée : 240 est une borne de BETWEEN 60 AND 240, donc autorisée. Ligne 2 refusée par ckDates : les deux dates sont égales, or dateDebut < dateFin est une inégalité stricte.

5 Drill BD-C.5 — lever une contrainte de domaine nommée puis la redéfinir pour admettre une valeur nouvelle
Entraînement 05 / 07

Drill BD-C.5 — lever une contrainte de domaine nommée puis la redéfinir pour admettre une valeur nouvelle

2 questionsCorrigé masqué

Le club Forme et Santé de Hammamet gère ses activités avec les tables Activite ( codeAct , libAct , tarifMensuel ) et Seance ( numSeance , dateSeance , salle , codeAct# ). La table Activite a été créée avec une contrainte de domaine nommée ckLib, qui limite libAct aux valeurs « Musculation », « Cardio » et « Yoga ». Extraits :

codeActlibActtarifMensuel
A1Musculation35.000
A2Cardio30.000
A3Yoga40.000
numSeancedateSeancesallecodeAct
12025-10-06BassinA2
22025-10-06Salle 1A1
32025-10-07BassinA3
42025-10-08Salle 2A3

Le club ouvre une piscine : il crée l'activité « A4 », de libellé « Natation », à 45 dinars par mois, et y affecte toutes les séances de la salle « Bassin ».

  1. Écrire les requêtes SQL permettant :
    1. de supprimer la contrainte ckLib ;
    2. d'ajouter à Activite une contrainte nommée ckLib2 acceptant les quatre libellés ;
    3. d'insérer l'activité A4 ;
    4. d'affecter l'activité A4 aux séances de la salle « Bassin ».
  2. Expliquer pourquoi l'insertion c) ne peut être exécutée qu'après a), et la mise à jour d) qu'après c).
Voir la correction commentéeAprès avoir posé votre démarche

1.a Idée : une contrainte nommée se supprime par son nom.

ALTER TABLE Activite
DROP CONSTRAINT ckLib;

1.b

ALTER TABLE Activite
ADD CONSTRAINT ckLib2
CHECK (libAct IN ('Musculation', 'Cardio',
                  'Yoga', 'Natation'));

1.c

INSERT INTO Activite
VALUES ('A4', 'Natation', 45.000);

1.d Les séances 1 et 3 se déroulent dans la salle « Bassin » :

UPDATE Seance SET codeAct = 'A4'
WHERE salle = 'Bassin';

2. Tant que ckLib existe, l'insertion de « Natation » est refusée (intégrité de domaine) ; et tant que A4 n'existe pas dans Activite, la mise à jour de Seance est refusée (intégrité référentielle). Ajouter ckLib2 dès b), avant l'insertion, évite de laisser libAct un moment sans aucun contrôle.

6 Drill BD-C.6 — clé étrangère oubliée, puis nouvelle table de référence reliée par ALTER TABLE
Entraînement 06 / 07

Drill BD-C.6 — clé étrangère oubliée, puis nouvelle table de référence reliée par ALTER TABLE

4 questionsCorrigé masqué

Le parc automobile d'une municipalité est géré avec les tables Service ( codeServ , nomServ ) et Vehicule ( immat , marque , dateMiseCirc , codeServ ). Après leur création, l'administrateur constate qu'il a oublié de déclarer codeServ comme clé étrangère de Vehicule. Extraits :

codeServnomServ
S1Voirie
S2Espaces verts
S3Éclairage public
immatmarquedateMiseCirccodeServ
198 TU 2201Renault2019-04-12S1
203 TU 7735Peugeot2020-09-30S3
  1. Écrire la requête SQL permettant de définir la contrainte d'intégrité référentielle oubliée, nommée fkServ.
  2. Pour suivre la consommation, on ajoute la table Carburant : idCarb (entier, clé primaire) et typeCarb (chaîne de 10 caractères au plus, obligatoire, limitée à « Essence », « Diesel » et « Electrique »). Écrire la requête de création.
  3. Écrire les requêtes permettant d'ajouter à Vehicule le champ idCarb, puis d'en faire une clé étrangère nommée fkCarb vers Carburant.
  4. Une fois fkServ définie, la requête suivante est refusée. Pourquoi ? INSERT INTO Vehicule (immat, marque, codeServ) VALUES ('215 TU 4410', 'Isuzu', 'S7');
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : une clé étrangère ajoutée après coup est une contrainte ajoutée à une table existante : ALTER TABLE … ADD CONSTRAINT … FOREIGN KEY … REFERENCES.

ALTER TABLE Vehicule
ADD CONSTRAINT fkServ
FOREIGN KEY (codeServ)
REFERENCES Service (codeServ);

2.

CREATE TABLE Carburant (
  idCarb INT PRIMARY KEY,
  typeCarb VARCHAR(10) NOT NULL
    CHECK (typeCarb IN ('Essence', 'Diesel',
                        'Electrique'))
);

3. Idée : la colonne doit exister avant de devenir clé étrangère.

ALTER TABLE Vehicule
ADD idCarb INT;
ALTER TABLE Vehicule
ADD CONSTRAINT fkCarb
FOREIGN KEY (idCarb)
REFERENCES Carburant (idCarb);

4. Le service « S7 » n'existe pas dans la table Service : la clé étrangère fkServ refuse une valeur absente de la table mère (intégrité référentielle).

7 Drill BD-C.7 — modifier la structure : DROP d'un champ, MODIFY (taille, valeur par défaut), RENAME COLUMN
Entraînement 07 / 07

Drill BD-C.7 — modifier la structure : DROP d'un champ, MODIFY (taille, valeur par défaut), RENAME COLUMN

8 questionsCorrigé masqué

Une association culturelle de Testour enregistre ses spectacles dans la table Evenement, créée par la requête suivante :

CREATE TABLE Evenement (
  idEv INT PRIMARY KEY,
  titre VARCHAR(40) NOT NULL,
  lieu VARCHAR(30),
  nbPlaces INT,
  prix DECIMAL(6,3)
);

Pour chacun des besoins suivants, mettre une croix devant la requête correcte (une seule par besoin) ; les requêtes retenues sont exécutées dans l'ordre a, b, c, d.

  • a. Supprimer le champ « lieu ». ☐ ALTER TABLE Evenement DELETE lieu; ☐ ALTER TABLE Evenement DROP lieu; ☐ DELETE lieu FROM Evenement;
  • b. Porter la taille du champ « titre » de 40 à 80 caractères. ☐ ALTER TABLE Evenement MODIFY titre VARCHAR(80) NOT NULL; ☐ UPDATE Evenement SET titre = VARCHAR(80); ☐ ALTER TABLE Evenement ADD titre VARCHAR(80) NOT NULL;
  • c. Renommer le champ « prix » en « tarif ». ☐ UPDATE Evenement SET prix = tarif; ☐ ALTER TABLE Evenement MODIFY prix tarif; ☐ ALTER TABLE Evenement RENAME COLUMN prix TO tarif;
  • d. Donner la valeur par défaut 100 au champ « nbPlaces ». ☐ UPDATE Evenement SET nbPlaces = DEFAULT 100; ☐ ALTER TABLE Evenement MODIFY nbPlaces INT DEFAULT 100; ☐ ALTER TABLE Evenement ADD DEFAULT 100;
  1. Répondre aux besoins a à d.
  2. Écrire la requête permettant ensuite d'ajouter le champ organisateur, chaîne de 30 caractères.
  3. Donner la liste des champs de la table Evenement après ces cinq modifications.
  4. Que contient le champ nbPlaces de la ligne enregistrée par la requête suivante ? INSERT INTO Evenement (idEv, titre, tarif) VALUES (12, 'Nuit du malouf', 15.000);
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : la structure se modifie toujours par ALTER TABLE ; UPDATE et DELETE agissent sur les lignes.

  • a. ALTER TABLE Evenement DROP lieu;
  • b. ALTER TABLE Evenement MODIFY titre VARCHAR(80) NOT NULL;
  • c. ALTER TABLE Evenement RENAME COLUMN prix TO tarif;
  • d. ALTER TABLE Evenement MODIFY nbPlaces INT DEFAULT 100;

MODIFY redéfinit la colonne entière : en b, NOT NULL est répété, sinon titre deviendrait facultatif ; en d, le type INT est répété et la valeur par défaut s'y ajoute.

2.

ALTER TABLE Evenement
ADD organisateur VARCHAR(30);

3. idEv, titre, nbPlaces, tarif, organisateur : lieu a été supprimé, prix renommé en tarif, organisateur ajouté en dernière position.

4. nbPlaces n'est pas fourni : il prend sa valeur par défaut, 100\boxed{100} ; organisateur, omis et sans valeur par défaut, reste vide (NULL).

Relier ce raisonnement au bac

Choisis une filière pour voir les sujets qui étayent ce scénario.