Vous êtes sur la page 1sur 23

INSIA

Bases de données
ING 1
MySQL – Cours et TP 05
Création des tables et des tuples

LA BIBLE : MySQL 5.0 Reference Manual


http://dev.mysql.com/doc/refman/5.0/fr/index.html

Site officiel MySql : http://www-fr.mysql.com/


Documentation MySQL : http://mysql.org/
La Base de Données Open Source la plus Populaire au Monde
Bertrand LIAUDET

SOMMAIRE

SOMMAIRE 1

SQL : CREATION DE LA BASE DE DONNEES. LES TABLES : LE DDL 3


0. Présentation 3
1. Création des tables 3
2 Contrainte d’intégrité référentielle : CIR 8
3 Modification des tables 12
4 Suppression des tables 13
5. Récupération du code sous mysql : show create table 14
6. Moteur MyISAM et moteur InnoDB 15

SQL : CREATION DE LA BASE DE DONNEES. LES TUPLES : LE DML 17


1. Création des tuples 17
2. Modification et suppression des tuples 18
3. Suppression des tuples 19
4. Remplacement des tuples 19

TP N°5 : CMS DES TUPLES ET DES TABLES 21

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

Première édition : septembre 2007


Deuxième édition : septembre 2008

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.

CMS des tables : Le DDL : Data Definition Language


CREATE TABLE
ALTER TABLE
DROP TABLE

CMS des tuples : Le DML : Data Manipulation Language


INSERT INTO
UPDATE
DELETE FROM
REPLACE

1. Création des tables

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.

Création des tables


http://dev.mysql.com/doc/refman/5.0/fr/create-table.html

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 :

CREATE table NomTable (


attribut_1 type [contrainte d’intégrité],
attribut_2 type [contrainte d’intégrité],
…,
attribut_n type [contrainte d’intégrité] ,
[contrainte d’intégrité]
);
Les contraintes sont facultatives.
L’ordre dans la liste est au choix.
La table est une coquille vide : c'est une structure. Elle permettra ensuite de créer des tuples.

Exemple

CREATE TABLE DEPT (


ND integer primary key auto_increment,
NOM varchar(14) not NULL,
VILLE varchar(13)
);

CREATE TABLE EMP (


NE integer primary key auto_increment,
NOM varchar(10) not NULL,
JOB enum ('PRESIDENT','MANAGER', 'SALESMAN', 'CLERK', 'ANALYST'),
DATEMB date,
SAL float(7,2),
COMM float(7,2),
ND integer not null, foreign key(ND) references DEPT(ND),
NEchef integer , foreign key(NEchef) references EMP(NE)
);

Les types
http://dev.mysql.com/doc/refman/5.0/fr/column-types.html

Voici quelques types de données de mysql :

char(n) : chaîne de caractères de longueur fixe (1<=n<=255).


varchar(n) : chaîne de caractère de longueur variable (A<n<2000).
integer: entier (ou int)
float(nb chiffre max, nb chiffre après la virgule) : nombre fixe ou flottant
date : date
time : heure
datetime : date et heure
year : année

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

La connaissance des types est spécifique au SGBD sur lequel on travaille.

Autres types MySQL :


tinyint, smallint, mediumint, bigint, double precision, numeric, decimal, blob, text, tinyblob,
tinytext, mediumblob, mediumtext, longtext, longblob, set.

Les contraintes d’intégrité

Liste des contraintes d’intégrité


 PRIMARY KEY : permet de définir les clés primaires. Cette contrainte garantit le fait que
la valeur est différente de NULL et qu’elle est unique dans la table.
 FOREIGN KEY : permet de définir les clés étrangères. Cette contrainte garantit que la
valeur fait bien référence à une clé primaire existant dans une autre table.
 NOT NULL : impose le fait que la valeur de l’attribut doit être renseignée.
 UNIQUE : impose le fait que chaque tuple de la table doit, pour l’attribut concerné, avoir
