Bases de données Niveau 1 SQL - MySQL MariaDB - Cours et TP 5 DDL et DML MariaDB : https://mariadb.org/ Site officiel MySQL : http://www-fr.mysql.com/ Zone pour les développeurs : http://dev.mysql.com/ Téléchargement : http://dev.mysql.com/downloads/ Documentations MySQL : http://dev.mysql.com/doc/refman/5.0/fr/ http://dev.mysql.com/doc/refman/5.6/en/ http://dev.mysql.com/doc/index.html Mémo SQL : http://www.volubis.fr/bonus/sql_memo.htm 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 4 2 Contrainte d intégrité référentielle : CIR 9 3 Modification des tables 13 4 Suppression des tables 14 5. Récupération du code sous mysql : show create table 15 6. Moteur MyISAM et moteur InnoDB 16 SQL : CREATION DE LA BASE DE DONNEES. LES TUPLES : LE DML 18 1. Création des tuples 18 2. Modification et suppression des tuples 21 3. Suppression des tuples 22 4. Remplacement des tuples 22 TP N 5 : CMS DES TUPLES ET DES TABLES 23 Présentation 23 Exercice 1 : charger les tables de la base de données 23 Exercice 2 : modification et création de la BD 24 Exercice 3 : création de la BD via un SELECT et des ALTER 25 Exercice 4 : Exporter - Importer 25 BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 1/26 - Bertrand LIAUDET
Exercice 5 : passage de InnoDB à MyISAM et retour en InnoDB 26 Première édition : septembre 2007 Deuxième édition : septembre 2008 Troisième édition : septembre 2009 BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 2/26 - 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 BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 3/26 - Bertrand LIAUDET
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 Exemple 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. 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) ); BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 4/26 - Bertrand LIAUDET
Les types La connaissance des types est plus ou moins spécifique au SGBD avec lequel on travaille. http://dev.mysql.com/doc/refman/5.0/fr/column-types.html Les types numériques http://dev.mysql.com/doc/refman/5.0/fr/numeric-type-overview.html BOOL, BOOLEAN, BIT INT (M), INTEGER (M), TINYINT (M), SMALLINT (M), MEDIUMINT (M), BIGINT (M) FLOAT(precision), FLOAT (M,D), DOUBLE (M,D), DOUBLE PRECISION (M,D), REAL (M,D) avec : M : nb chiffres max, D : nb chiffres après la virgule DECIMAL (M,D), DEC (M,D) avec M : taille de l affichage, D: nombre de décimal, M>=D, si M=D alors 1 < n < 1. Les types date http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-type-overview.html DATE, DATETIME, TIME TIMESTAMP : pour gérer automatiquement la date de création ou de mise à jour. YEAR(2 4) Type chaîne http://dev.mysql.com/doc/refman/5.0/fr/string-type-overview.html CHAR(M), NCHAR(M), CHARACTER : taille statique, 255 max. VARCHAR(M), NATIONAL VARCHAR(M) : taille dynamique, 2000 max. BLOB, TEXT, TINYBLOB, TINYTEXT, MEDIUMBLOB, MEDIUMTEXT, LONGBLOB, LONGTEXT : taille dynamique, jusqu à 4GO. Type chaine : enum et set ENUM('value1','value2',...) : 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». SET('value1','value2',...) : zéro, une ou plusieurs valeurs parmi une liste BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 5/26 - Bertrand LIAUDET
Les contraintes d intégrité Notion de contrainte d intégrité Le type Une contrainte d intégrité est un élément de définition des données qui s applique à un attribut et qui fixe une contrainte de valeur pour les données de l attribut. Le type est la première contrainte d intégrité. Selon les SGBD, plus ou moins de vérifications seront effectuées. MySQL est très permissif : les réels sont arrondis en entier si nécessaire, les entier et les réels sont considérés comme des chaînes de caractères si nécessaire. Les chaînes de caractères qui peuvent être lues comme des entiers ou des réels sont considérées comme des entiers ou des réels si nécessaire. Toutefois : Une chaîne de caractère contenant du texte ne peut pas correspondre à un entier ou un réel. Les date doivent avoir le format : yyyy-mm-jj et le nombre de jour et nombre de mois doit être cohérent. 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. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 6/26 - Bertrand LIAUDET
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; 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), 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) ) 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 BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 7/26 - Bertrand LIAUDET
CREATE TABLE EMP ( NE integer auto_increment, NOM varchar(10), JOB enum ('PRESIDENT','MANAGER', 'SALESMAN', 'CLERK', 'ANALYST'), DATEMB date, SAL float(7,2) check (sal >1000), -- mysql ne gère pas le check! COMM float(7,2) default 100, 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. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 8/26 - 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 s applique à un attribut maître : celui qui fait référence à un autre attribut. Une CIR concerne un attribut joint : celui qui est référé par l attribut maître. 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 de la CIR. Sur la modification et la suppression de tuples référés par une CIR. 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. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 9/26 - 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 : Exemple : 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. 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 : Exemple: 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. 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. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 10/26 - Bertrand LIAUDET
Nommer les contraintes : CONSTRAINT nomcontrainte En SQL standard, on peut nommer toutes les 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 Exemples FOREIGN KEY(nomAttMaître) [CONSTRAINT nomcontrainte] REFERENCES nomtablejointe(nomattjoint) 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) ) ENGINE InnoDB; BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 11/26 - Bertrand LIAUDET
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. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 12/26 - 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 Exemple ALTER TABLE NomTable ADD [ CONSTRAINT nomcontrainte] Contrainte ; 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); ALTER TABLE NomTable DROP type de contrainte nom_de_contrainte; BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 13/26 - Bertrand LIAUDET
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 Attention : DROP TABLE NomTable ; 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. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 14/26 - 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 3. Le code est exploitable directement pour créer une table. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 15/26 - Bertrand LIAUDET
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), primary key(nd) ) ENGINE InnoDB; BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 16/26 - Bertrand LIAUDET
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. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 17/26 - 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 Exemple INSERT INTO NomTable (attribut_1,, attribut_n ) values (valeur_1,, valeur_n ) ; 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 values (NULL, 'VENTES', 'PARIS'); BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 18/26 - Bertrand LIAUDET
Ou bien INSERT INTO departements values ('', 'VENTES', 'PARIS'); 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. 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. Exporter les données A partir de mysql Production d un fichier «csv» exploitable sous Excel. Chemin absolu mysql> SELECT * INTO OUTFILE c:/dept.csv fields terminated by, FROM dept; Chemin relatif : DATADIR mysql> SELECT * INTO OUTFILE./dept.csv fields terminated by, FROM dept; BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 19/26 - Bertrand LIAUDET
Chemin relatif : DATADIR / BDused mysql> SELECT * INTO OUTFILE dept.csv fields terminated by, FROM dept; A partir du SE C: \ > mysql dbname u user p >output.tab On passe en mode batch, l affichage est redirigé dans le fichier output.tab Ou bien C: \ > mysql dbname u user p pager=cat>output.tab Remarque : output.tab est écrasé au début de l opération, mais toutes les commandes de la même session sont executées à la suite Autre usage : C: \ > mysql dbname u user p < fichier.sql > output.tab Importer les données http://dev.mysql.com/doc/refman/5.0/fr/load-data.html On peut importer des données en précisant le format de séparation des champs. Par exemple: les fichiers csv produit par Excel utilisent la virgule comme séparateur. Attention : La table correspondant au fichier importé doit avoir le même schéma que celle dans laquelle les tuples sont insérés. Chemin absolu mysql> LOAD DATA INFILE c:/dept.csv INTO TABLE dept fields terminated by, ; Chemin relatif : DATADIR mysql> LOAD DATA INFILE./dept.csv INTO TABLE dept fields terminated by, ; Chemin relatif : DATADIR / BDused mysql> LOAD DATA INFILE dept.csv INTO TABLE dept fields terminated by, ; Chemin relatif : DATADIR / BD au choix mysql> LOAD DATA INFILE./empdept/dept.csv INTO TABLE dept fields terminated by, ; BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 20/26 - Bertrand LIAUDET
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 : 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 ; BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 21/26 - Bertrand LIAUDET
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. 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 pas 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 pas 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 ) ; BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 22/26 - 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 dans l ordre : lister toutes les erreurs une par une. Pour corriger les erreurs, il faut les traiter dans l ordre, warnings compris. 4. Enregistrer un script corrigé. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 23/26 - 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é du TP05. 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ête de recherche des tuples concernés. 2. Augmenter la commission de 200 à tous les vendeurs de Chicago. Commencer par faire une requête de recherche des tuples concernés. 2. bis : Augmenter de 10 % tous les subordonnés des employés qui gagnent plus que 3000. 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? BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 24/26 - Bertrand LIAUDET
Exercice 3 : création de la BD via un SELECT et des ALTER Méthode de travail Continuer à écrire les scripts dans le fichier de l exercice précédent. Les requêtes 11. Recharger une BD propre : le script corrigé du TP05. 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 : Exporter - Importer Méthode de travail Continuer à écrire les scripts dans le fichier de l exercice précédent. Les requêtes 19. Recharger une BD propre : le script corrigé du TP05. 20. Exporter les données correspondant à la requête : «tous les employés avec leur job, le numéro de leur département et la ville de leur département.» dans un fichier «eox4.csv dont les champs seront séparés par des virgules. Le fichier doit se trouver dans le répertoire des données de la BD. 21. Ouvrer ce fichier avec un éditeur de texte (bloc-note) puis avec un tableur (excel). 22. Créer une nouvelle BD appelée : test. 23. Dans la BD test, créer une table sans tuples dont les champs correspondent aux champs de la requête de l exercice précédent. 24. Importer les données du fichier exo4.csv, en le laissant dans son répertoire, dans la table que vous venez de créer. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 25/26 - Bertrand LIAUDET
Exercice 5 : passage de InnoDB à MyISAM et retour en InnoDB Méthode de travail Continuer à écrire les scripts dans le fichier de l exercice précédent. Les requêtes 25. Recharger une BD propre : le script corrigé du TP05. 26. Faites passer dynamiquement (via des ALTER TABLE) la BD empdept créée en InnoDB en MyISAM. Ecrire le script correspondant à toutes les étapes à franchir. 27. Refaire passer la BD en InnoDB et ajouter les clés étrangères. Ecrire le script correspondant. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 05 - page 26/26 - Bertrand LIAUDET