Un des buts de ce TP est d’utiliser les outils d’importation et d’exportation.
Écrire dans un fichier script.sql le script de création des tables correspondant au modèle suivant :
ARTICLE(idArticle, designation, prix)
COMMANDE(idCommande, dateCommande,
#idClient)
LIGNE(#idCommande,#idArticle,
quantite)
CLIENT(idClient, nom, ville)
Pour exécuter ce script :
Mysql\> source script.sql ;
Utiliser les mots clés IF EXISTS lors de la suppression de la table et IF NOT EXISTS lors de la création des tables.
L'objectif est d'importer des données stockées dans un fichier texte.
Utiliser les données du fichier excel en enregistrant chaque feuille au format csv (séparateur de champ : , et séparateur de texte : vide )
Utiliser le nom de la table comme nom de Fichier
Exemple de format pour un fichier : CLIENT.csv
, Dupont, Lyon
, Pierre, Paris
, Durand, Lille
Procéder de la même manière avec les autres tables (onglets dans le tableur) pour créer les autres fichiers de données.
REMARQUE : La première virgule de la ligne de l'exemple signifie que
le premier champ est NULL (AUTO_INCREMENT
). Faire attention
aux clés étrangères et au format de date : yyyy/mm/dd ou yyyy-mm-dd
.
Lancer la commande ci dessous (dans votre script SQL ) :
mysql\> LOAD DATA LOCAL INFILE 'CLIENT.csv' INTO TABLE CLIENT FIELDS TERMINATED BY ',';
Faire de même avec les autre fichiers.
ATTENTION à l’ordre d’importation des données, c’est dans le même ordre généralement que la création des tables
Exemple d’utilisation de la commande “LOAD DATA” avec plusieurs options :
;
comme délimiteurLOAD DATA LOCAL INFILE 'C:\\Users\\login\\S2\\BDD\\TP\\TP1\\ARTICLE.csv'
REPLACE INTO TABLE `bdd_tp1`.`ARTICLE`
CHARACTER SET utf8
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(`designation`,`prix`);
LOAD DATA LOCAL
sur DATAGRIPATTENTION problème résolu : si l’importation des données ne fonctionne par sur DataGrip même en indiquant le chemin absolu du fichier ; configurer datagrip ou utiliser un terminal classique pour exécuter votre script et importer les données
File > Data Sources [sélectionner la source] [advanced]
LOAD DATA LOCAL INFILE '/home/login/Documents/2_S2_BDD/tp1/ARTICLE.csv' INTO TABLE ARTICLE FIELDS TERMINATED BY ',';
\\
LOAD DATA LOCAL INFILE 'C:\\Users\\login\\Documents\\tp1\\ARTICLE.csv' INTO TABLE ARTICLE FIELDS TERMINATED BY ',';
Ajouter un terminal dans DataGrip
voir l’encodage de la table
SHOW CREATE TABLE ARTICLE;
ajouter un encodage au caractère dans la table
CREATE TABLE IF NOT EXISTS ARTICLE (
....
)CHARACTER SET 'utf8' ;
le terminal mysql n’est pas forcément en utf8
et
l’import des données n’est donc pas forcément en utf8
forcer l’encodage des caractères lors de l’importation des données
LOAD DATA LOCAL INFILE 'CLIENT.csv' INTO TABLE CLIENT CHARACTER SET utf8
FIELDS TERMINATED BY ',';
cp850
ATTENTION il n’est parfois pas autorisé d’utiliser la
commande “LOAD DATA LOCAL” sur mysql(oracle)
Vous pouvez essayer de vous connecter avec l’option
--local_infile
: voir sur stackoverflow
local_infile
, elle devrait être à
true
, utiliser la commande :mysql>SHOW GLOBAL VARIABLES LIKE 'local_infile';
éditer le fichier de configuration de mysql (voir sur stackoverflow et stack)
sudo nano /etc/mysql/my.cnf
ajouter les lignes suivantes à la fin :
[mysqld]
lower_case_table_names=0
local_infile=ON
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
[mysql]
local_infile=ON
redémarrer le service mysql
(service --status-all
)
sudo service mysql restart
Sur windows, éditer le fichier
C:\\tools\\mysql\\current\\my.ini
(installation avec
chocalatey) et faire les mêmes modifications que dans
my.cnf
sur linux
Pour connaître le dossier du fichier my.cnf
(Linux,MacOS) ou my.ini
(Windows), exécutez la commande
mysql --help --verbose
. L’information est généralement
affichée au début de la sortie. Sur Linux, utilisez sudo
en
début de commande pour obtenir les privilèges de superutilisateur.
Pour exporter une base (depuis un terminal « shell») dans le terminal :
mysqldump --host=serveurmysql --user=votrelogin --password=motdePasse votreBaseDeDonnee
Pour exporter une base (depuis un terminal « shell») dans un fichier :
mysqldump --host=serveurmysql --user=votrelogin --password=motdePasse votreBaseDeDonnee --no-tablespaces > base.sql
ATTENTION depuis peu la commande fonctionne, mais
elle affiche un message d’erreur : stackexchange : il faut ajouter
--no-tablespaces
dans la commande
On obtient un script de création très complet (base.sql) + les INSERT de données. On peut donc l’exécuter de la même façon qu’en partie 1.
Pour n'exporter que certaines tables, rajouter le nom des tables derrière la base de données.
mysqldump --host=host --user=votrelogin --password=motdePasse --no-tablespaces votreBaseDeDonnee t1 t2 > base.sql
Sur le SE Linux pour faire un backup, créer un script “bash” avec les commandes ci-dessous :
echo nom_fichier_backup_$(date +%Y-%m-%d-%H.%M.%S).sql
mysqldump --host=host --user=votrelogin --password=motdePasse --no-tablespaces votreBaseDeDonnee > nom_fichier_backup_$(date +%Y-%m-%d-%H.%M.%S).sql
Sur Windows, créer un script “Powershell”
(.ps1
) avec les commandes celui ci-dessous :
$timestamp = Get-Date -Format "yyyy-MM-dd_HH_mm_ss"
mysqldump --host=host --user=votrelogin --password=motdePasse --no-tablespaces votreBaseDeDonnee > "backup_$timestamp.sql"
Exemple final :
=> Permet de sauvegarder le contenu d’une base de données
sur linux
sur windows
On désire modifier les contraintes pour pouvoir supprimer en cascade les commandes d'un client (lignes de commandes et commandes)
Modifier les contraintes sans recréer vos tables (ALTER TABLE …. ). Utiliser les mots clés « ON DELETE CASCADE ».
Vérifier les contraintes en regardant la structure de la table.
Faire un essai et vérifier que le contenu des 3 tables a été modifié.
Afficher le contenu des tables, conclusion
Mettre en commentaire ce script pour la suite
+-------------+
| nom |
+-------------+
| DECOCK |
| duguet |
| ESSENBURGER |
| METTEY |
| molin |
+-------------+
+-------------------------+------+
| designation | prix |
+-------------------------+------+
| Haricot ( légume ) | 6.50 |
| Petit pois ( légume ) | 6.00 |
+-------------------------+------+
RAPPEL COURS : Les jointures internes. Les enregistrements sont retournés quand la condition est vraie dans les 2 tables. C’est l’une des jointures les plus communes.
commencer par tester les requêtes suivantes :
SELECT * FROM COMMANDE ;
SELECT * FROM CLIENT ;
SELECT * FROM CLIENT, COMMANDE ;
conclusion
Il existe 2 manières de faire une jointure interne :
SELECT * -- *Ancienne syntaxe*
FROM CLIENT, COMMANDE
WHERE CLIENT.idClient = COMMANDE.idClient;
SELECT *
FROM CLIENT -- *Syntaxe actuelle*
INNER JOIN COMMANDE
ON CLIENT.idClient = COMMANDE.idClient;
Remarques :
* le mot clé « INNER » est optionnel
* les contraintes sur les tables entre clé primaire et clé étrangère ne lient pas les tables lorsque l’on fait des requêtes
autres exemples
+------+--------------+
| nom | dateCommande |
+------+--------------+
| Mutz | 2023-09-19 |
| Mutz | 2023-12-09 |
+------+--------------+
Affichage : nom du client, désignation du produit, prix du produit, quantité commandée, numéro de commande. L’affichage n’est pas trié.
+------+-------------------------------+------+----------+------------+
| nom | designation | prix | quantite | idCommande |
+------+-------------------------------+------+----------+------------+
| Mutz | gâteau fraise (pâtisserie) | 5.25 | 27 | 4 |
| Mutz | Tomate ( légume ) | 1.50 | 5 | 4 |
| Mutz | Potiron ( légume ) | 3.00 | 5 | 4 |
| Mutz | Pomme ( fruit ) | 3.00 | 5 | 4 |
| Mutz | Petit pois ( légume ) | 6.00 | 6 | 8 |
+------+-------------------------------+------+----------+------------+
Affichage : nom du client, désignation du produit, identifiant de la commande et prix total pour chaque produit : prix du produit * quantité commandée. L’affichage est trié par le prix_total dans l’ordre décroissant.
+------+-------------------------------+------------+------------+
| nom | designation | idCommande | prix_total |
+------+-------------------------------+------------+------------+
| Mutz | gâteau fraise (pâtisserie) | 4 | 141.75 |
| Mutz | Petit pois ( légume ) | 8 | 36.00 |
| Mutz | Potiron ( légume ) | 4 | 15.00 |
| Mutz | Pomme ( fruit ) | 4 | 15.00 |
| Mutz | Tomate ( légume ) | 4 | 7.50 |
+------+-------------------------------+------------+------------+
Affichage : Nom du client, numéro de commande , prix total pour chaque commande : somme des (prix du produit * quantité commandée par produit). L’affichage est trié par le prix_total dans l’ordre décroissant.
+------+------------+------------+
| nom | idCommande | prix_total |
+------+------------+------------+
| Mutz | 4 | 179.25 |
| Mutz | 8 | 36.00 |
+------+------------+------------+
+--------+------------+---------------+-------+----------------+
| nom | idCommande | prix_total_HT | TVA | prix_total_TTC |
+--------+------------+---------------+-------+----------------+
| Rato | 6 | 4.50 | 0.90 | 5.40 |
| Walter | 7 | 7.50 | 1.50 | 9.00 |
| Goerig | 5 | 12.00 | 2.40 | 14.40 |
| Walter | 3 | 35.25 | 7.05 | 42.30 |
| Mutz | 8 | 36.00 | 7.20 | 43.20 |
| Goerig | 1 | 68.24 | 13.65 | 81.89 |
| Rato | 2 | 75.24 | 15.05 | 90.29 |
| Mutz | 4 | 179.25 | 35.85 | 215.10 |
+--------+------------+---------------+-------+----------------+
Un peu plus difficile (jointure à gauche ou à droite) :
+----------------------------------+-------------+---------------+------------+
| designation | QteCommande | anneeCommande | idCommande |
+----------------------------------+-------------+---------------+------------+
| Choux ( légume ) | 6 | 2023 | 2 |
| Coca cola ( boisson ) | 12 | 2023 | 1 |
| Fenouil ( légume ) | 3 | 2024 | 3 |
| Fenouil ( légume ) | 4 | 2023 | 1 |
| Fenouil ( légume ) | 4 | 2022 | 5 |
| gâteau fraise (pâtisserie) | 27 | 2023 | 4 |
| Gâteaux chocolat ( pâtisserie) | 3 | 2024 | 3 |
| Haricot ( légume ) | 4 | 2023 | 1 |
| Mouchoir ( hygiène) | 6 | 2023 | 2 |
| Perrier ( 1L eau ) | NULL | NULL | NULL |
| Petit pois ( légume ) | 6 | 2023 | 2 |
| Petit pois ( légume ) | 6 | 2023 | 8 |
| Pissenlit ( légume ) | NULL | NULL | NULL |
| Poireau ( légume ) | 3 | 2024 | 3 |
| Poireau ( légume ) | 3 | 2023 | 6 |
| Poivron ( légume ) | 4 | 2023 | 1 |
| Pomme ( fruit ) | 5 | 2023 | 4 |
| Pomme de terre ( légume ) | 6 | 2023 | 2 |
| Potiron ( légume ) | 5 | 2023 | 4 |
| Radis ( légume ) | 3 | 2024 | 3 |
| Salade ( légume ) | NULL | NULL | NULL |
| Tomate ( légume ) | 5 | 2023 | 4 |
| Tomate ( légume ) | 5 | 2023 | 7 |
| Vittel ( 1L eau ) | NULL | NULL | NULL |
+----------------------------------+-------------+---------------+------------+
+----------------------+-------------+---------------+------------+
| designation | QteCommande | anneeCommande | idCommande |
+----------------------+-------------+---------------+------------+
| Fenouil ( légume ) | 4 | 2023 | 1 |
| Poireau ( légume ) | 3 | 2023 | 6 |
+----------------------+-------------+---------------+------------+
+--------------+------------+-----------------+
| nom | nbCommande | anneeCommande |
+--------------+------------+-----------------+
| Rato | 3 | 2023 |
| Mutz | 2 | 2023 |
| Walter | 1 | 2023 |
| Goerig | 1 | 2023 |
| AMGHAR | 0 | pas de commande |
| dirand | 0 | pas de commande |
| SAINT DIZIER | 0 | pas de commande |
| WOLF | 0 | pas de commande |
| TYRODE | 0 | pas de commande |
| DECOCK | 0 | pas de commande |
| duguet | 0 | pas de commande |
| molin | 0 | pas de commande |
| COTTARD | 0 | pas de commande |
| PETIT | 0 | pas de commande |
| METTEY | 0 | pas de commande |
| TERRAT | 0 | pas de commande |
| chaillet | 0 | pas de commande |
| DAROSEY | 0 | pas de commande |
| JAOUEN | 0 | pas de commande |
| BOUCHAUD | 0 | pas de commande |
| PAUTOT | 0 | pas de commande |
| LAMOTTE | 0 | pas de commande |
| SALVI | 0 | pas de commande |
| BISMUTH | 0 | pas de commande |
| ALANKAYA | 0 | pas de commande |
| ESSENBURGER | 0 | pas de commande |
+--------------+------------+-----------------+
Établir le Modèle Conceptuel de Données (MCD) associé à ce Modèle Relationnel (MR ou MLD) avec le logiciel LOOPING-MCD
Lors de la création des tables :
* Faire attention à l'ordre, on ne crée pas une table avec une contrainte sur une table qui n'existe pas.
* Si un champ utilise l'attribut « AUTO_INCREMENT », celui-ci doit être une clé primaire.
Lors de la suppression des tables :
Faire attention à l'ordre, on ne supprime pas une table qui a sa clé
primaire utilisée dans une contrainte d'une autre table (clé étrangère
dans une autre table).
Lors de la création des contraintes sur les clés
étrangères, en cas d'erreur :
* Vérifier que vous avez créé le champ de la clé étrangère.
* Le type des 2 champs reliés par la contraintes doivent être identiques (erreur fréquente : « int » relié à « unsigned int »).
* ATTENTION aux noms des contraintes : pas de doublons dans la base de données (différents d'un nom de table ….), exemple « fk_table1_table2 ».
* Vérifier que le le nom de l'autre table ainsi que sa clé primaire sont corrects.
Lors de l'importation des données :
* Certaines tables utilisent des clés primaires de type « AUTO_INCREMENT » : si les champs sont nuls lors de l'importation, la clé primaire doit utiliser l'attribut « AUTO_INCREMENT ».
* L'ordre des champs importés est important : respecter l'ordre de création du modèle logique (tables).
https://www.w3schools.com/sql/sql_join.asp
MCD (modèle conceptuel de données) : schéma à réaliser lors du partiel