une valeur différente de celle des autres ou NULL.
 DEFAULT : permet de définir une valeur par défaut.
 ENUM : permet de définir un ensemble de valeurs possible pour l’attribut. Cette contrainte
garantit le fait que la valeur de l’attribut appartiendra à cet ensemble. Le SQL standard
propose le mot-clé CHECK qui permet de gérer plus de vérifications sur les valeurs
possibles de pour l’attribut.

Conséquences des contraintes d’intégrité


 PRIMARY KEY, NOT NULL, UNIQUE et CHECK : ces quatre contraintes ont le
même type de conséquence : si on cherche à donner une valeur à un attribut qui n’est pas
conforme à ce qui est précisé dans la définition de l’attribut (valeur NULL s’il est défini
NOT NULL ou PRIMARY KEY, valeur existant déjà s’il est défini UNIQUE ou
PRIMARY KEY, valeur n’appartenant pas au domaine spécifié par le CHECK), alors le
SGBD renvoie un message d’erreur et ne modifie pas la base de données. Ainsi, un premier
niveau de cohérence des données est maintenu.
 DEFAULT : donne une valeur par défaut si il n’y a pas de saisie.
 FOREIGN KEY : cette contrainte garantit que la valeur fait bien référence à une clé
primaire existant dans une autre table. Les conséquences pratiques de cette contraintes
seront abordées au prochain chapitre.

Exemples de code

Exemple 1

-- Création de la BD : on supprime la database, on la recrée, on l'utilise

drop database if exists empdept;


create database empdept;

INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 5/23 - Bertrand LIAUDET
use empdept;

-- Création des tables

CREATE TABLE DEPT (


ND integer primary key auto_increment,
NOM varchar(14) not NULL,
VILLE varchar(13)
) ENGINE InnoDB;

CREATE TABLE EMP (


NE integer primary key auto_increment,
NOM varchar(10) not NULL,
JOB varchar(9),
DATEMBdate,
SAL float(7,2),
COMM float(7,2),
ND integer not null, foreign key(ND) references DEPT(ND),
NEchef integer , foreign key(NEchef) references EMP(NE)
) ENGINE InnoDB;

-- création des tuples

INSERT INTO DEPT VALUES


(10,'ACCOUNTING','NEW YORK'),
(20,'RESEARCH','DALLAS'),
(30,'SALES','CHICAGO'),
(40,'OPERATIONS','BOSTON')
;

INSERT INTO EMP VALUES (7839,'KING','PRESIDENT','1981-11-17',5000,NULL,10,NULL);


INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER','1981-05-1',2850,NULL,30,7839);
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER','1981-06-9',2450,NULL,10,7839);
INSERT INTO EMP VALUES (7566,'JONES','MANAGER','1981-04-2',2975,NULL,20,7839);
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN','1981-09-28',1250,1400,30,7698);
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN','1981-02-20',1600,300,30,7698);
INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN','1981-09-8',1500,0,30,7698);
INSERT INTO EMP VALUES (7900,'JAMES','CLERK','1981-12-3',950,NULL,30,7698);
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN','1981-02-22',1250,500,30,7698);
INSERT INTO EMP VALUES (7902,'FORD','ANALYST','1981-12-3',3000,NULL,20,7566);
INSERT INTO EMP VALUES (7369,'SMITH','CLERK','1980-12-17',800,NULL,20,7902);
INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST','1982-12-09',3000,NULL,20,7566);
INSERT INTO EMP VALUES (7876,'ADAMS','CLERK','1983-01-12',1100,NULL,20,7788);
INSERT INTO EMP VALUES (7934,'MILLER','CLERK','1982-01-23',1300,NULL,10,7782);

 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

