Bases de données
ING 1
MySQL – Cours et TP 05
Création des tables et des tuples
SOMMAIRE
SOMMAIRE 1
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 1/23 - Bertrand LIAUDET
Présentation 21
Exercice 1 : charger les tables de la base de données 21
Exercice 2 : modification et création de la BD 22
Exercice 3 : création de la BD via un SELECT et des ALTER 23
Exercice 4 : passage de InnoDB à MyISAM et retour en InnoDB 23
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 2/23 - Bertrand LIAUDET
SQL : CREATION DE LA BASE DE DONNEES.
LES TABLES : LE DDL
PRINCIPALES NOTIONS
CREATE TABLE INSERT INTO
ALTER TABLE UPDATE
DROP TABLE DELETE FROM
Contraintes d’intégrité non référentielles Moteur MyISAM
Contraintes d’intégrité référentielle Moteur InnoDB
Show create table
0. Présentation
Les trois opérations fondamentales de « création » au sens large de la base de données sont :
la création, la modification et la suppression
Ces opérations correspondent au sigle : CMS
La CMS s’applique aux tables, aux tuples mais aussi aux utilisateurs.
Une fois le modèle des données réalisé, il reste à créer la base de données. Créer d’abord les
tables, puis les tuples.
Syntaxe MySQL
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 3/23 - Bertrand LIAUDET
En première approche, la commande a la syntaxe suivante :
Exemple
Les types
http://dev.mysql.com/doc/refman/5.0/fr/column-types.html
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 4/23 - Bertrand LIAUDET
enum : permet de proposer une liste de valeurs pour l’attribut. Remarque : les valeurs
proposées seront les seules possibles. L’enum se comporte donc comme un « check ».
Exemples de code
Exemple 1
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 5/23 - Bertrand LIAUDET
use empdept;
Remarques
Insert into : on peut faire un insert into par tuple (c’est le cas des employés) ou faire un insert
into pour tous les tuples (c’est le cas des départements).
Variante de l’exemple 1
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 6/23 - Bertrand LIAUDET
ND integer not null,
NEchef integer,
primary key(NE)
) ENGINE InnoDB;
ALTER TABLE EMP ADD constraint KEYND foreign key(ND) references DEPT(ND);
ALTER TABLE EMP ADD constraint KEYNECHEF foreign key(NEchef) references EMP(NE);
Remarques
JOB enum
Check : pas géré par MySQL
Defautl : Comm default 100
Les foreign key gérées en altération. De ce fait, on peut créer les tables dans n’importe quel
ordre.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 7/23 - Bertrand LIAUDET
2 Contrainte d’intégrité référentielle : CIR
Une CIR concerne deux attributs (et donc en général deux tables) :
• Une CIR concerne un attribut maître (attribut qui porte la CIF : la clé étrangère)
• Une CIR concerne un attribut joint (attribut auquel la CIF fait référence : la clé primaire).
Suppression d’une table jointe (dont la clé primaire est référencée par d’autres tables)
La table maître doit être supprimée avant la table jointe.
Exemple : il faut supprimer la table des employés avant celle des départements car la table
aucune table ne fait référence à la table des employés tandis que la table des départements est
référencée par la table des employés.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 8/23 - Bertrand LIAUDET
Suppression d’un tuple joint (dont la clé primaire est référencée par d’autres tuples)
Un tuple joint ne peut pas être supprimé.
En cas de tentative d’une telle suppression, 3 cas peuvent se présenter :
• Soit on interdit la suppression du tuple joint. Il faudra alors commencer par détruire le ou
les tuples maîtres correspondant pour pouvoir supprimer le tuple joint. C’est la situation
par défaut.
• Soit le système supprime le tuple joint et les tuples maître correspondant : ainsi il n’y a plus
de tuples maître faisant référence au tuple joint.
Dans ce cas on ajoute : ON DELETE CASCADE à la définition de la clé étrangère.
Exemple :
ND integer not null, foreign key(ND) references DEPT(ND) on delete cascade
Dans notre exemple, cela signifie que si on supprime un département, on supprimera aussi
tous les employés du départements… ce qui n’est certainement pas un bon choix de
modélisation !
• Soit le système supprime le tuple joint et met la clé étrangère correspondante des tuples
maîtres à NULL pour qu’il n’y ait plus de tuples maîtres qui fassent référence au tuple
joint.
Dans ce cas on ajoute : ON DELETE SET NULL à la définition de la clé étrangère.
Exemple :
ND integer not null, foreign key(ND) references DEPT(ND) on delete set NULL
Dans notre exemple, cela signifie que si on supprime un département, les employés du
département auront désormais la valeur NULL comme numéro de département. C’est
possible à condition que le numéro de département de l’employé ne soit pas déclaré NOT
NULL.
Modification d’un tuple joint (dont la clé primaire est référencée par d’autres tuples)
Un tuple joint ne peut pas être modifié.
En cas de tentative d’une telle suppression, 2 cas peuvent se présenter :
• Soit on interdit la modification du tuple joint. Il faudra commencer par modifier le ou les
tuples maîtres correspondant pour pouvoir modifier le tuple joint. C’est la situation par
défaut.
• Soit le système modifie le tuple joint et les tuples maîtres correspondants pour qu’ils
fassent correctement référence au tuple joint.
Dans ce cas on ajoute : ON UPDATE CASCADE à la définition de la clé étrangère.
Exemple:
ND integer not null, foreign key(ND) references DEPT(ND) on update cascade
Dans notre exemple, cela signifie que si on modifie la clé primaire d’un département, on
modifiera aussi les numéros de départements des employés de ce département.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 9/23 - Bertrand LIAUDET
Nommer les contraintes : CONSTRAINT nomContrainte
En SQL standard, on peut nommer toutesles contraintes, ce qui permettra ensuite de désactiver
et de réactiver les contraintes en y faisant références par leur nom.
Pour cela, il suffit d’ajouter « CONSTRAINT nomContrainte » devant la déclaration de la
contrainte.
MySQL ne gère que le nom des CIR.
Syntaxe SQL
Syntaxe générale
FOREIGN KEY(nomAttMaître) [CONSTRAINT nomContrainte] REFERENCES
nomTableJointe(nomAttJoint)
Exemples
CREATE TABLE EMP (
NE integer primary key auto_increment,
…
ND integer not null, foreign key(ND) references DEPT(ND),
NEchef integer , foreign key(NEchef) references EMP(NE)
);
Ou encore :
CREATE TABLE EMP (
NE integer primary key auto_increment,
…
ND integer not null,
NEchef integer ,
constraint KEYND foreign key(ND) references DEPT(ND),
foreign key(NEchef) references EMP(NE)
);
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 10/23 - Bertrand LIAUDET
) ENGINE InnoDB;
ALTER TABLE EMP ADD constraint KEYND foreign key(ND) references DEPT(ND);
ALTER TABLE EMP ADD foreign key(NEchef) references EMP(NE);
Autres possibilités
Selon les SGBD, d’autres possibilités de définition de contraintes d’intégrité seront possibles.
Elles sont à analyser au cas par cas en fonction du SGBD sur lequel on travaille.
Cependant, les plus importantes ont été abordées.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 11/23 - Bertrand LIAUDET
3 Modification des tables
http://dev.mysql.com/doc/refman/5.0/fr/alter-table.html
Attention
La modification et la suppression des attributs doivent être manipulées avec prudence : une table
peut contenir des milliers de données. Il ne faut pas les supprimer ou modifier une table sans
précaution.
Exemple
ALTER TABLE emp
ADD CONSTRAINT keynd FOREIGN KEY(ND) REFERENCES DEPT(ND);
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 12/23 - Bertrand LIAUDET
ALTER TABLE NomTable DROP type de contrainte nom_de_contrainte;
Exemple
ALTER TABLE emp DROP foreign key KEYND;
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 13/23 - Bertrand LIAUDET
5. Récupération du code sous mysql : show create table
| emp |
CREATE TABLE `dept` (
`ND` int(11) NOT NULL auto_increment,
`NOM` varchar(14) default NULL,
`VILLE` varchar(13) default NULL,
PRIMARY KEY (`ND`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=latin1
Remarques
1. le n° du prochain ID automatique sera 41.
2. InnoDB est un choix de SGBD. C’est celui par défaut.
3. Le code est exploitable directement pour créer une table.
| emp |
CREATE TABLE `emp` (
`NE` int(11) NOT NULL auto_increment,
`NOM` varchar(10) default NULL,
`JOB` varchar(9) default NULL,
`DATEMB` date default NULL,
`SAL` float(7,2) default NULL,
`COMM` float(7,2) default NULL,
`ND` int(11) NOT NULL,
`NEchef` int(11) default NULL,
PRIMARY KEY (`NE`),
KEY `ND` (`ND`),
KEY `NEchef` (`NEchef`),
CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`ND`) REFERENCES `dept` (`ND`),
CONSTRAINT `emp_ibfk_2` FOREIGN KEY (`NEchef`) REFERENCES `emp` (`NE`)
) ENGINE=InnoDB AUTO_INCREMENT=7944 DEFAULT CHARSET=latin1
Remarques
1. Le n° du prochain ID automatique sera 7944.
2. Les clés étrangères sont déclarées en plusieurs étapes : avec KEY et avec CONSTRAINT
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 14/23 - Bertrand LIAUDET
3. Le code est exploitable directement pour créer une table.
MyISAM et InnoDB
MySQL propose deux type de moteur pour le SGBD :
• Le moteur MyISAM
• Le moteur InnoDB
Le moteur MyISAM est le moteur par défaut. Il est rapide mais ne gère ni les clés étrangères, ni
les transactions.
Le moteur InnoDB gère les transactions et les clés étrangères.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 15/23 - Bertrand LIAUDET
primary key(ND)
) ENGINE InnoDB;
Passage en MyISAM
ALTER TABLE emp TYPE MyISAM ;
Pour passer en d’InnoDB à MyISAM, il ne doit pas y avoir de clé étrangère. Il faut donc
commencer par supprimer les contraintes nommées de clé étrangère.
Passage en InnoDB
ALTER TABLE emp TYPE InnoDB ;
Le passage de MyISAM a InnoDB est possible directement.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 16/23 - Bertrand LIAUDET
SQL : CREATION DE LA BASE DE DONNEES.
LES TUPLES : LE DML
Une fois les tables créées, il faut créer les tuples, c’est-à-dire les données à proprement parler.
Création de tuples
Syntaxe MySQL
INSERT INTO NomTable (attribut_1, … , attribut_n )
values (valeur_1, … , valeur_n ) ;
Exemple
INSERT INTO departements (ND, nom, ville)
values (10, 'ADMINISTRATION', 'PARIS') ;
ou encore, sans préciser la liste des attributs :
INSERT INTO departements
values (20, 'VENTES', 'PARIS') ;
ou encore, en série :
INSERT INTO departements values
(20, 'VENTES', 'PARIS'),
(10, 'ADMIN', 'PARIS') ; ;
Utilisation de l’auto-incrément
Directement
INSERT INTO departements (nom, ville)
values ('VENTES', 'PARIS');
Dans ce cas, il faut préciser la liste des attributs qu’on veut affecter sans préciser le nom de
l’attribut clé, et ne pas mettre de valeur pour l’attribut clé.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 17/23 - Bertrand LIAUDET
values (NULL, 'VENTES', 'PARIS');
Ou bien
INSERT INTO departements
values ('', 'VENTES', 'PARIS');
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 18/23 - Bertrand LIAUDET
UPDATE NomTable
SET attribut_1 = expression ou ( SELECT …)
WHERE condition ;
Remarque
Le Select dans le Set ne doit pas faire référence à la table de l’update.
Exemple
UPDATE emp
SET salaire = salaire * 1,1
WHERE job = ‘Manager’;
Attention !!!
La suppression des tuples doit être manipulée avec prudence : il est possible de détruire tous les
tuples d'une table en une seule commande.
Il n’y a pas de possibilité de retour en arrière (le ROLLBACK ne sert que dans une
transaction). La seule façon de retrouver des tuples détruits par erreur sera de revenir à la
dernière sauvegarde ce qui risque d’être pénalisant ou de passer par les fichiers de journaux.
4 cas de figure
1. Si la clé primaire est dans le set et que la valeur de la clé primaire existe déjà, alors il y aura
effectivement remplacement des autres attributs (DELETE + INSERT) avec les valeurs
précisées dans le SET. Les attributs non spécifiés dans le SET passent à NULL.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 19/23 - Bertrand LIAUDET
2. Si la clé primaire est dans le set et que la valeur de la clé primaire n’existe pas déjà, alors il y
création d’un nouveau tuple (INSERT) avec les valeurs précisées dans le SET. Les attributs
non spécifiés dans le SET sont à NULL.
3. Si la clé primaire n’est dans le set et qu’il y a un auto-incrément, alors il y création d’un
nouveau tuple (INSERT) avec les valeurs précisées dans le SET. Les attributs non spécifiés
dans le SET sont à NULL.
4. Si la clé primaire n’est dans le set et qu’il n’y a pas d’auto-incrément, alors la commande
génère une erreur.
Syntaxe
La syntaxe du REPLACE est celle de l’UPDATE mais sans clause WHERE.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 20/23 - Bertrand LIAUDET
TP N°5 : CMS DES TUPLES ET DES TABLES
Présentation
L’exercice consiste à écrire des requêtes SQL d’interrogation de la BD.
On utilise la base des employés.
Présentation
On travaillera sur les tables suivantes :
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 21/23 - Bertrand LIAUDET
Exercice 2 : modification et création de la BD
Méthode de travail
Dans un fichier texte à votre nom+TP05, écrire tous les scripts demandés avec l’intitulé des
questions.
Utilisez un fichier de test pour tester individuellement les questions.
Le mieux est de recharger régulièrement une BD propre : le script corrigé de l’exercice 1.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 22/23 - Bertrand LIAUDET
Exercice 3 : création de la BD via un SELECT et des ALTER
Méthode de travail
Continuer à écrire les script dans le fichier de l’exercice précédent.
Les requêtes
11. Recharger une BD propre : le script corrigé de l’exercice 1.
12. Dans une nouvelle BD, la BD « exotest », Créer une table « empcomplet » avec tous les
tuples qui contiennent tous les employés avec toutes les infos sur leurs départements et sur
leur chef.. On n’aura par contre pas d’information sur le département du chef et sur le chef
du chef.
13. Ajouter les contraintes d’intégrité.
14. Le département de DALLAS a été déplacé à SAN FRANCISCO. Faites la mise à jour de la
BD.
15. BLAKE (7698) s’appelle désormais MORTIMER. Changer son nom.
16. Reconstituer les deux tables des employés et des départements.
17. Ajouter les contraintes d’intégrité.
18. Supprimer la table « empcomplet »
Méthode de travail
Continuer à écrire les script dans le fichier de l’exercice précédent.
Les requêtes
19. Recharger une BD propre : le script corrigé de l’exercice 1.
20. Faites passer dynamiquement (via des ALTER TABLE) la BD empdept créée en InnoDB en
MyISAM.
Ecrire le script correspondant à toutes les étapes à franchir.
21. Refaire passer la BD en InnoDB et ajouter les clés étrangères.
Ecrire le script correspondant.
INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 23/23 - Bertrand LIAUDET