CREATE TABLE EMP (


NE integer auto_increment,
NOM varchar(10),
JOB enum ('PRESIDENT','MANAGER', 'SALESMAN', 'CLERK', 'ANALYST'),
DATEMBdate,
SAL float(7,2) check (sal >1000), -- mysql ne gère pas le check !
COMM float(7,2) default 100,

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;

CREATE TABLE DEPT (


ND integer auto_increment,
NOM varchar(14),
VILLE varchar(13),
primary key(ND)
) 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.

Create table as select


On peut créer une table et la remplir à partir d’un select :

Create table nomTable as select … ;

Cette table contiendra les attributs et les tuples du select.


Elle ne contiendra aucune contraintes d’intégrité. Tous les attributs sont à NULL par défaut.
Pour y ajouter des contraintes d’intégrité, il faudra faire des ALTER TABLE.

INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 7/23 - Bertrand LIAUDET
2 Contrainte d’intégrité référentielle : CIR

Notion de contrainte d’intégrité référentielle


FOREIGN KEY est une caractéristique pour un attribut qui définit une contrainte d’intégrité
référentielle.
Une CIR garantit que la valeur de l’attribut fait bien référence à une clé primaire existant dans
une autre table.

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

La présence de CIR à des conséquences :


• Sur la création, modification, suppression des tables.
• Sur la création et la modification de tuples propriétaires d’une CIF.
• Sur la modification et la suppression de tuples référés par une CIF.

Conséquences de l’intégrité référentielle sur les tables

Création et modification d’une table maître (avec une clé étrangère)


La table jointe doit être créée avant la table maître.
Exemple : il faut créer la table des départements avant celle des employés car la table des
employés fait référence à la table des départements.

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.

Ajout et suppression des CIR indépendamment des tables


Pour pouvoir créer les tables dans n’importe quel ordre (par ordre alphabétique par exemple), il
suffit de créer les CIR après avoir créer les tables (avec un ALTER TABLE).
Pour pouvoir supprimer les tables dans n’importe quel ordre, il suffit de supprimer les CIR avant
de supprimer les tables (avec un ALTER TABLE).

Conséquences de l’intégrité référentielle sur les tuples

Création et modification d’un tuple maître (avec une clé étrangère)


Le tuple joint doit être créé avant le tuple maître.

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

Création de CIR dans un CREATE TABLE

 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)
);

Nom d’une CIR : show create table


mysql> show create table emp;
| emp | CREATE TABLE `emp` (
`NE` int(11) NOT NULL auto_increment,

CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`ND`) REFERENCES `dept` (`ND`),
CONSTRAINT `emp_ibfk_2` FOREIGN KEY (`NEchef`) REFERENCES `emp` (`NE`)
) ENGINE=InnoDB AUTO_INCREMENT=7935 DEFAULT CHARSET=latin1 |
La CIR sur ND est nommée automatiquement : `emp_ibfk_1`.
La CIR sur NEchef est nommée automatiquement : `emp_ibfk_2`

Création de CIR par un ALTER TABLE


CREATE TABLE EMP (
NE integer auto_increment,

NEchef integer,
primary key(NE)

INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 10/23 - Bertrand LIAUDET
) ENGINE InnoDB;

CREATE TABLE DEPT (


ND integer auto_increment,

primary key(ND)
) 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

Modification des attributs

Ajouter un ou plusieurs attributs à la table :


ALTER TABLE NomTable ADD (
attribut_1 type [contrainte],
attribut_2 type [contrainte],
…,
attribut_n type [contrainte]
);

Modifier un attribut de la table


ALTER TABLE NomTable MODIFY
attribut_1 type [contrainte]
;

La modification permet d’annuler les contraintes de type NOT NULL ou auto_increment.

Supprimer un attribut de la table


ALTER TABLE NomTable DROP attribut ;

 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.

Ajout et suppression de contraintes d'intégrité

Ajouter une contrainte


ALTER TABLE NomTable ADD [ CONSTRAINT nomContrainte] Contrainte ;

 Exemple
ALTER TABLE emp
ADD CONSTRAINT keynd FOREIGN KEY(ND) REFERENCES DEPT(ND);

Suppression d’une contrainte nommée


ALTER TABLE emp ADD 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;

Récupérer le nom des contraintes : show create table maTable


Si on n’a pas nommé les contraintes à la création, MySQL les nomme automatiquement. Pour
récupérer le nom, il faut utiliser la commande
Show create table maTable
On obtient alors le nom de la contrainte derrière le mot clé CONSTRAINT.

Suppression de la clé primaire


ALTER TABLE NomTable DROP primary key ;
On ne peut supprimer la clé primaire que si ce n’est pas un auto incrément, et uniquement si elle
n’est pas référencée par une clé étrangère.

4 Suppression des tables

DROP TABLE NomTable ;


Attention :
La modification et la suppression des tables doit ê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.

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

Show create table


La commande show create table nomTable permet de récuperer le code de création d’une
table.

Exemple 1 : mysql> show create table dept;

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

Exemple 2 : mysql> show create table emp;

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

Rappels d’autres commandes


Show databases : lister toutes les databases auxquelles on a accès.
Create database nomDataBase : créer une database.
Drop database nomDataBase : supprimer une database.
Use nomDataBase : utiliser une database.
Show tables : lister les tables de la database en cours.
Desc nomTable : lister les attributs d’une table
Show index from nomTable : lister les index d’une table
Show create table nomTable : afficher le code de creation d’une table

6. Moteur MyISAM et moteur InnoDB

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.

Quel moteur choisir ?


Par défaut, il vaut mieux choisir le moteur InnoDB qui prend en compte la norme SQL.
Pour améliorer les performance, on peut revenir, si nécessaire au moteur MyISAM.

Conclusion : toujours InnoDB !!!


Etant donné que les performances sont, dans un premier temps, une question secondaire, et que
par contre, on veut absolument apprendre à gérer finement les contraintes de clés étrangères
puis les transactions :
On utilisera toujours le moteur InnoDB !!!

Conséquence syntaxique : ENGINE InnoDB


On ajoute : ENGINE InnoDB à la fin de la création de la table :

CREATE TABLE DEPT (


ND integer auto_increment,
NOM varchar(14),
VILLE varchar(13),

INSIA - BASES DE DONNÉES – ING 1 – Piscine Cours 05 - page 15/23 - Bertrand LIAUDET
primary key(ND)
) ENGINE InnoDB;

Passage d’un moteur à l’autre


On peut modifier le moteur d’une table :

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

1. Création des tuples

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

Au minimum, on écrira donc :


INSERT INTO departements ( )
values ( );

En passant une valeur NULL


En passant une valeur NULL ou ‘’, on fait jouer l’auto-incrément :
INSERT INTO departements

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');

Création de tuples en série


On peut insérer dans une table des tuples résultant de l’interrogation de la base de données elle-
même.
INSERT INTO NomTable ( liste d'attributs )
SELECT liste d'attributs from …
;
Les tuples de la table résultant du select sont créés dans la table de l'insert.
Attention :
La table résultant du select doit avoir le même schéma que celle dans laquelle les tuples sont
insérés.

Gestion des clés étrangères : la fonction last_insert_id()


La fonction last_insert_id() permet de récupérer le dernier numéro de clé primaire donnée.
C’est utile pour faire un lien sur une clé étrangère :
INSERT INTO employes
values (NULL, 'DURAND', 'ANALYST', '1981-11-17', 2000, NULL, last_insert_id(),7839);
Cette instruction permet de créer l’employé DURAND et de l’affecter dans le département
qu’on vient de créer précédemment.
A noter que la fonction « last_insert_id() » est gérée au niveau de chaque client.

2. Modification et suppression des tuples

Modification de toute la colonne


On peut modifier la valeur d’un attribut d’un tuple :
UPDATE NomTable
SET attribut = expression ;
L’expression peut être une valeur constante, ou une valeur calculée à partir d’un élément de la
BD : soit directement un attribut, soit le résultat d’un select (qui devra donc avoir comme
résultat une valeur atomique).
Attention :
La modification est effectuée pour tous les tuples.

Modification de certains tuples dans la colonne


On peut sélectionner certains tuples en ajoutant la clause where :

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.

Modification de plusieurs attributs à la fois


La syntaxe générale est la suivante :
UPDATE NomTable
SET attribut_1 = expression ou ( SELECT …),

attribut_n = expression_n ou ( SELECT …)
WHERE condition;

Exemple
UPDATE emp
SET salaire = salaire * 1,1
WHERE job = ‘Manager’;

3. Suppression des tuples


On peut supprimer des tuples en précisant lesquels par la clause where :
DELETE FROM NomTable
WHERE condition ;

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. Remplacement des tuples


Remplacer un tuple est équivalent à le supprimer (DELETE) et le créer à nouveau (INSERT
INTO).

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.

REPLACE FROM NomTable


SET attribut_1 = expression ou ( SELECT …),

attribut_n = expression_n ou ( SELECT …) ;

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.

Exercice 1 : charger les tables de la base de données

Présentation
On travaillera sur les tables suivantes :

EMPLOYES(NE, NOM, JOB, DATEMB, SAL, COMM, #ND, *NEchef)


• NE numéro de l’employé. Clé primaire.
• NOM nom de l’employé.
• JOB intitulé du poste occupé.
• DATEMB date d’embauche.
• SAL salaire de l’employé.
• COMM commission (part de salaire variable).
• #ND n° du département dans lequel travaille l’employé. Clé étrangère.
• *NEchef n° d’employé du chef de l’employé. Clé étrangère réflexive.

DEPARTEMENTS(ND, NOM, VILLE)


• ND numéro des départements de l’entreprise. Clé primaire.
• NOM nom des départements de l’entreprise.
• VILLE nom des villes où sont situés les départements.

Exercice : lancer le script de création de la BD


1. Télécharger le script de création de la BD : EmployesTP05.txt
2. Lancer ce script de création de la BD.
3. Corriger les erreurs.
4. Enregistrer un script corrigé.

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.

Les requêtes : CMS (Création Modification Suppression) des tuples


1. Faire une augmentation de salaire de 20% à tous les employés du département 20.
Commencer par faire une requêtes de recherche des tuples concernés.
2. Augmenter la commission de 200 à tous les vendeurs de Chicago. Commencer par faire une
requêtes de recherche des tuples concernés.
3. Essayer de créer l’employé Dupond dont le numéro d’employé est 7839. On n’a pas plus
d’informations le concernant. Quel problème cela pose-t-il ?
4. Essayer de créer l’employé Dupond dont le numéro d’employé est 7839 et qui travaille dans
le département 10. Quel problème cela pose-t-il ? Comment pouvez-vous le résoudre ?
5. Essayer de supprimer le département 10. Quel problème cela pose-t-il ?
6. Essayer de supprimer l’employé n° 7698. Quel problème cela pose-t-il ?
7. Créer l’employé Dupond . Son numéro est le 8000. Il est MANAGER. Sa date d’embauche
est le 1 février 2007. Son salaire est 2500. Il n’a pas de commission. Son supérieur
hiérarchique est le Président. Il travaille dans le département 30. Turner (7844) et James
(7900) passe sous sa responsabilité. Ecrivez le script de mise à jour de la base de données.
Exécuter ce script.
8. Dupond et les employés sous sa responsabilité travaille désormais dans le département 40.
Ecrivez le script de mise à jour de la base de données.
9. Blake (7698) démissionne. Tous les employés sous sa responsabilité passent sous celle de
Dupond et dans son département. Son département est supprimé. Tous les employés de son
département passent dans le département de Dupond. Ecrivez le script de mise à jour de la
base de données. Dans le script on commencera par lister tous les subordonnés de Blake et
tous les employés de son département.
10. Ajouter un nouveau département. Il est à PARIS. Son nom est « INFO ». On souhaite gérer
le numéro du département automatiquement. Quel est le numéro de ce nouveau
département ?

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 »

Exercice 4 : passage de InnoDB à MyISAM et retour en InnoDB

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

Vous aimerez peut-être aussi