CHEZ LE MÊME ÉDITEUR

418

Transcript of CHEZ LE MÊME ÉDITEUR

Page 1: CHEZ LE MÊME ÉDITEUR

CHEZ LE MEcircME EacuteDITEUR

Du mecircme auteur

C SOUTOU ndash De UML agrave SQLNdeg11098 2002 500 pages

C SOUTOU ndash SQL pour Oracle ndash 2e eacuteditionNdeg11697 2005 480 pages

Autour de SQL et MySQL

P J PRATT ndash Initiation agrave SQLNdeg9285 2001 328 pages

AG TAYLOR ndash SQL Web TrainingNdeg25413 2002 428 pages

R LENTZNER ndash 300 astuces pour SQL et MySQLNdeg25359 2001 254 pages

M KOFLER ndash MySQL 5 Guide de lʼadministrateur et du deacuteveloppeurNdeg11633 2005 672 pages

J-M AQUILINA ndash Aide-meacutemoire MySQLNdeg25451 2002 384 pages

J-M DEFRANCE ndash PHPMySQL avec Flash MX 2004Ndeg11468 2005 710 pages

P CHALEacuteAT D CHARNAY et J-R ROUET ndash Les Cahiers du programmeur PHPMySQL et JavaScriptNdeg11678 2005 212 pages

J-M DEFRANCE ndash PHPMySQL avec Dreamweaver 2004 (best of)Ndeg11709 2005 550 pages

EacuteDITIONS EYROLLES61 bd Saint-Germain75240 Paris Cedex 05

wwweditions-eyrollescom

Le code de la proprieacuteteacute intellectuelle du 1er juillet 1992 interdit en effet expresseacutement la photocopie agrave usage collectif sans autorisation des ayants droit Or cette pratique srsquoest geacuteneacuteraliseacutee notamment dans les eacutetablissements drsquoenseignement provoquant une baisse brutale des achats de livres au point que la possibiliteacute mecircme pour les auteurs de creacuteer des œuvres nouvelles et de les faire eacutediter correctement est aujourdrsquohui menaceacuteeEn application de la loi du 11 mars 1957 il est interdit de reproduire inteacutegralement ou partiellement le

preacutesent ouvrage sur quelque support que ce soit sans autorisation de lrsquoeacutediteur ou du Centre Franccedilais drsquoExploitation du Droit de Copie 20 rue des Grands-Augustins 75006 Pariscopy Groupe Eyrolles 2006 ISBN 2-212-11915-1

Pour Aureacutelia mon chat aux yeux si bleus si verts si gris

Pour Reneacute et Lydie Jean et Denise qui sont devenus mes parents

4055_00a_Dedi Page V Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

4055_00a_Dedi Page VI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

VII

Table des matiegraveres

Remerciements XVII

Avant-propos XIX

Guide de lecture

XXPremiegravere partie SQL de base XXDeuxiegraveme partie programmation proceacutedurale XXTroisiegraveme partie langages et outils XXAnnexe XX

Typographie

XXI

Contact avec lrsquoauteur ndash Corrigeacutes des exercices

XXII

Introduction 1

SQL une norme un succegraves

1

Modegravele de donneacutees

2Tables et donneacutees 2Les cleacutes 3

MySQL

3Un peu drsquohistoire 4Offre du moment 5Licences 6Et la concurrence 6Notion de scheacutema (database) 6Notion drsquohocircte 7Aspects eacutetudieacutes 8

Mise en œuvre de MySQL (sous Windows)

9Installation 9Deacutesinstallation 10Reconfiguration 10

Premiers pas

10Lrsquointerface de commande 10Creacuteation drsquoun utilisateur 11Connexion au serveur 12Veacuterification de la version 12Options de base 13Batch 14Votre prompt et vite 14Commandes de base 15

4055_00b_TDMfm Page VII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

VIII

copy Eacuteditions Eyrolles

Partie I SQL de base 17

1 Deacutefinition des donneacutees 19

Tables relationnelles

19Creacuteation drsquoune table (

CREATE TABLE

) 19Deacutelimiteurs 20Sensibiliteacute agrave la casse 20Commentaires 21Premier exemple 22Contraintes 23Conventions recommandeacutees 24Types des colonnes 26Structure drsquoune table (

DESCRIBE

) 29Restrictions 30

Index

30Arbres balanceacutes 31Creacuteation drsquoun index (

CREATE INDEX

) 32Bilan 33

Destruction drsquoun scheacutema

33Suppression drsquoune table (

DROP TABLE

) 33Ordre des suppressions 34

Exercices

35

2 Manipulation des donneacutees 37

Insertions drsquoenregistrements (

INSERT

)

37Syntaxe 37Renseigner toutes les colonnes 38Renseigner certaines colonnes 38Plusieurs enregistrements 39Ne pas respecter des contraintes 39Donneacutees binaires 40Eacutenumeacuterations 40Dates et heures 41

Seacutequences

44Utilisation en tant que cleacute primaire 44Modification drsquoune seacutequence 45Utilisation en tant que cleacute eacutetrangegravere 46

Modifications de colonnes

47Syntaxe (

UPDATE

) 47Modification drsquoune colonne 48Modification de plusieurs colonnes 48Modification de plusieurs enregistrements 48Ne pas respecter les contraintes 48

4055_00b_TDMfm Page VIII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

IX

Table des matiegraveres Apprendre SQL avec MySQL

Restrictions 50Dates et intervalles 50

Remplacement drsquoun enregistrement

54

Suppressions drsquoenregistrements

54Instruction

DELETE

54Instruction

TRUNCATE

55

Inteacutegriteacute reacutefeacuterentielle

56Syntaxe 56Coheacuterences assureacutees 56Contraintes cocircteacute laquo pegravere raquo 57Contraintes cocircteacute laquo fils raquo 58Cleacutes composites et nulles 58Coheacuterence du fils vers le pegravere 59Coheacuterence du pegravere vers le fils 60En reacutesumeacute 62

Insertions agrave partir drsquoun fichier

62

Exercices

64

3 Eacutevolution drsquoun scheacutema 67

Renommer une table (

RENAME

)

67

Modifications structurelles (

ALTER TABLE

)

68Ajout de colonnes 68Renommer des colonnes 69Modifier le type des colonnes 69Valeurs par deacutefaut 70Supprimer des colonnes 70

Modifications comportementales

71Ajout de contraintes 71Suppression de contraintes 73Deacutesactivation des contraintes 75Reacuteactivation des contraintes 77Contraintes diffeacutereacutees 79

Exercices

80

4 Interrogation des donneacutees 83

Geacuteneacuteraliteacutes

83Syntaxe (

SELECT

) 84Pseudotable 84

Projection (eacuteleacutements du

SELECT

)

85Extraction de toutes les colonnes 86Extraction de certaines colonnes 86Alias 87Duplicatas 87

4055_00b_TDMfm Page IX Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

X

copy Eacuteditions Eyrolles

Expressions et valeurs nulles 88Ordonnancement 89Concateacutenation 89Insertion multiligne 90Limitation du nombre de lignes 90

Restriction (

WHERE

)

91Opeacuterateurs de comparaison 92Opeacuterateurs logiques 93Opeacuterateurs inteacutegreacutes 93Alias 95

Fonctions

95Caractegraveres 95Numeacuteriques 99Fonction pour les bits 100Dates 101Conversions 105Comparaisons 106Eacutenumeacuterations 107Autres fonctions 108

Regroupements

109Fonctions de groupe 110Eacutetude du

GROUP BY

et

HAVING

111

Opeacuterateurs ensemblistes

114Restrictions 114Exemple 115Intersection 115Opeacuterateurs

UNION

et

UNION ALL

116Diffeacuterence 117Ordonner les reacutesultats 118Produit carteacutesien 119Bilan 120

Jointures

121Classification 121Jointure relationnelle 122Jointures SQL2 122Types de jointures 123Eacutequijointure 123Autojointure 125Ineacutequijointure 127Jointures externes 128Jointures proceacutedurales 132Jointures mixtes 136Sous-interrogations synchroniseacutees 137Autres directives SQL2 140

4055_00b_TDMfm Page X Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XI

Table des matiegraveres Apprendre SQL avec MySQL

Division

142Deacutefinition 143Classification 143Division inexacte 144Division exacte 144

Reacutesulats en HTML ou XML

145

Eacutecriture dans un fichier

146

Exercices

147

5 Controcircle des donneacutees 151

Gestion des utilisateurs

152Classification 152Creacuteation drsquoun utilisateur (

CREATE USER

) 152Modification drsquoun utilisateur 154Renommer un utilisateur (

RENAME USER

) 154Suppression drsquoun utilisateur (

DROP USER

) 155

Gestion des bases de donneacutees

155Creacuteation drsquoune base (

CREATE DATABASE

) 156Seacutelection drsquoune base de donneacutees (

USE

) 157Modification drsquoune base (

ALTER DATABASE

) 158Suppression drsquoune base (

DROP DATABASE

) 158

Privilegraveges

158Niveaux de privilegraveges 159Tables de la base

mysql

159Table

mysqluser

160Attribution de privilegraveges (

GRANT

) 163Table

mysqldb

167Table

mysqlhost

167Table

mysqltables_priv

168Table

mysqlcolumns_priv

168Table

mysqlprocs_priv

168Reacutevocation de privilegraveges (

REVOKE

) 170Attributions et reacutevocations laquo sauvages raquo 172

Accegraves distants

172Connexion par lrsquointerface de commande 173Table

mysqlhost

173

Vues

175Creacuteation drsquoune vue (

CREATE VIEW

) 176Classification 177Vues monotables 177Vues complexes 181Autres utilisations de vues 185Transmission de droits 188Modification drsquoune vue (

ALTER VIEW

) 188

4055_00b_TDMfm Page XI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

XII

copy Eacuteditions Eyrolles

Visualisation drsquoune vue (

SHOW CREATE VIEW

) 189Suppression drsquoune vue (

DROP VIEW

) 189

Dictionnaire des donneacutees

190Constitution 190Modegravele graphique du dictionnaire des donneacutees 191Deacutemarche agrave suivre 191Classification des vues 193Bases de donneacutees du serveur 194Composition drsquoune base 195Deacutetail de stockage drsquoune base 195Structure drsquoune table 196Recherche des contraintes drsquoune table 198Composition des contraintes drsquoune table 199Recherche du code source drsquoun sous-programme 200Privilegraveges des utilisateurs drsquoune base de donneacutees 201Commande

SHOW

203

Exercices

205

Partie II Programmation proceacutedurale 207

6 Bases du langage de programmation 209Geacuteneacuteraliteacutes 209

Environnement client-serveur 209Avantages 210Structure drsquoun bloc 210Porteacutee des objets 211Casse et lisibiliteacute 211Identificateurs 212Commentaires 212

Variables 212Variables scalaires 213Affectations 213Restrictions 213Reacutesolution de noms 214Opeacuterateurs 214Variables de session 215Conventions recommandeacutees 215

Test des exemples 216Structures de controcircle 217

Structures conditionnelles 217Structures reacutepeacutetitives 219

Interactions avec la base 222Extraire des donneacutees 223Manipuler des donneacutees 224

4055_00b_TDMfm Page XII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles XIII

Table des matiegraveres Apprendre SQL avec MySQL

Transactions 227Caracteacuteristiques 227Deacutebut et fin drsquoune transaction 228Mode de validation 228Votre premiegravere transaction 228Controcircle des transactions 229Transactions imbriqueacutees 230

Exercices 231

7 Programmation avanceacutee 233

Sous-programmes 233Geacuteneacuteraliteacutes 233Proceacutedures catalogueacutees 234Fonctions catalogueacutees 235Structure drsquoun sous-programme 236Exemples 236Fonction nrsquointeragissant pas avec la base 238Compilation 239Appel drsquoun sous-programme 239Reacutecursiviteacute 241Sous-programmes imbriqueacutes 242Modification drsquoun sous-programme 243Destruction drsquoun sous-programme 243Restrictions 244

Curseurs 244Geacuteneacuteraliteacutes 244Instructions 245Parcours drsquoun curseur 246Accegraves concurrents (FOR UPDATE) 247Restrictions 248

Exceptions 248Geacuteneacuteraliteacutes 248Restrictions 250Exceptions avec EXIT 250Exceptions avec CONTINUE 254Gestion des autres erreurs (SQLEXCEPTION) 255Mecircme erreur sur diffeacuterentes instructions 257Exceptions nommeacutees 260

Deacuteclencheurs 262Geacuteneacuteraliteacutes 262Agrave quoi sert un deacuteclencheur 262Meacutecanisme geacuteneacuteral 263Syntaxe 263Deacuteclencheurs LMD (de lignes) 264

4055_00b_TDMfm Page XIII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

XIV copy Eacuteditions Eyrolles

Appel de sous-programmes 271Dictionnaire des donneacutees 272Programmation drsquoune contrainte de veacuterification 273Invalidation dans le deacuteclencheur 275Tables mutantes 277Restrictions 278Suppression drsquoun deacuteclencheur 278

SQL dynamique 278Syntaxe 279Exemples 280Restrictions 281

Exercices 284

Partie III Langages et outils 287

8 Utilisation avec Java 289

JDBC avec ConnectorJ 289Classification des pilotes (drivers) 290Le paquetage javasql 291Structure drsquoun programme 291Test de votre configuration 292

Connexion agrave une base 293Base Access 294Base MySQL 295Interface Connection 295

Eacutetats drsquoune connexion 296Interfaces disponibles 296Meacutethodes geacuteneacuteriques pour les paramegravetres 296Eacutetats simples (interface Statement) 297Meacutethodes agrave utiliser 298

Correspondances de types 298Manipulations avec la base 300

Suppression de donneacutees 300Ajout drsquoenregistrements 301Modification drsquoenregistrements 301

Extraction de donneacutees 301Curseurs statiques 302Curseurs navigables 303

Curseurs modifiables 307Suppressions 309Modifications 310Insertions 310

4055_00b_TDMfm Page XIV Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles XV

Table des matiegraveres Apprendre SQL avec MySQL

Gestion des seacutequences 311Meacutethode getGeneratedKeys 312Curseur modifiable 312

Interface ResultSetMetaData 313Interface DatabaseMetaData 314Instructions parameacutetreacutees (PreparedStatement) 316

Extraction de donneacutees (executeQuery) 316Mises agrave jour (executeUpdate) 317Instruction LDD (execute) 317

Proceacutedures catalogueacutees 318Exemple 319

Transactions 320Points de validation 321

Traitement des exceptions 322Affichage des erreurs 323Traitement des erreurs 323

Exercices 325

9 Utilisation avec PHP 327Configuration adopteacutee 327

Logiciels 327Fichiers de configuration 327Test drsquoApache et de PHP 328Test drsquoApache de PHP et de MySQL 329

API de PHP pour MySQL 329Connexion 330Interactions avec la base 330Extractions 332Instructions parameacutetreacutees 335Gestion des seacutequences 337Traitement des erreurs 337Proceacutedures catalogueacutees 339Meacutetadonneacutees 340

Exercices 344

10 Outils graphiques 349MySQL Administrator 349

Connexion 349Connexion nommeacutee 350Liste des accegraves utilisateur 351Gestion des privilegraveges 351Caracteacuteristiques systegraveme 352Options scripts SQL 353Composition drsquoune base 354

4055_00b_TDMfm Page XV Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

XVI copy Eacuteditions Eyrolles

Composition drsquoune table 355Composition des index 356Modification drsquoun scheacutema 356Restriction 358

MySQL Query Browser 359Fenecirctre principale 359Extraction 360Modification 361

phpMyAdmin 362Composition de la base 363Structure drsquoune table 364Administrer une table 364Extractions 365Rechercher 366Exporter 367Utilisateurs 368

TOAD for MySQL 368Administration 369Instructions en ligne 370Deacuteveloppement 371Creacuteation drsquoobjets 371Recherche drsquoobjets 373Exportations 374

Navicat 374Creacuteation drsquoune table 375Deacutefinition drsquoune contrainte 376Creacuteation drsquoune requecircte 377Importation 378Gestion des utilisateurs 378

MySQL Manager 379Creacuteation drsquoune table 380Creacuteation drsquoune requecircte 382Proceacutedures catalogueacutees 382Gestion des utilisateurs 383Gestion des privilegraveges 383

Bilan 384

Annexe bibliographie et webographie 385

Index 387

4055_00b_TDMfm Page XVI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XVII

Remerciements

Je nrsquoai que deux personnes agrave remercier Il srsquoagit de deux jeunes informaticiens rencontreacutes auhasard drsquoun forum Ils sont talentueux et deacutesinteacuteresseacutes ce qui devient tellement rare dans cemonde drsquoindividualisme exacerbeacute Le premier recherchait un emploi agrave la peacuteriode de la reacutedac-tion souhaitons qursquoil trouve clavier agrave ses mains Le second dirige la rubrique MySQL du siteDeveloppezcom

Merci Pierre Caboche pour la lecture de la premiegravere moitieacute de lrsquoouvrage pour tes remarquesque jrsquoai (presque) toutes prises en compte pour les compleacutements en ligne agrave propos des opeacutera-teurs ensemblistes dans les requecirctes

Merci Guillaume Lebur pour tous tes commentaires de qualiteacute et pour tes corrections agravepropos de la programmation sous MySQL Merci pour ton activiteacute et tes tutoriels mis en lignesur le site de Developpezcom

4055_00c_Lim Page XVII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

4055_00c_Lim Page XVIII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XIX

Avant-propos

Nombre drsquoouvrages traitent de SQL et de MySQL certains reacutesultent drsquoune traduction hasar-deuse et sans vocation peacutedagogique drsquoautres ressemblent agrave des Bottin teacuteleacutephoniques ouproviennent de la traduction de la documentation officielle en moins bien Les survivants nesont peut-ecirctre plus vraiment agrave jour

Ce livre a eacuteteacute reacutedigeacute avec une volonteacute de concision et de progression dans sa deacutemarche il estillustreacute par ailleurs de nombreux exemples et figures Bien que la source principale drsquoinforma-tions fucirct la documentation officielle de MySQL (httpdevmysqlcomdoc) lrsquoouvrage neconstitue pas un condenseacute de commandes SQL Chaque notion importante est introduite parun exemple simple et que jrsquoespegravere deacutemonstratif En fin de chaque chapitre des exercices vouspermettront de tester vos connaissances

La documentation en ligne de MySQL (

MySQL 5 Reference Manual

) repreacutesente une dizainede meacutegaoctets au format HTML Tous les concepts srsquoy trouvant ne pourraient pas ecirctre icideacutecemment expliqueacutes sauf peut-ecirctre si cet ouvrage ressemblait agrave un annuaire Jrsquoai tenteacute drsquoenextraire seulement les aspects fondamentaux sous la forme drsquoune synthegravese

Vous nrsquoy trouverez donc pas des consideacuterations agrave propos drsquoaspects avanceacutes du langage ou duserveur comme lrsquooptimisation de requecirctes la restauration drsquoune base la reacuteplication la versiondu serveur agrave partir de laquelle telle ou telle fonction est apparue etc

Ce livre reacutesulte de mon expeacuterience de lrsquoenseignement dans le domaine des bases de donneacuteesen premier deuxiegraveme et troisiegraveme cycles universitaires dans des cursus drsquoinformatique agravevocation professionnelle (IUT licences et masters professionnels)

Cet ouvrage srsquoadresse principalement aux novices deacutesireux de deacutecouvrir SQL en program-mant sous MySQL

Les eacutetudiants et enseignants trouveront des exemples peacutedagogiques pour chaque conceptabordeacute ainsi que des exercices theacutematiques

Les deacuteveloppeurs PHP ou Java deacutecouvriront des moyens de stocker leurs donneacutees

4055_00c_Lim Page XIX Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

XX

copy Eacuteditions Eyrolles

Guide de lecture

Ce livre srsquoorganise autour de trois parties distinctes mais compleacutementaires La premiegravere inteacute-ressera le lecteur deacutebutant en la matiegravere car elle concerne les instructions SQL et les notionsde base de MySQL La deuxiegraveme partie deacutecrit la programmation avec le langage proceacuteduralde MySQL La troisiegraveme partie attirera lrsquoattention des programmeurs qui envisagent drsquoutiliserMySQL agrave lrsquoaide drsquooutils natifs ou tout en programmant avec des langages eacutevolueacutes ou via desinterfaces Web (PHP ou Java)

Premiegravere partie SQL de base

Cette partie preacutesente les diffeacuterents aspects du langage SQL de MySQL en eacutetudiant en deacutetailles instructions de base Agrave partir drsquoexemples jrsquoexplique notamment comment deacuteclarer mani-puler faire eacutevoluer et interroger des tables avec leurs diffeacuterentes caracteacuteristiques et leurseacuteleacutements associeacutes (contraintes index vues seacutequences) Nous eacutetudions aussi SQL dans uncontexte multi-utilisateur (droits drsquoaccegraves) et au niveau du dictionnaire de donneacutees

Deuxiegraveme partie programmation proceacutedurale

Cette partie deacutecrit les caracteacuteristiques du langage proceacutedural de MySQL Le chapitre 6 traitedes eacuteleacutements de base (structure drsquoun programme variables structures de controcircle interactionsavec la base et transactions) Le chapitre 7 traite des sous-programmes des curseurs de lagestion des exceptions des deacuteclencheurs et de lrsquoutilisation du SQL dynamique

Troisiegraveme partie langages et outils

Cette partie inteacuteressera les programmeurs qui envisagent drsquoexploiter une base MySQL enutilisant un langage de programmation Le chapitre 8 deacutetaille lrsquoAPI JDBC 30 qui permet demanipuler une base MySQL 5 par lrsquointermeacutediaire drsquoun programme Java Le chapitre 9 deacutecritles principales fonctions de lrsquoAPI

mysqli

qui permet drsquointerfacer un programme PHP 5 avecune base MySQL 5

Le chapitre 10 syntheacutetise les fonctionnaliteacutes de plusieurs outils graphiques tels que

MySQLAdministrator

MySQL Query Browser

et

phpMyAdmin

Drsquoautres consoles graphiquesdrsquoadministration sont eacutetudieacutees agrave savoir

Toad

for MySQL

Navicat

et

EMS SQL Manager

Annexe

Lrsquoannexe contient une bibliographie et des adresses Web

4055_00c_Lim Page XX Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XXI

Avant-propos

Typographie

La police

courrier

est utiliseacutee pour souligner les instructions SQL noms de types tablescontraintes etc (ex

SELECT nom FROM Pilote

)

Les majuscules sont employeacutees pour les directives SQL et les minuscules pour les autreseacuteleacutements Les noms des tables index vues fonctions proceacutedureshellip sont preacuteceacutedeacutes drsquounemajuscule (exemple la table

CompagnieAerienne

contient la colonne

nomComp

)

Les termes de MySQL (bien souvent traduits litteacuteralement de lrsquoanglais) sont noteacutes en italiqueexemple

trigger

table

column

etc

Dans une instruction SQL les symboles deacutesignent une liste drsquoeacuteleacutements et le symbole laquo | raquoun choix (exemple

CREATE

TABLE

|

VIEW

Les symboles laquo [ raquo et laquo ] raquo preacutecisent le carac-tegravere optionnel drsquoune directive au sein drsquoune commande (exemple

CREATE[UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ONtable_name (index_col_namehellip)

)

Ce sigle introduit une deacutefinition un concept ou une remarque importante Il apparaicirct soit dansune partie theacuteorique soit dans une partie technique pour souligner des instructions importantes

ou la marche agrave suivre avec SQL

Ce sigle annonce soit une impossibiliteacute de mise en œuvre drsquoun concept soit une mise en gardeIl est principalement utiliseacute dans la partie consacreacutee agrave SQL

Jrsquoen profite pour faire passer le message suivant si vous travaillez en version 4 de MySQLcertaines instructions deacutecrites dans ce livre ne fonctionneront pas Cet ouvrage nrsquoest pas unguide de reacutefeacuterence Vous trouverez sur le Web des ressources pour connaicirctre la compatibiliteacute

de telle ou telle fonction SQL

Ce sigle indique que le code source est teacuteleacutechargeable agrave partir du site des eacuteditions Eyrolles(wwweyrollescom) Cela est valable pour les exercices corrigeacutes mais aussi pour tous les

exemples du livre

Ce sigle signale une astuce ou un conseil personnel

Web

4055_00c_Lim Page XXI Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

XXII

copy Eacuteditions Eyrolles

Contact avec lrsquoauteur ndash Corrigeacutes des exercices

Si vous avez des remarques agrave formuler sur le contenu de cet ouvrage nrsquoheacutesitez pas agrave mrsquoeacutecrireagrave lrsquoadresse

soutouiut-blagnacfr

Ne me demandez pas de deacuteboguer votre proceacutedurecatalogueacutee ou drsquooptimiser une de vos requecircteshellip Seules les remarques relatives agrave lrsquoouvragetrouveront une reacuteponse

Par ailleurs un site drsquoaccompagnement de lrsquoouvrage (

errata

corrigeacutes des exercices sourcedes exemples et compleacutements) est en ligne et accessible via wwweditions-eyrollescom

4055_00c_Lim Page XXII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

1

Introduction

Dans cette introduction nous preacutesentons tout drsquoabord le cadre geacuteneacuteral dans lequel cetouvrage se positionne (SQL le modegravele de donneacutees et lrsquooffre MySQL) Nous deacutecrivons pourfinir la proceacutedure drsquoinstallation de MySQL sous Windows et lrsquoutilisation de lrsquointerface decommande en ligne pour que vous puissiez programmer en SQL degraves le chapitre 1

SQL une norme un succegraves

Crsquoest IBM

agrave tout seigneur tout honneur

qui avec System-R a implanteacute le modegravele relationnelau travers du langage SEQUEL (

Stuctured English as QUEry Language

) rebaptiseacute par lasuite SQL (

Structured Query Language

)

La premiegravere norme (SQL1) date de 1987 Elle eacutetait le reacutesultat de compromis entre construc-teurs mais elle eacutetait fortement influenceacutee par le dialecte drsquoIBM SQL2 a eacuteteacute normaliseacutee en1992 Elle deacutefinit quatre niveaux de conformiteacute le niveau drsquoentreacutee (

entry level

) les niveauxintermeacutediaires (

transitional

et

intermediate levels

) et le niveau supeacuterieur (

full level

) Leslangages SQL des principaux eacutediteurs sont tous conformes au premier niveau et ont beaucoupde caracteacuteristiques relevant des niveaux supeacuterieurs Depuis 1999 la norme est appeleacutee SQL3Elle comporte de nombreuses parties (concepts objets entrepocircts de donneacutees seacuteries temporel-les accegraves agrave des sources non SQL reacuteplication des donneacutees etc)

Le succegraves que connaissent les eacutediteurs de SGBD relationnels a plusieurs origines et reposenotamment sur SQL

Le langage est une norme depuis 1986 qui srsquoenrichit au fil du temps

SQL peut srsquointerfacer avec des langages de troisiegraveme geacuteneacuteration comme C ou Cobol maisaussi avec des langages plus eacutevolueacutes comme C++ Java ou C Certains considegraverent ainsique le langage SQL nrsquoest pas assez complet (le dialogue entre la base et lrsquointerface nrsquoestpas direct) et la litteacuterature parle de laquo deacutefaut drsquoimpeacutedance raquo (

impedance mismatch

)

Les SGBD rendent indeacutependants programmes et donneacutees (la modification drsquoune structure dedonneacutees nrsquoentraicircne pas forceacutement une importante refonte des programmes drsquoapplication)

Ces systegravemes sont bien adapteacutes aux grandes applications informatiques de gestion (archi-tectures type client-serveur et Internet) et ont acquis une maturiteacute sur le plan de la fiabiliteacuteet des performances

Ils integravegrent des outils de deacuteveloppement comme les preacutecompilateurs les geacuteneacuterateurs decode drsquoeacutetats de formulaires

4055_00d_Intro Page 1 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

2

copy Eacuteditions Eyrolles

Ils offrent la possibiliteacute de stocker des informations non structureacutees (comme le textelrsquoimage etc) dans des champs appeleacutes LOB (

Large Object Binary

)

Nous eacutetudierons les principales instructions SQL de MySQL qui sont classifieacutees dans letableau suivant

Modegravele de donneacutees

Le modegravele de donneacutees relationnelles repose sur une theacuteorie rigoureuse bien qursquoadoptant desprincipes simples La table relationnelle (

relational table

) est la structure de donneacutees de basequi contient des enregistrements appeleacutes aussi laquo lignes raquo (

rows

) Une table est composeacutee decolonnes (

columns

) qui deacutecrivent les enregistrements

Tables et donneacutees

Consideacuterons la figure suivante qui preacutesente deux tables relationnelles permettant de stockerdes compagnies des pilotes et le fait qursquoun pilote soit embaucheacute par une compagnie

Tableau 0-1 Classification des ordres SQL

Ordres SQL Aspect du langage

CREATE ndash ALTER ndash DROP - RENAME ndash TRUNCATE

Deacutefinition des donneacutees (LDD)

INSERT ndash UPDATE ndash DELETE - LOCK TABLE

Manipulation des donneacutees (LMD)

SELECT

Interrogation des donneacutees (LID)

GRANT ndash REVOKE ndash COMMIT ndash ROLLBACK ndash SAVEPOINT - SET TRANSACTION

Controcircle des donneacutees (LCD)

Figure 0-1

Deux tables

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

4055_00d_Intro Page 2 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

3

Introduction

Les cleacutes

La cleacute primaire (

primary key

) drsquoune table est lrsquoensemble minimal de colonnes qui permet

drsquoidentifier de maniegravere unique chaque enregistrement

Dans la figure preacuteceacutedente les colonnes laquo cleacutes primaires raquo sont noteacutees en gras La colonne

comp

repreacutesente le code de la compagnie et la colonne

brevet

deacutecrit le numeacutero du brevet

Une cleacute est dite laquo candidate raquo (

candidate key

) si elle peut se substituer agrave la cleacute primaire agrave tout

instant Une table peut contenir plusieurs cleacutes candidates ou aucune

Dans notre exemple les colonnes

nomComp

et

nom

peuvent ecirctre des cleacutes candidates si onsuppose qursquoaucun homonyme nrsquoest permis

Une cleacute eacutetrangegravere (

foreign key

) reacutefeacuterence dans la majoriteacute des cas une cleacute primaire drsquoune autretable (sinon une cleacute candidate sur laquelle un index unique aura eacuteteacute deacutefini) Une cleacute eacutetrangegravereest composeacutee drsquoune ou de plusieurs colonnes Une table peut contenir plusieurs cleacutes eacutetrangegrave-

res ou aucune

Dans notre exemple la colonne

compa

(noteacutee en italique dans la figure) est une cleacute eacutetrangegraverecar elle permet de reacutefeacuterencer un enregistrement unique de la table

Compagnie

via la cleacuteprimaire

comp

Le modegravele relationnel est ainsi fondamentalement baseacute sur les valeurs Les associations entretables sont toujours binaires et assureacutees par les cleacutes eacutetrangegraveres Les theacuteoriciens considegraverentcelles-ci comme des pointeurs logiques Les cleacutes primaires et eacutetrangegraveres seront deacutefinies dansles tables en SQL agrave lrsquoaide de contraintes

MySQL

MySQL est agrave la fois le nom du SGBD et le nom de la socieacuteteacute (qui se nomme en faitMySQL AB deacutecrite sur httpwwwmysqlcom) dont le siegravege se trouve en Suegravede agrave Uppsala ndashcompter une cinquantaine de kilomegravetres au nord de Stockholm Selon leurs dires leur serveurde donneacutees qui est eacutecrit en C et C++ serait installeacute de faccedilon opeacuterationnelle sur plus de sixmillions de sites Drsquoun point de vue coucirct lrsquoutilisation du SGBD sur des projets importants(entre 250 000

euro

et 500 000

euro

) ferait eacuteconomiser 90 sur le prix des licences du serveur60 sur les ressources systegraveme 70 sur le prix du mateacuteriel 50 sur les tacircches drsquoadminis-tration et de support

4055_00d_Intro Page 3 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

4

copy Eacuteditions Eyrolles

Par analogie avec les systegravemes drsquoexploitation depuis 1999 MySQL connaicirct le succegraves deLinux Teacuteleacutechargeacutee pregraves drsquoun million de fois en trois semaines (en octobre 2005) la version

production

de MySQL doit sa populariteacute du fait de son caractegravere

open source

de ses fonction-naliteacutes de plus en plus riches de ses performances de son ouverture agrave tous les principauxlangages du marcheacute de son fonctionnement sur les systegravemes les plus courants (les distribu-tions classiques de Linux Windows Mac OS BSD Novell et les deacuteriveacutes drsquoUnix) et de safaciliteacute drsquoutilisation pour des applications Web de taille moyenne

Un peu drsquohistoire

Le tableau suivant reacutesume lrsquohistorique des fonctionnaliteacutes importantes du serveur de donneacuteesMySQL Une version majeure comme 323 se deacutecline au fil des mois en diffeacuterentes sous-versions en fonction des diverses phases de deacuteveloppement

alpha

correspond agrave la phase active de nouvelles fonctionnaliteacutes sont ajouteacutees

becircta

correspond agrave lrsquoimpleacutementation des nouvelles fonctionnaliteacutes de la phase

alpha

sansapport important de code

gamma

correspond au terme

release candidate

(apregraves reacutesolution des bugs de la version

becircta

)

production

est lrsquoeacutetape suivante aussi appeleacutee GA (

Generally Available

) Les bugs sontreacutesolus srsquoils ne modifient pas le comportement geacuteneacuteral du serveur

old

correspond agrave la preacuteceacutedente version de production (par rapport agrave la courante)

Ainsi en septembre 2005 la version 4114 eacutetait mise en production et en octobre 2005 laversion 50 lrsquoeacutetait aussi

Ce qui est planifieacute agrave moyen terme concerne un enrichissement geacuteneacuteral des commandes SQLla prise en compte des types manquants de SQL2 et de ODBC3 la programmation des requecirc-tes hieacuterarchiques (interrogation de structures en arbres) en srsquoinspirant de ce qursquoa fait Oracle enla matiegravere (directive

CONNECT BY

dans un

SELECT

)

Tableau 0-2 Dates importantes pour MySQL

Anneacutee ndash versions Caracteacuteristiques principales

1999 ndash 323

x

Reacuteplication ndash Recherches textuelles ndash Transactions et Inteacutegriteacute reacutefeacuterentielle tables InnoDB (2002 ndash 32344)

2001 ndash 40

x

Cache de requecirctes ndash Seacutecurisation SSL ndash Sauvegarde agrave chaud

2003 ndash 41

x

Support de Unicode ndash Donneacutees geacuteographiques ndash SQL dynamique

2004 ndash 50

x

Vues ndash Curseurs ndash Proceacutedures catalogueacutees ndash Deacuteclencheurs ndash Dictionnaire des donneacutees ndash Transactions distribueacutees (XA)

Agrave venir ndash 51

x

Jointure externe ndash Contraintes

CHECK

ndash Sauvegarde agrave chaud et Inteacutegriteacute reacutefeacuterentielle tables MyISAM

4055_00d_Intro Page 4 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

5

Introduction

Ce qui nrsquoest pas encore planifieacute reste la prise en charge du stockage de donneacutees au formatXML et les extensions objets de SQL3 (principalement les types abstraits les heacuteritage et lesmeacutethodes)

Les changements opeacutereacutes sont preacutesenteacutes en deacutetail et par version agrave lrsquoadresse httpdevmysqlcomdocrefman

xy

ennewshtml (

xy

eacutetant le numeacutero de version majeure parexemple actuellement 51)

Offre du moment

La figure suivante (merci au passage agrave httpwwwiconarchivecom) preacutesente la majeurepartie des fonctionnaliteacutes de MySQL qui se positionnent au sein du serveur de donneacutees(SGBD)

Les API permettent drsquointeacutegrer SQL dans des programmes de diffeacuterents langages Le langageSQL sera utiliseacute par tous ceux (manuellement ou par un outil) travaillant sur la base dedonneacutees (administrateur deacuteveloppeur utilisateur) Le langage proceacutedural de MySQL permetdrsquoincorporer nativement tout ordre SQL dans un programme

Concregravetement une fois teacuteleacutechargeacute et installeacute vous avez accegraves agrave un SGBD un client en modetexte (interface de commande) Les pilotes ODBC JDBC API pour les langages C et C++ etles outils

MySQL Administrator

MySQL Query Browser

et

MySQL Migration Toolkit

sont agraveteacuteleacutecharger puis agrave installer seacutepareacutement

Figure 0-2

Offre MySQL

API C JDBC ODBC NET PHP Python Perl Ruby Microsoft VB

Pool de connexions Authentification ndash Reacuteutilisation de processus ndash Cache ndash hellip

Utilitaires Sauvegarde Restauration Reacuteplication Migrat ion Cluster hellip

SQL LDD ndash LMD LCD - Vues Proceacutedures Deacuteclencheurs hellip

Analyseur Requecirctes Privilegraveges

Optimiseur Accegraves Statistiques

Cache Buffers

Moteurs de stockage Meacutemoire - Index

MyISAM InnoDB Archive Cluster Federated

Serveur MysQL

Systegraveme de fichiers NTFS ndash NFS ndash SAN - NAS

Fichiers et logs Donneacutees ndash index - hellip

4055_00d_Intro Page 5 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

6

copy Eacuteditions Eyrolles

Licences

Deux types de licences sont proposeacutes par MySQL commerciale et GPL Dans le cadre drsquoundeacuteveloppement drsquoapplication entiegraverement sous licence GPL MySQL est gratuit Il en va demecircme srsquoil nrsquoest pas copieacute modifieacute distribueacute ou employeacute pour une utilisation en combinaisonavec un serveur Web (si vous deacuteveloppez lrsquoapplication Web vous-mecircme)

Dans tous les autres cas il est neacutecessaire drsquoobtenir une licence commerciale Par exemple sivous incluez un serveur MySQL ou des pilotes MySQL dans une application non

open source

Et la concurrence

Elle fait rage Deux types de concurrents ceux qui sont dans le domaine de lrsquo

open source

etceux qui engrangent des dollars agrave tour de bras

Dans la premiegravere cateacutegorie citons principalement Interbase 6 et Firebird de BorlandPostgreSQL et Berkeley DB

Dans la seconde on trouvera 4D Filemaker IBM (

DB2 UDB

) Informix Microsoft (

SQLServer Access

) Oracle et Sybase (

Adaptive Server SQL Anywhere Studio

) Depuis peu lesgrands eacutediteurs srsquoouvrent agrave la distribution gratuite Ces produits neacutecessitent de solides confi-gurations ce que nrsquoexigent pas les eacutediteurs de la premiegravere cateacutegorie

Fin 2004 Microsoft proposait

SQL Server 2005 Express Edition

qui est limiteacute drsquoun seulCPU 1 Go de meacutemoire et 4 Go de donneacutees

Fin 2004 Sybase offrait

ASE Express Edition

Plusieurs instances peuvent cohabiter surune machine tout en nrsquoutilisant pas plus drsquoun processeur moins de 2 Go de RAM et pasplus de 5 Go de donneacutees

Oracle annonccedilait en novembre 2005 une version gratuite avec

Oracle Database XE

(

Express Edition

) Version toutefois laquo limiteacutee raquo agrave un processeur moins de 1 Go de RAMune seule instance par systegraveme et pas plus de 4 Go de donneacutees

Peu de temps avant IBM avait aussi annonceacute une licence gratuite de

DB2 Express

Pasplus de deux processeurs et moins de 4 Go de RAM

Tout le monde est donc sur les rangs La guerre des versions nrsquoest donc pas finie Bien malinqui pourra preacutedire qui gagnera sur ce terrain

Notion de scheacutema (database)

MySQL appelle

database

un regroupement logique drsquoobjets (tables index vues deacuteclen-cheurs proceacutedures catalogueacutees etc) pouvant ecirctre stockeacutes agrave diffeacuterents endroits de lrsquoespacedisque Je ferai donc souvent reacutefeacuterence au terme laquo base de donneacutees raquo pour parler de cettenotion

On peut aussi assimiler ce concept agrave la notion de scheacutema pour ceux qui connaissent OracleLagrave ougrave MySQL et drsquoautres SGBD diffegraverent crsquoest sur la notion drsquoutilisateur (

user

)

4055_00d_Intro Page 6 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

7

Introduction

Pour tous un utilisateur sera associeacute agrave un mot de passe pour pouvoir se connecter et mani-puler des tables (srsquoil en a le droit bien sucircr)

Pour MySQL il nrsquoy a pas de notion drsquoappartenance drsquoun objet (table index etc) agrave unutilisateur Un objet appartient agrave son scheacutema (

database

) Ainsi deux utilisateurs distincts(

Jules

et

Paul) se connectant sur la mecircme base (database) ne pourront pas creacuteer chacunune table de nom Compagnie Srsquoils doivent le faire ce sera dans deux bases diffeacuterentes(bdjules et bdpaul)

Pour Oracle ou drsquoautres SGBD chaque objet appartient agrave un scheacutema (user) Ainsi deuxutilisateurs distincts Jules et Paul se connectant agrave la base (qui est un ensemble de scheacute-mas) pourront creacuteer chacun une table de nom Compagnie (la premiegravere sera reacutefeacuterenceacuteeJulesCompagnie la seconde PaulCompagnie)

La figure suivante illustre deux utilisateurs travaillant sur diffeacuterentes bases par une interfacequi peut ecirctre la fenecirctre de commande en ligne (dans la majeure partie des enseignements) ouun langage de programmation comme C Java ou PHP (utilisation drsquoune API) Notez deacutejagravelrsquoexistence de trois bases initiales (mysql test et information_schema) que nousdeacutetaillerons au chapitre 5

Notion drsquohocircte

MySQL deacutenomme host la machine heacutebergeant le SGBD MySQL diffegravere aussi agrave ce niveau desautres SGBD car il est possible de distinguer des accegraves drsquoun mecircme utilisateur suivant qursquoil seconnecte agrave partir drsquoune machine ou drsquoune autre La notion drsquoidentiteacute est baseacutee sur le couplenom drsquoutilisateur MySQL (user) cocircteacute serveur machine cliente

Identiteacutes

Ainsi lrsquoutilisateur Paul se connectant depuis la machine camparols peut ne pas ecirctre lemecircme que celui se connectant depuis la machine gambetta Srsquoil srsquoagit du mecircme il faudra auniveau du serveur eacuteventuellement composer un ensemble de preacuterogatives eacutequivalent pour lesdeux accegraves (voir le chapitre 5) Srsquoil srsquoagit de deux personnes diffeacuterentes il faudra distinguer

Figure 0-3 Notions de base et drsquoutilisateur MySQL

Interface

MySQL

Jules Paul

mysql test

information_schema

bdjules bdpaul

4055_00d_Intro Page 7 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

8 copy Eacuteditions Eyrolles

les attributions des diffeacuterents droits La figure suivante illustre le fait que deux utilisateurspeuvent se connecter par deux accegraves diffeacuterents Trois identiteacutes seront donc agrave preacutevoir cocircteacuteserveur

Nous verrons au chapitre 5 comment configurer le serveur et les clients Nous eacutetudierons auchapitre 9 des outils graphiques drsquoaide agrave lrsquoadministration

Accegraves agrave MySQL

Une fois que vous aurez installeacute MySQL sur votre ordinateur vous serez libre de choisirlrsquoaccegraves qui vous convient Ce livre utilise essentiellement lrsquointerface de commande en lignefournie avec le SGBD mais aussi Java via JDBC et le navigateur Web au travers de PHP

Aspects eacutetudieacutes

Nous nrsquoeacutetudierons pas tous les eacuteleacutements drsquoune base car certains sont assez speacutecifiques etsortent du cadre traditionnel de lrsquoenseignement mecircme supeacuterieur Le tableau suivant indiquedans quel chapitre du livre les principaux eacuteleacutements drsquoun scheacutema sont eacutetudieacutes

Figure 0-4 Notion drsquohocircte MySQL

brassens

Jules

Paul

mysql test

julesgambetta

paulcamparols

camparols

gambetta

Paul paulgambetta

TCP-IP

Tableau 0-3 Eacuteleacutements drsquoune base MySQL

Eacuteleacutements eacutetudieacutes ndash Chapitre Aspects non eacutetudieacutes

Deacuteclencheurs (triggers) ndash 7Fonctions et proceacutedures ndash 7Tables et index ndash 1Seacutequences ndash 2 5Vues (views) et utilisateurs ndash 5

Clusters ndash Moteurs de stockage (storage engine) ndash Partitionnement ndash Donneacutees spatiales

4055_00d_Intro Page 8 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 9

Introduction

Mise en œuvre de MySQL (sous Windows)

Si tout se passe bien comptez quelques minutes pour installer MySQL Je vous conseilletoutefois de creacuteer un point de restauration Windows pour pouvoir revenir agrave votre derniegraverebonne configuration connue Extraire lrsquoarchive teacuteleacutechargeacutee sur le site officiel de MySQL AB(httpdevmysqlcomdownloads) dans un reacutepertoire temporaire (exemple CTemp) puisexeacutecuter Setupexe

Installation

Le premier choix est donneacute pour le type drsquoinstallation typique complegravete et personnaliseacutee ndashchoisir typique dans un premier temps

Le deuxiegraveme eacutecran vous invite agrave vous enregistrer ndash ce nrsquoest pas obligatoire mais conseilleacutetoutefois pour saluer lrsquoeacutenorme travail fait par ces jeunes informaticiens de geacutenie (voilagrave lapommade est passeacutee)

La suite concerne la configuration du serveur de donneacutees (choisir la configuration deacutetailleacuteepour suivre les diffeacuterentes eacutetapes et mieux comprendre le parameacutetrage de votre serveur)

Lrsquoassistant propose en premier lieu de deacuteterminer le type de votre serveur (machine dedeacuteveloppement serveur ou machine deacutedieacutee) Jrsquoai opteacute pour le premier choix

Choissisez ensuite le type de base de donneacutees que vous comptez exploiter (multifonctionmode transactionnel seulement ou jamais transactionnel) Jrsquoai opteacute pour le premier choix

Deacuteterminez ensuite le reacutepertoire qui contiendra les donneacutees des bases InnoDB (crsquoest letype de tables que nous utiliserons dans cet ouvrage car eacutetant le seul dans cette version agraveprendre en charge les cleacutes eacutetrangegraveres) Jrsquoai opteacute pour le choix par deacutefaut

Choissisez ensuite lrsquooption qui convient agrave votre utilisation (en fonction du nombre deconnexions) Jrsquoai opteacute pour le premier choix (vingt connexions maximum)

Il est ensuite possible de modifier le port UDP drsquoeacutecoute (par deacutefaut 3306) et le modecomportemental du serveur par rapport agrave la syntaxe des instructions SQL Jrsquoai opteacute pour lepremier choix (mode strict)

Attention agrave ne pas seacutelectionner un jeu de caractegraveres japonais dans lrsquoeacutecran qui arrive Jrsquoaiopteacute pour les choix par deacutefaut (West European et latin1)

Lrsquoeacutecran suivant permet de deacuteclarer MySQL comme un service Windows (qursquoon pourraarrecircter via le panneau de configuration plutocirct qursquoavec une belle commande en ligne ou parun Ctrl-Alt-Suppr bien connu des bidouilleurshellip) Penser aussi agrave inclure dans le path lechemin de lrsquoexeacutecutable mysql de maniegravere agrave pouvoir lancer une connexion en ligne decommande Il vous suffit de cocher la case approprieacutee

Saisissez un mot de passe pour root vous pouvez aussi creacuteer un compte anonyme(connexion fantocircme sans utilisateur ni mot de passe)

4055_00d_Intro Page 9 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

10 copy Eacuteditions Eyrolles

Apregraves avoir valideacute la demande drsquoexeacutecution (bouton Execute) quelques secondes vontsrsquoeacutecouler avant qursquoon vous invite agrave terminer lrsquoinstallation

Voilagrave MySQL est installeacute Si ce nrsquoest pas le cas la section suivante vous aidera sucircrementDerniegravere chose si vous nrsquoutilisez pas souvent MySQL pensez agrave arrecircter et agrave positionner surManuel le service (ce nrsquoest pas pour lrsquoespace qursquoil occupe 10 Mo en RAM)

Pour modifier une configuration existante vous trouverez un assistant dans DeacutemarrerMySQLhellipMySQL Server Instance Wizard

Deacutesinstallation

Pour supprimer une configuration vous trouverez un assistant dans DeacutemarrerTous lesprogrammesMySQLhellipMySQL Server Instance Wizard choix Remove InstanceCependant le reacutepertoire installeacute par deacutefaut dans Program Files reste sur le disque (compterune centaine de meacutega-octets) De mecircme qursquoen ce qui concerne les entreacutees dans le menu Deacutemar-rer je ne parle pas de la base de registres qui est inchangeacuteehellip

Dans Panneau de configuration AjoutSuppression de programmes supprimerMySQL Server Il reste encore des choses dans la base de registres Le reacutepertoire MySQL sousProgram Files a diminueacute de taille mais il est toujours preacutesent Une fois que tout est faitredeacutemarrez votre machine et reprenez lrsquoinstallation initiale Prudence si vous modifiez leschemins des reacutepertoires des donneacutees entre plusieurs installations

Reconfiguration

En relanccedilant une installation il vous est donneacute drsquoajouter des composants (option Modify) sivous nrsquoavez pas fait une installation complegravete au deacutebut Vous avez aussi la possibiliteacute delaquo reacuteparer raquo (option Repair) une configuration existante

Premiers pas

La proceacutedure suivante va guider vos premiers pas pour travailler sous cette interface drsquounemaniegravere laquo professionnelle raquo Il srsquoagit de stocker vos fichiers de commande qui pourront serviragrave diffeacuterentes actions (creacuteations de tables de vues ou drsquoutilisateurs insertions modificationsou suppressions drsquoenregistrements eacutelaboration de requecirctes de proceacutedures catalogueacutees etc)

Lrsquointerface de commande

Lrsquointerface de commande en ligne porte le nom du SGBD (mysql) Cette interface ressembleagrave une fenecirctre DOS ou telnet et permet de dialoguer de la plus simple faccedilon avec la base dedonneacutees Lrsquoutilisation peut ecirctre interactive ou laquo batch raquo Quand lrsquoutilisation est interactive

4055_00d_Intro Page 10 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 11

Introduction

(crsquoest le mode le plus courant) le reacutesultat des extractions est preacutesenteacute sous une forme tabulaireau format ASCII

Vous verrez qursquoil est notamment possible

drsquoexeacutecuter des instructions SQL (creacuteeacuter des tables manipuler des donneacutees extraire desinformations etc)

de compiler des proceacutedures catalogueacutees et des deacuteclencheurs

de reacutealiser des tacircches drsquoadministration (creacuteation drsquoutilisateurs attribution de privilegravegesetc)

Le principe geacuteneacuteral de lrsquointerface est le suivant apregraves une connexion locale ou distante desinstructions sont saisies et envoyeacutees agrave la base qui retourne des reacutesultats afficheacutes dans la mecircmefenecirctre de commande

Nrsquoayez pas honte de bien maicirctriser cette interface au lieu de connaicirctre toutes les options drsquounoutil graphique (comme PhpMyAdmin MySQL Administrator ou autre) Il vous sera toujoursplus facile de vous adapter aux diffeacuterents boutons et menus tout en connaissant les instruc-tions SQL que lrsquoinverse

Imaginez-vous un jour agrave Singapour sur une machine ne disposant pas drsquooutils graphiques quele client vous demande la reacuteduction que vous pouvez lui faire sur la vente drsquoune piscine inteacute-rieure drsquoun Airbus A380 et que vous devez interroger (ou mettre agrave jour) une table sur leserveur du siegravege social agrave Blagnac Vous ne savez pas vous servir de lrsquointerface en ligne vousnrsquoecirctes pas un vrai informaticien

Creacuteation drsquoun utilisateur

Vous allez maintenant creacuteer un utilisateur MySQL Ouvrez le fichier premierPassql qui setrouve dans le reacutepertoire Introduction agrave lrsquoaide du bloc-notes (ou drsquoun eacutediteur de texte de votre

Figure 0-5 Principe geacuteneacuteral de lrsquointerface de commande en ligne

mysql [options] [nomBase] [entreacutees-sorties]

quit ou exit

mysqlgt INSERT hellip

mysqlgt CREATE hellip

mysqlgt SELECT hellip

hellip

mysqlgt

mysql

Systegraveme drsquoexploitation

nomBase

Web

4055_00d_Intro Page 11 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

12 copy Eacuteditions Eyrolles

choix) Changez laquo util raquo par le nom de lrsquoutilisateur agrave creacuteer (modifiez aussi le nom de la base) Vouspouvez changer le mot de passe si vous voulez Enregistrez ce fichier dans un de vos reacutepertoires

Connexion au serveur

Dans une fenecirctre de commande Windows Linux (ou autre) lancer lrsquointerface en ligne enconnectant lrsquoutilisateur root avec le mot de passe que vous avez donneacute lors de lrsquoinstallation

mysql --user=root -p

Une fois connecteacute par copier-coller (en effectuant un clic droit dans la fenecirctre de commandeMySQL) exeacutecutez une agrave une les diffeacuterentes instructions (creacuteation de la base de lrsquoutilisateurdes privilegraveges et deacuteconnexion de root) Nous eacutetudierons au chapitre 5 les notions eacuteleacutementai-res de droits et de seacutecuriteacute Les lignes preacuteceacutedeacutees de laquo -- raquo sont des commentaires

Voilagrave votre utilisateur (util) est creacuteeacute il peut se connecter et il possegravede toutes les preacuterogatives sur labase (bdutil) pour exeacutecuter les instructions deacutecrites dans cet ouvrage Pour tester votre connexionlancez la commande suivante qui se connecte au serveur sur la base bdutil sous lrsquoutilisateur util

mysql --user=util --host=localhost -p --database=bdutil

Veacuterification de la version

Pour controcircler la version du serveur sur lequel vous ecirctes connecteacute exeacutecutez la connexion-deacuteconnexion suivante dans une fenecirctre de commande Windows Linux (ou autre)

mysql --version

Si vous ecirctes deacutejagrave connecteacute la commande laquo SELECT VERSION() raquo vous renseignera eacutegale-ment agrave propos de la version du SGBD Si vous nrsquoecirctes pas en version 5 il vous sera impossiblede travailler avec des proceacutedures catalogueacutees vues et deacuteclencheurs Pour ma part lors de lareacutedaction de cet ouvrage cette commande a renvoyeacute le reacutesultat suivant

Figure 0-6 Interface en mode ligne de commande

4055_00d_Intro Page 12 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 13

Introduction

+-----------+

| VERSION() |

+-----------+

| 5015-nt |

+-----------+

Options de base

Les principales options au lancement de mysql sont reacutesumeacutees dans le tableau suivant

Tableau 0-4 Principales options de la commande mysql

Option Commentaire

--help ou - Affiche les options disponibles lrsquoeacutetat des variables drsquoenvironnement etrend la main

--batch ou -B Toute commande SQL peut ecirctre lanceacutee dans la fenecirctre de commandesystegraveme sans pour autant voir lrsquoinvite les reacutesultats (colonnes) sontseacutepareacutes par des tabulations

--database=nomBD ou ndashD nomBD

Seacutelection de la base de donneacutees agrave utiliser apregraves la connexion

--host=nomServeur ou -h nomServeur

Deacutesignation du serveur

--html ou -H Formate le reacutesultat des extractions en HTML

--one-database ou -O Restreint les instructions agrave la base de donneacutees speacutecifieacutee initialement

-p Demande le mot de passe sans lrsquoemployer en tant que paramegravetre

--password=motdePasse Transmission du mot de passe de lrsquoutilisateur agrave connecter Eacutevitez cetteoption et preacutefeacuterez la preacuteceacutedentehellip

--prompt=parametre Personnalise lrsquoinvite de commande (par deacutefaut mysqlgt)

--silent ou -s Configure le mode silence pour reacuteduire les messages de MySQL

--skip-column-names ou -N

Nrsquoeacutecrit aucun en-tecircte de colonne pour les reacutesultats drsquoextraction

--table ou -t Formate le reacutesultat des extractions en tables agrave en-tecircte de colonne (pardeacutefaut dans le mode interactif)

--tee=cheminNomFichier Copie la trace de toute la session dans le fichier que vous indiquez

--user=utilisateur ou -u utilisateur

Deacutesigne lrsquoutilisateur devant se connecter

--verbose ou -v Mode verbeux pour avoir davantage de messages du serveur

--version ou -V Affiche la version du serveur et rend la main

--vertical ou -E Affiche les reacutesultats des extractions verticalement (non plus en ligneshorizontales)

--xml ou -X Formate le reacutesultat des extractions en XML Les noms de balisesgeacuteneacutereacutees sont ltresultsetgt pour la table reacutesultat ltrowgtpour chaque ligne et ltfieldgt pour les colonnes

4055_00d_Intro Page 13 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

14 copy Eacuteditions Eyrolles

Ces options peuvent se combiner en les seacuteparant simplement par un espace (exemple mysql--tee=Ddevsortiemysqltxt --database=bdsoutou va se connecteranonymement agrave la base bdsoutou en inscrivant le contenu de la trace de la session dans lefichier sortiemysqltxt situeacute dans le reacutepertoire Ddev)

Le tableau suivant reacutesume les principaux paramegravetres pour afficher les invites de commande(relatives agrave lrsquooption prompt)

Batch

Pour lancer plusieurs commandes regroupeacutees dans un fichier agrave extension laquo sql raquo il fautpreacuteciser le chemin du fichier et celui qui contiendra les eacuteventuels reacutesultats (crsquoest du laquo brut dedeacutecoffrage raquo ) Ainsi lrsquoinstruction suivante exeacutecute dans la base bdsoutou sous lrsquoautoriteacutede lrsquoutilisateur soutou les commandes contenues dans le fichier Testbatchsql situeacutedans le reacutepertoire Ddev (notez lrsquoutilisation du double back-slash pour deacutesigner une arbo-rescence Windows) Le reacutesultat sera consigneacute dans le fichier sortietxt du mecircme reacuteper-toire

mysql --user=soutou --password=iut bdsoutou

Votre prompt et vite

Lrsquoexeacutecution de lrsquoinstruction laquo mysql --prompt=(uh) [d]gt --user=root ndashp raquodans une fenecirctre de commande shell ou DOS connectera lrsquoutilisateur root en lui demandantson mot de passe Lrsquoinvite de commande agrave lrsquoaffichage sera de la forme suivante

Tableau 0-5 Principales options de lrsquoinvite de commandes

Option Commentaire

v Version du serveur

d Base de donneacutees en cours drsquoutilisation

h Nom du serveur

u Nom drsquoutilisateur

U Nom drsquoutilisateur long (au format nomserveur)

_ Un espace

R Heure (0 agrave 23)

m Minutes

s Secondes

Y Anneacutee sur quatre chiffres

D Date en cours

c Compteur drsquoinstructions

ltDdevTestbatchsql gtDdevsortietxt

4055_00d_Intro Page 14 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 15

Introduction

(rootlocalhost) [bdsoutou]gt une fois que root aura seacutelectionneacute la base bdsou-tou (par la commande laquo use nombase raquo)

Configurez votre invite de commande SQL dans le fichier de configuration myini situeacute enprincipe dans le reacutepertoire CProgram FilesMySQLMySQL Server xx de la maniegravere quivous convient le plus

Pour ma part jrsquoai ajouteacute les deux lignes suivantes sous la section [mysql] elle-mecircme situeacuteesous lrsquoeacutetiquette [client]

mon prompt

prompt=(uh) [d]_mysqlgt_

Une fois le serveur redeacutemarreacute en consideacuterant que votre compte srsquoappelle util toutes voscommandes SQL devraient en principe ecirctre preacutefixeacutees de la syntaxe suivante

(utillocalhost) [bdutil] mysqlgt

Commandes de base

Une fois connecteacute vous pouvez utiliser des commandes ou faire des copier-coller drsquoun eacutediteurde texte dans lrsquointerface mysql (ce moyen de faire correspond plus agrave un environnement detest qui conviendra agrave lrsquoapprentissage) Le tableau suivant reacutesume les principales instructionspour manipuler le buffer drsquoentreacutee de lrsquointerface

La commande source est tregraves utile pour eacuteviter les copier-coller de trop nombreuses instructions

Tableau 0-6 Commandes de base du buffer drsquoentreacutee

Commande Commentaire

Affichage des commandes disponibles

delimiter chaicircne Modifie le deacutelimiteur (par deacutefaut laquo raquo)

use nomBase Rend une base de donneacutees courante

prompt chaicircne Modifie lrsquoinvite de commande avec les paramegravetres vus preacuteceacutedemment

quit ou exit Quitte lrsquointerface

source cheminNomFichiersql Charge et exeacutecute dans le buffer le contenu du cheminNomFichiersql (ex source DdevTestbatchsql exeacutecutera le script Testbatchsql situeacute dans Ddev)

tee nomFichierSortie Creacuteation nomFichierSortie dans le reacutepertoire CProgram FilesMySQLMySQL Server nnbin qui contiendra la trace de la session

4055_00d_Intro Page 15 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

4055_00d_Intro Page 16 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Partie I

SQL de base

4055_00e_P01 Page 17 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

4055_00e_P01 Page 18 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

19

Chapitre 1

Deacutefinition des donneacutees

Ce chapitre deacutecrit les instructions SQL qui constituent lrsquoaspect LDD (langage de deacutefinitiondes donneacutees) Agrave cet effet nous verrons notamment comment deacuteclarer une table avec ses eacuteven-tuels index et contraintes

Tables relationnelles

Une table est creacuteeacutee en SQL par lrsquoinstruction

CREATE TABLE

modifieacutee au niveau de sa struc-ture par lrsquoinstruction

ALTER TABLE

et supprimeacutee par la commande

DROP TABLE

Creacuteation drsquoune table (

CREATE TABLE

)

Pour pouvoir creacuteer une table dans votre base il faut que vous ayez reccedilu le privilegravege

CREATE

Le meacutecanisme des privilegraveges est deacutecrit au chapitre 5

La syntaxe SQL simplifieacutee est la suivante

CREATE

[TEMPORARY]

TABLE

[IF NOT EXISTS] [

nomBase

]

nomTable

(

colonne1 type1

[NOT NULL | NULL] [DEFAULT

valeur1

] [COMMENT

chaine1

]

[

colonne2 type2

[NOT NULL | NULL] [DEFAULT

valeur2

] [COMMENT

chaine2

] ]

[CONSTRAINT

nomContrainte1 typeContrainte1

]

)

[ENGINE= InnoDB | MyISAM |

]

TEMPORARY

pour creacuteer une table qui nrsquoexistera que durant la session courante (la tablesera supprimeacutee agrave la deacuteconnexion) Deux connexions peuvent ainsi creacuteer deux tablestemporaires de mecircme nom sans risquer de conflit Il faut posseacuteder le privilegravege

CREATETEMPORARY TABLES

IF NOT EXISTS

permet drsquoeacuteviter qursquoune erreur se produise si la table existe deacutejagrave (sicrsquoest le cas elle nrsquoest aucunement affecteacutee par la tentative de creacuteation)

nomBase

(jusqursquoagrave 64 caractegraveres permis dans un nom de reacutepertoire ou de fichier sauflaquo

raquo laquo

raquo et laquo

raquo) srsquoil est omis il sera assimileacute agrave la base connecteacutee Srsquoil est preacuteciseacute il

4055_01_C01 Page 19 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

20

copy Eacuteditions Eyrolles

deacutesigne soit la base connecteacutee soit une autre base (dans ce cas il faut que lrsquoutilisateurcourant ait le droit de creacuteeacuter une table dans lrsquoautre base) Nous aborderons ces points dansle chapitre Controcircle des donneacutees et nous consideacutererons jusque-lagrave que nous travaillons dansla base courante (ce sera votre configuration la plupart du temps)

nomTable

mecircmes limitations que pour le nom de la base

colonnei typei

nom drsquoune colonne (mecircmes caracteacuteristiques que pour les noms destables) et son type (

INTEGER

CHAR

DATE

hellip) Nous verrons quels types sont disponiblessous MySQL La directive

DEFAULT

fixe une valeur par deacutefaut La directive

NOT NULL

interdit que la valeur de la colonne soit nulle

NULL

repreacutesente une valeur qursquoon peut consideacuterer comme non disponible non affecteacutee incon-nue ou inapplicable Elle est diffeacuterente drsquoun espace pour un caractegravere ou drsquoun zeacutero pour un

nombre

COMMENT

(jusqursquoagrave 60 caractegraveres) permet de commenter une colonne Ce texte seraensuite automatiquement afficheacute agrave lrsquoaide des commandes

SHOW CREATE TABLE

et

SHOWFULL COLUMNS

(voir le chapitre 5)

nomContraintei typeContraintei

nom de la contrainte et son type (cleacute primairecleacute eacutetrangegravere etc) Nous allons deacutetailler dans le paragraphe suivant les diffeacuterentescontraintes possibles

ENGINE

deacutefinit le type de table (par deacutefaut

InnoDB

bien adapteacute agrave la programmation detransactions et adopteacute dans cet ouvrage)

MyISAM

correspond au type par deacutefaut desversions 3 parfaitement robuste mais ne supportant pas pour lrsquoheure lrsquointeacutegriteacute reacutefeacuteren-tielle Drsquoautres types existent citons

MEMORY

pour les tables temporaires

ARCHIVE

etc

laquo

raquo symbole par deacutefaut qui termine une instruction MySQL en mode ligne decommande (en lrsquoabsence drsquoun autre deacutelimiteur)

Deacutelimiteurs

En mode ligne de commande il est possible (par la directive

delimiter

) de choisir lesymbole qui terminera chaque instruction Dans lrsquoexemple suivant on choisit le dollar aucours de lrsquoouvrage nous resterons avec le symbole par deacutefaut de MySQL agrave savoir laquo raquo

delimiter $

CREATE TABLE Test (t CHAR(8))$

Sensibiliteacute agrave la casse

Alors que MySQL est sensible par deacutefaut agrave la casse (au niveau des noms de base et de table)dans la plupart des distributions Unix il ne lrsquoest pas pour Windows En revanche concernantles noms de colonnes index alias de colonnes deacuteclencheurs et proceacutedures catalogueacutees

4055_01_C01 Page 20 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

21

chapitre ndeg 1 Deacutefinition des donneacutees

MySQL nrsquoest pas sensible agrave la casse tous systegravemes confondus En fait tous ces noms sontstockeacutes en minuscules dans le dictionnaire de donneacutees

La variable

lower_case_table_names

permet de forcer la sensibiliteacute agrave la casse pourles noms des tables et des bases de donneacutees (si elle vaut 0 la sensibiliteacute agrave la casse est active etles noms sont stockeacutes en minuscules 1 pas de sensibiliteacute agrave la casse et les noms sontstockeacutes en minuscules 2 pas de sensibiliteacute agrave la casse et les noms sont stockeacutes en respectant lacasse)

Je vous invite agrave positionner cette variable agrave 0 de maniegravere agrave homogeacuteneacuteiser le codage et agravecontrocircler un peu plus lrsquoeacutecriture de vos instructions SQL De plus crsquoest lrsquooption par deacutefaut surLinux Dans le fichier

myini

sous la section serveur identifieacutee par [

mysqld

] ajouter laligne et le commentaire suivants

Rend sensible agrave la CASSE les noms de tables et de database

lower_case_table_names=0

Refusez ce type de programmation (rendue impossible drsquoailleurs si la variable

lower_case_table_names

est positionneacutee agrave 0)

mysqlgt SELECT FROM

Avion

WHERE

AVION

capacite gt 150

Par ailleurs la casse devrait toujours avoir (quel que soit le SGBD concerneacute) une incidencemajeure dans les expressions de comparaison entre colonnes et valeurs que ce soit dans uneinstruction SQL ou un test dans un programme

Ainsi lrsquoexpression laquo

nomComp=Air France

raquo a la mecircme signification que lrsquoexpressionlaquo

nomComp=AIR France

raquo avec MySQL Horreur oui

Donc si vous deacutesirez veacuterifier la casse au sein mecircme des donneacutees il faudra utiliser la fonction

BINARY()

qui convertit en bits une expression En effet laquo

BINARY(AIR France)

raquo est dif-feacuterent de laquo

BINARY(Air France)

raquo et laquo

BINARY(nomComp)=BINARY(Air France)

raquo

renverra vrai en respectant la casse

Commentaires

Dans toute instruction SQL (deacuteclaration manipulation interrogation et controcircle des donneacutees)il est possible drsquoinclure des retours chariot des tabulations espaces et commentaires (sur uneligne preacuteceacutedeacutee de deux tirets laquo

ndash - raquo en fin de ligne agrave lrsquoaide du diegravese laquo raquo au sein drsquouneligne ou sur plusieurs lignes entre laquo raquo et laquo raquo) Les scripts suivants deacutecrivent la deacutecla-ration drsquoune mecircme table en utilisant diffeacuterentes conventions

4055_01_C01 Page 21 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

22 copy Eacuteditions Eyrolles

Comme nous le conseillons dans lrsquoavant-propos il est preacutefeacuterable drsquoutiliser les conventionssuivantes

bull Tous les mots-cleacutes de SQL sont noteacutes en majuscules

bull Les noms de tables sont noteacutes en Minuscules (excepteacute la premiegravere lettre ces noms serontquand mecircme stockeacutes dans le systegraveme en minuscules)

bull Les noms de colonnes et de contraintes en minuscules

Lrsquoadoption de ces conventions rendra vos requecirctes scripts et programmes plus lisibles (un peuagrave la mode Java)

Premier exemple

Le tableau ci-apregraves deacutecrit lrsquoinstruction SQL qui permet de creacuteer la table Compagnie illustreacuteepar la figure suivante dans la base bdsoutou (lrsquoabsence du preacutefixe laquo bdsoutou raquo conduiraitau mecircme reacutesultat si bdsoutou eacutetait la base connecteacutee lors de lrsquoexeacutecution du script)

Tableau 1-1 Diffeacuterentes eacutecritures SQL

Sans commentaire Avec commentaires

CREATE TABLE Test(colonneDECIMAL(388))

CREATE TABLE Test (colonne DECIMAL(388))

CREATE TABLE -- nom de la tableTest( deacutebut de la description COLONNE DECIMAL(388) )-- fin ne pas oublier le point-virguleCREATE TABLE Test ( une plus grande description des colonnes COLONNE type DECIMAL(388))

Figure 1-1 Table agrave creacuteer

Compagnie

comp nrue rue ville nomComp

4055_01_C01 Page 22 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 23

chapitre ndeg 1 Deacutefinition des donneacutees

Contraintes

Les contraintes ont pour but de programmer des regravegles de gestion au niveau des colonnes destables Elles peuvent alleacuteger un deacuteveloppement cocircteacute client (si on deacuteclare qursquoune note doit ecirctrecomprise entre 0 et 20 les programmes de saisie nrsquoont plus agrave tester les valeurs en entreacutee maisseulement le code retour apregraves connexion agrave la base on deacuteporte les contraintes cocircteacute serveur)

Les contraintes peuvent ecirctre deacuteclareacutees de deux maniegraveres

En mecircme temps que la colonne (valable pour les contraintes monocolonnes) ces contrain-tes sont dites laquo en ligne raquo (inline constraints) Lrsquoexemple preacuteceacutedent en deacuteclare deux

Apregraves que la colonne est deacuteclareacutee ces contraintes ne sont pas limiteacutees agrave une colonne etpeuvent ecirctre personnaliseacutees par un nom (out-of-line constraints)

Il est recommandeacute de deacuteclarer les contraintes NOT NULL en ligne les autres peuvent soit ecirctredeacuteclareacutees en ligne soit ecirctre nommeacutees Eacutetudions agrave preacutesent les types de contraintes nommeacutees(out-of-line) Les quatre types de contraintes les plus utiliseacutees sont les suivants

CONSTRAINT nomContrainte

UNIQUE (colonne1 [colonne2])

PRIMARY KEY (colonne1 [colonne2])

FOREIGN KEY (colonne1 [colonne2])

REFERENCES nomTablePere [(colonne1 [colonne2])]

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

CHECK (condition)

La contrainte UNIQUE impose une valeur distincte au niveau de la table (les valeurs nullesfont exception agrave moins que NOT NULL soit aussi appliqueacutee sur les colonnes)

La contrainte PRIMARY KEY deacuteclare la cleacute primaire de la table Un index est geacuteneacutereacute auto-matiquement sur la ou les colonnes concerneacutees Les colonnes cleacutes primaires ne peuventecirctre ni nulles ni identiques (en totaliteacute si elles sont composeacutees de plusieurs colonnes)

Tableau 1-2 Creacuteation drsquoune table et de ses contraintes

Instruction SQL Commentaires

CREATE TABLE bdsoutouCompagnie (comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) DEFAULT Paris COMMENT Par defaut Paris nomComp CHAR(15) NOT NULL)

La table contient cinq colonnes (quatre chaicircnes de caractegraveres et un numeacuterique de trois chiffres) La colonne ville est commenteacuteeLa table inclut en plus deux contraintes bull DEFAULT qui fixe Paris comme valeur par deacutefaut

de la colonne ville bull NOT NULL qui impose une valeur non nulle dans

la colonne nomComp

4055_01_C01 Page 23 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

24 copy Eacuteditions Eyrolles

La contrainte FOREIGN KEY deacuteclare une cleacute eacutetrangegravere entre une table enfant (child) et unetable pegravere (parent) Ces contraintes deacutefinissent lrsquointeacutegriteacute reacutefeacuterentielle que nous aborde-rons plus tard Les directives ON UPDATE et ON DELETE disposent de quatre options quenous deacutetaillerons avec les directives MATCH agrave la section Inteacutegriteacute reacutefeacuterentielle duchapitre 2)

La contrainte CHECK impose un domaine de valeurs ou une condition simple ou complexe entrecolonnes (exemple CHECK (note BETWEEN 0 AND 20) CHECK (grade=Copilote ORgrade=Commandant)) Cette contrainte est prise en charge au niveau de la deacuteclarationmais nrsquoest pas encore opeacuterationnelle mecircme dans la version 51

Il est recommandeacute de ne pas deacutefinir de contraintes sans les nommer (bien que cela soit possi-ble) car il sera difficile de les faire eacutevoluer (deacutesactivation reacuteactivation suppression) et la lisi-biliteacute des programmes en sera affecteacutee

Nous verrons au chapitre 3 comment ajouter supprimer deacutesactiver et reacuteactiver des contraintes(options de la commande ALTER TABLE)

Conventions recommandeacutees

Adoptez les conventions drsquoeacutecriture suivantes pour vos contraintes

bull Preacutefixez par pk_ le nom drsquoune contrainte cleacute primaire fk_ une cleacute eacutetrangegravere ck_ une veacuteri-fication un_ une uniciteacute

bull Pour une contrainte cleacute primaire suffixez du nom de la table la contrainte (exemple pk_Avion)

bull Pour une contrainte cleacute eacutetrangegravere renseignez (ou abreacutegez) les noms de la table source dela cleacute et de la table cible (exemple fk_Pil_compa_Comp)

En respectant nos conventions deacuteclarons les tables de lrsquoexemple suivant (Compagnie avec sacleacute primaire et Avion avec sa cleacute primaire et sa cleacute eacutetrangegravere) Du fait de lrsquoexistence de la cleacuteeacutetrangegravere la table Compagnie est dite laquo parent raquo (ou laquo pegravere raquo) de la table Avion laquo enfant raquo(ou laquo fils raquo) Cela reacutesulte de la traduction drsquoune association un-agrave-plusieurs entre les deuxtables (De UML agrave SQL Eyrolles 2002) Nous reviendrons sur ces principes agrave la section Inteacute-griteacute reacutefeacuterentielle du prochain chapitre

4055_01_C01 Page 24 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 25

chapitre ndeg 1 Deacutefinition des donneacutees

Remarques

bull Lrsquoordre nrsquoest pas important dans la deacuteclaration des contraintes nommeacutees

bull PRIMARY KEY eacutequivaut agrave UNIQUE + NOT NULL + index

bull Lrsquoordre de creacuteation des tables est important quand on deacutefinit les contraintes en mecircme tempsque les tables (on peut diffeacuterer la creacuteation ou lrsquoactivation des contraintes voir le chapitre 3)Il faut creacuteer drsquoabord les tables laquo pegraveres raquo puis les tables laquo fils raquo Le script de destruction destables suit le raisonnement inverse

Figure 1-2 Deux tables relieacutees agrave creacuteer

Tableau 1-3 Contraintes en ligne et nommeacutees

Tables Contraintes

CREATE TABLE Compagnie(comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) DEFAULT Paris COMMENT Par defaut Paris nomComp CHAR(15) NOT NULL CONSTRAINT pk_Compagnie PRIMARY KEY(comp))

Deux contraintes en ligneet une contrainte nommeacuteede cleacute primaire

CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) NOT NULL nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT ck_nbHVol CHECK(nbHVol BETWEEN 0 AND 20000) CONSTRAINT un_nom UNIQUE (nom) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))

Une contrainte en ligneet quatre contraintes nommeacutees bull Cleacute primairebull NOT NULLbull CHECK (nombre drsquoheures de vol

compris entre 0 et 20 000)bull UNIQUE (homonymes interdits)bull Cleacute eacutetrangegravere

Pilote

brevet nom nbHVol compa

Compagnie

comp nrue rue ville nomComp

Web

4055_01_C01 Page 25 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

26 copy Eacuteditions Eyrolles

Types des colonnes

Pour deacutecrire les colonnes drsquoune table MySQL fournit les types preacutedeacutefinis suivants (built-indatatypes)

caractegraveres (CHAR VARCHAR TINYTEXT TEXT MEDIUMTEXT LONGTEXT)

valeurs numeacuteriques (TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINTFLOAT DOUBLE REAL DECIMAL NUMERIC et BIT)

dateheure (DATE DATETIME TIME YEAR TIMESTAMP)

donneacutees binaires (BLOB TINYBLOB MEDIUMBLOB LONGBLOB)

eacutenumeacuterations (ENUM SET)

Deacutetaillons agrave preacutesent ces types Nous verrons comment utiliser les plus courants au chapitre 2et les autres au fil de lrsquoouvrage

Caractegraveres

Le type CHAR permet de stocker des chaicircnes de caractegraveres de taille fixe Les valeurs sontstockeacutees en ajoutant srsquoil le faut des espaces (trailing spaces) agrave concurrence de la tailledeacutefinie Ces espaces ne seront pas consideacutereacutes apregraves extraction agrave partir de la table

Le type VARCHAR permet de stocker des chaicircnes de caractegraveres de taille variable Les valeurssont stockeacutees sans lrsquoajout drsquoespaces agrave concurrence de la taille deacutefinie Depuis la version 503de MySQL les eacuteventuels espaces de fin de chaicircne seront stockeacutes et extraits en conformiteacuteavec la norme SQL Des caractegraveres Unicode (meacutethode de codage universelle qui fournit unevaleur de code unique pour chaque caractegravere quels que soient la plate-forme le programme oula langue) peuvent aussi ecirctre stockeacutes

Tableau 1-4 Types de donneacutees caractegraveres

Type Description Commentaire pour une colonne

CHAR(n) [BINARY | ASCII| UNICODE]

Chaicircne fixe de n octets ou caractegraveres

Taille fixe (maximum de 255 caractegraveres)

VARCHAR(n) [BINARY] Chaicircne variable de n caractegraveres ou octets

Taille variable (maximum de 65 535 caractegraveres)

BINARY(n) Chaicircne fixe de n octets

Taille fixe (maximum de 255 octets)

VARBINARY(n) Chaicircne variable de n octets

Taille variable (maximum de 255 octets)

TINYTEXT(n) Flot de n octets Taille fixe (maximum de 255 octets)

TEXT(n) Flot de n octets Taille fixe (maximum de 65 535 octets)

MEDIUMTEXT(n) Flot de n octets Taille fixe (maximum de 16 meacutegaoctets)

LONGTEXT(n) Flot de n octets Taille fixe (maximum de 429 gigaoctets)

4055_01_C01 Page 26 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 27

chapitre ndeg 1 Deacutefinition des donneacutees

Les types BINARY et VARBINARY sont similaires agrave CHAR et VARCHAR excepteacute par le faitqursquoils contiennent des chaicircnes drsquooctets sans tenir compte drsquoun jeu de caractegraveres en particulier

Les quatre types permettant aussi de stocker du texte sont TINYTEXT TEXT MEDIUMTEXTet LONGTEXT Ces types sont associeacutes agrave un jeu de caractegraveres Il nrsquoy a pas de meacutecanisme desuppression drsquoespaces de fin ni de possibiliteacute drsquoy associer une contrainte DEFAULT

Valeurs numeacuteriques

De nombreux types sont proposeacutes par MySQL pour deacutefinir des valeurs exactes (entiers ou deacutecimauxpositifs ou neacutegatifs INTEGER et SMALLINT) et des valeurs agrave virgule fixe ou flottante (FLOATDOUBLE et DECIMAL) En plus des speacutecifications de la norme SQL MySQL propose les typesdrsquoentiers restreints (TINYINT MEDIUMINT et BIGINT) Le tableau suivant deacutecrit ces types

n indique le nombre de positions de la valeur agrave lrsquoaffichage (le maximum est de 255) Ainsiil est possible de deacuteclarer une colonne TINYINT(4) sachant que seules 3 positions sontneacutecessaires en fonction du domaine de valeurs permises

Tableau 1-5 Types de donneacutees numeacuteriques

Type Description

BIT[(n)] Ensemble de n bits Taille de 1 agrave 64 (par deacutefaut 1)

TINYINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur un octet) de -128 agrave 127 signeacute 0 agrave 255 non signeacute

BOOL et BOOLEAN Synonymes de TINYINT(1) la valeur zeacutero est consideacutereacuteecomme fausse Le non-zeacutero est consideacutereacute comme vrai Dans lesprochaines versions le type boolean comme le preacuteconise lanorme SQL sera reacuteellement pris en charge

SMALLINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 2 octets) de ndash 32 768 agrave 32 767 signeacute 0 agrave 65 535 nonsigneacute

MEDIUMINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 3 octets) de ndash 8 388 608 agrave 8 388 607 signeacute 0 agrave 16 777 215 non signeacute

INTEGER[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 4 octets) de ndash2 147 483 648 agrave 2 147 483 647 signeacute0 agrave 4 294 967 295 non signeacute

BIGINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 8 octets) de ndash 9 223 372 036 854 775 808 agrave 9 223 372 036 854 775 807 signeacute 0 agrave 18 446 744 073 709 551 615 non signeacute

FLOAT[(n[p])] [UNSIGNED] [ZEROFILL]

Flottant (de 4 agrave 8 octets) p deacutesigne la preacutecision simple (jusqursquoagrave7deacutecimales) de -34 10+38 agrave -11 10-38 0 signeacute et de 11 10-38 agrave34 10+38 non signeacute

DOUBLE[(n[p])] [UNSIGNED] [ZEROFILL]

Flottant (sur 8 octets) p deacutesigne la preacutecision double (jusqursquoagrave 15deacutecimales) de -17 10+308 agrave -22 10-308 0 signeacute et de 22 10-308

agrave 17 10+308 non signeacute

DECIMAL[(n[p])] [UNSIGNED] [ZEROFILL]

Deacutecimal agrave virgule fixe p deacutesigne la preacutecision (nombre de chiffresapregraves la virgule maximum 30) Par deacutefaut n vaut 10 p vaut 0

4055_01_C01 Page 27 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

28 copy Eacuteditions Eyrolles

La directive UNSIGNED permet de consideacuterer seulement des valeurs positives

La directive ZEROFILL complegravete par des zeacuteros agrave gauche une valeur (par exemple soit unINTEGER(5) contenant 4 si ZEROFILL est appliqueacute la valeur extraite sera laquo 00004 raquo)En deacuteclarant une colonne ZEROFILL MySQL lrsquoaffecte automatiquement aussi agrave UNSI-GNED

Synonymes et alias

bull INT est synonyme de INTEGER

bull DOUBLE PRECISION et REAL sont synonymes de DOUBLE

bull DEC NUMERIC et FIXED sont synonymes de DECIMAL

bull SERIAL est un alias pour BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE

bull Dans toute instruction SQL eacutecrivez la virgule avec un point (72 retourne 35)

Dates et heures

Les types suivants permettent de stocker des moments ponctuels (dates dates et heuresanneacutees et heures) Les fonctions NOW() et SYSDATE() retournent la date et lrsquoheure courantesDans une proceacutedure ou un deacuteclencheur SYSDATE est reacuteeacutevalueacutee en temps reacuteel alors que NOWdeacutesignera toujours lrsquoinstant de deacutebut de traitement

Tableau 1-6 Types de donneacutees dates et heures

Type Description Commentaire pour une colonne

DATE Dates du 1er janvier de lrsquoan 1000 au 31 deacutecembre 9999 apregraves J-C

Sur 3 octets Lrsquoaffichage est au format lsquoYYYY-MM-DDrsquo

DATETIME Dates et heures (de 0 h de la premiegravere date agrave 23 h 59 minutes 59 secondes de la derniegravere date)

Sur 8 octets Lrsquoaffichage est au format lsquoYYYY-MM-DD HHMMSSrsquo

YEAR[(2|4)] Sur 4 positions de 1901 agrave 2155 (incluant 0000) Sur 2 positions de 70 agrave 69 (deacutesignant 1970 agrave 2069)

Sur 1 octet lrsquoanneacutee est consideacutereacutee sur 2 ou 4 positions (4 par deacutefaut) Le format drsquoaffichage est lsquoYYYYrsquo

TIME Heures de -838 h 59 minutes 59 secondes agrave 838 h 59 minutes 59 secondes

Lrsquoheure au format lsquoHHHMMSSrsquo sur 3 octets

TIMESTAMP Instants du 1er Janvier 1970 0 h 0 minute 0 seconde agrave lrsquoanneacutee 2037

Estampille sur 4 octets (au format lsquoYYYY-MM-DD HHMMSSrsquo) mise agrave jour agrave chaque modification sur la table

4055_01_C01 Page 28 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 29

chapitre ndeg 1 Deacutefinition des donneacutees

Donneacutees binaires

Les types BLOB (Binary Large OBject) permettent de stocker des donneacutees non structureacuteescomme le multimeacutedia (images sons videacuteo etc) Les quatre types de colonnes BLOB sontTINYBLOB BLOB MEDIUMBLOB et LONGBLOB Ces types sont traiteacutes comme des flotsdrsquooctets sans jeu de caractegravere associeacute

Eacutenumeacuteration

Deux types de collections sont proposeacutes par MySQL

Le type ENUM deacutefinit une liste de valeurs permises (chaicircnes de caractegraveres)

Le type SET permettra de comparer une liste agrave une combinaison de valeurs permises agravepartir drsquoun ensemble de reacutefeacuterence (chaicircnes de caractegraveres)

Structure drsquoune table (DESCRIBE)

DESCRIBE (eacutecriture autoriseacutee DESC) est une commande qui vient de SQLPlus drsquoOracle etqui a eacuteteacute reprise par MySQL Elle permet drsquoextraire la structure brute drsquoune table ou drsquounevue

DESCRIBE [nomBase] nomTableouVue [colonne]

Si la base nrsquoest pas indiqueacutee il srsquoagit de celle en cours drsquoutilisation Retrouvons la structuredes tables Compagnie et Pilote preacuteceacutedemment creacuteeacutees Le type de chaque colonneapparaicirct

Tableau 1-7 Types de donneacutees binaires

Type Description Commentaire pour une colonne

TINYBLOB(n)

Flot de n octets

Taille fixe (maximum de 255 octets)

BLOB(n) Taille fixe (maximum de 65 535 octets)

MEDIUMBLOB(n) Taille fixe (maximum de 16 meacutegaoctets)

LONGBLOB(n) Taille fixe (maximum de 429 gigaoctets)

Tableau 1-8 Types de donneacutees eacutenumeacuteration

Type Description

ENUM(valeur1valeur2) Liste de 65 535 valeurs au maximum

SET(valeur1valeur2) Ensemble de reacutefeacuterence (maximum de 64 valeurs)

4055_01_C01 Page 29 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

30 copy Eacuteditions Eyrolles

Restrictions

Les contraintes CHECK deacutefinies ne sont pas encore opeacuterationnelles

La fraction de seconde du type TIME nrsquoest pas encore pris en charge D HHMMSSfrac-tion

Les noms des colonnes doivent ecirctre uniques pour une table donneacutee (il est en revanchepossible drsquoutiliser le mecircme nom de colonne dans plusieurs tables)

Les colonnes de type SET sont eacutevalueacutees par des chaicircnes de caractegraveres seacutepareacutes par des laquo raquo(lsquoAirbus Boeingrsquo) En conseacutequence aucune valeur drsquoun SET ne doit contenir le symbole laquo raquo

Les noms des objets (base tables colonnes contraintes vues etc) ne doivent pas emprunterdes mots-cleacutes de MySQL TABLE SELECT INSERT IFhellip Si vous ecirctes laquo franco-franccedilais raquo celane vous gecircnera pas

Index

Comme lrsquoindex de cet ouvrage vous aide agrave atteindre les pages concerneacutees par un mot recher-cheacute un index MySQL permet drsquoacceacuteleacuterer lrsquoaccegraves aux donneacutees drsquoune table Le but principal

Tableau 1-9 Structure brute des tables

Reacutesultat Commentaires

mysqlgt DESCRIBE Pilote+--------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| brevet | char(6) | NO | PRI | | || nom | char(15) | YES | UNI | NULL | || nbHVol | double(72) | YES | | NULL | || compa | char(4) | YES | MUL | NULL | |+--------+-------------+------+-----+---------+-------+

Les cleacutes primaires sont NOT NULL (deacutesigneacutees par PRI dans la colonne Key)Les uniciteacutes sont deacutesigneacutees par UNI dans la colonne KeyLes occurrences multiples possibles sont deacutesigneacutees par MUL dans la colonne KeyLes contraintes NOT NULL nommeacutees (deacutefinies via les contraintes CHECK) nrsquoapparaissent pasLa colonne Extra indique notamment les seacutequences (AUTO_INCREMENT)

mysqlgt DESCRIBE Compagnie+---------+----------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+----------+------+-----+---------+-------+| comp | char(4) | NO | PRI | | || nrue | int(3) | YES | | NULL | || rue | char(20) | YES | | NULL | || ville | char(15) | YES | | Paris | || nomComp | char(15) | NO | | | |+---------+----------+------+-----+---------+-------+

4055_01_C01 Page 30 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 31

chapitre ndeg 1 Deacutefinition des donneacutees

drsquoun index est drsquoeacuteviter de parcourir une table seacutequentiellement du premier enregistrementjusqursquoagrave celui viseacute (problegraveme rencontreacute si crsquoest le Franccedilais nommeacute laquo Zidane raquo qursquoon recherchedans une table non indeacutexeacutee de plus de soixante-six millions drsquoenregistrementshellip) Le principedrsquoun index est lrsquoassociation de lrsquoadresse de chaque enregistrement avec la valeur des colonnesindeacutexeacutees

Sans index et pour n enregistrements le nombre moyen drsquoaccegraves neacutecessaire pour trouver uneacuteleacutement est eacutegal agrave n2 Avec un index ce nombre tendra vers log(n) et augmentera donc bienplus faiblement en fonction de la monteacutee en charge des enregistrements Si une table contient1 000 enregistrements alors lrsquousage drsquoun index acceacuteleacuterera lrsquoaccegraves drsquoun facteur 100 par rapportagrave un accegraves seacutequentiel

Arbres balanceacutes

La figure suivante illustre un index sous la forme drsquoun arbre Cet index est baseacute sur la colonnenom de la table Pilote Cette figure est caricaturale car un index nrsquoest pas un arbre binaire(plus de deux liens peuvent partir drsquoun nœud) Dans cet exemple trois accegraves agrave lrsquoindex serontneacutecessaires pour adresser directement un pilote via son nom au lieu drsquoen analyser huit au plus

Un index est associeacute agrave une table et peut ecirctre deacutefini sur une ou plusieurs colonnes (diteslaquo indeacutexeacutees raquo) Une table peut laquo heacuteberger raquo plusieurs index Ils sont mis agrave jour automatique-ment apregraves rafraicircchissement de la table (ajouts et suppressions drsquoenregistrements ou modifica-tion des colonnes indeacutexeacutees) Un index peut ecirctre deacuteclareacute unique si on sait que les valeurs descolonnes indeacutexeacutees seront toujours uniques

Figure 1-3 Index sur la colonne nom

ROWID

Pilote

ROWID brevet nom nbHVol compa

A PL-1 Ameacutelie Sulpice 450 AF B PL-2 Thomas Sulpice 900 AF C PL-3 Paul Soutou 1000 SING D PL-4 Aureacutelia Ente 850 ALIB E PL-5 Agnegraves Bidal 500 SING F PL-6 Sylvie Payrissat 2500 SING G PL-7 Thierry Guibert 600 ALIB H PL-8 Cathy Castaings 400 AF

Index (nom)

E F A D C B H G

nom lt rsquoDrsquo nom ge rsquoDrsquo

lt rsquoAmrsquo ge rsquoAmrsquo

ge rsquoBrsquo lt rsquoBrsquo lt rsquoAjrsquo ge rsquoAjrsquo

ge rsquoTrsquo lt rsquoTrsquo

ge rsquoQrsquo ge rsquoThlrsquo lt rsquoQrsquo ge rsquoThlrsquo

4055_01_C01 Page 31 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

32 copy Eacuteditions Eyrolles

La plupart des index de MySQL (PRIMARY KEY UNIQUE INDEX et FULLTEXT) sont stoc-keacutes dans des arbres eacutequilibreacutes (balanced trees B-trees) Drsquoautres types drsquoindex existentcitons ceux qui portent sur des colonnes SPATIAL (reverse key R-trees) et ceux appliqueacutesaux tables MEMORY (tables de hachage hash)

La particulariteacute des index B-tree est qursquoils conservent en permanence une arborescence symeacute-trique (balanceacutee) Toutes les feuilles sont agrave la mecircme profondeur Le temps de recherche estainsi agrave peu pregraves constant quel que soit lrsquoenregistrement chercheacute Le plus bas niveau de lrsquoindex(leaf blocks) contient les valeurs des colonnes indexeacutees et le rowid Toutes les feuilles delrsquoindex sont chaicircneacutees entre elles Pour les index non uniques (par exemple si on voulait deacutefinirun index sur la colonne compa de la table Pilote) le rowid est inclus dans la valeur de lacolonne indexeacutee Ces index premiers apparus sont deacutesormais tregraves fiables et performants ilsne se deacutegradent pas lors de la monteacutee en charge de la table

Creacuteation drsquoun index (CREATE INDEX)

Pour pouvoir creacuteer un index dans sa base la table agrave indexer doit appartenir agrave la base Si lrsquoutili-sateur a le privilegravege INDEX il peut creacuteer et supprimer des index dans sa base Un index estcreacuteeacute par lrsquoinstruction CREATE INDEX et supprimeacute par DROP INDEX

La syntaxe de creacuteation drsquoun index est la suivante

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX nomIndex

[USING BTREE | HASH]

ON nomTable (colonne1 [(taille1)] [ASC | DESC])

UNIQUE permet de creacuteer un index qui nrsquoaccepte pas les doublons

FULLTEXT permet de beacuteneacuteficier de fonctions de recherche dans des textes (flot de caractegrave-res)

SPATIAL permet de profiter de fonctions pour les donneacutees geacuteographiques

ASC et DESC preacutecisent lrsquoordre (croissant ou deacutecroissant)

Creacuteons deux index sur la table Pilote

Tableau 1-10 Creacuteations drsquoindex

Instruction SQL Commentaires

CREATE UNIQUE INDEX idx_Pilote_nom3 USING BTREE ON Pilote (nom(3) DESC)

Index B-tree ordre deacutecroissant sur les troispremiers caractegraveres du nom des pilotes

CREATE INDEX idx_Pilote_compa USING BTREE ON Pilote (compa)

Index B-tree ordre croissant sur la colonne cleacuteeacutetrangegravere compa

4055_01_C01 Page 32 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 33

chapitre ndeg 1 Deacutefinition des donneacutees

Bilan

bull Un index ralentit les rafraicircchissements de la base (conseacutequence de la mise agrave jour de lrsquoarbreou des bitmaps) En revanche il acceacutelegravere les accegraves

bull Il est conseilleacute de creacuteer des index sur des colonnes (majoritairement des cleacutes eacutetrangegraveres)utiliseacutees dans les clauses de jointures (voir chapitre 4)

bull Il est possible de creacuteer des index pour toutes les colonnes drsquoune table (jusqursquoagrave concurrencede 16)

bull Les index sont peacutenalisants lorsqursquoils sont deacutefinis sur des colonnes tregraves souvent modifieacutees ousi la table contient peu de lignes

Destruction drsquoun scheacutema

Il vous sera utile drsquoeacutecrire un script de destruction drsquoun scheacutema (jrsquoentends laquo scheacutema raquo commeensemble de tables contraintes et index composant une base de donneacutees et non pas en tantqursquoensemble de tous les objets drsquoun utilisateur) pour pouvoir recreacuteer une base propre Bienentendu si des donneacutees sont deacutejagrave preacutesentes dans les tables et que vous souhaitez les garder ilfaudra utiliser une strateacutegie pour les reacuteimporter dans les nouvelles tables Agrave ce niveau delrsquoouvrage vous nrsquoen ecirctes pas lagrave et le script de destruction va vous permettre de corriger voserreurs de syntaxe du script de creacuteation des tables

Nous avons vu qursquoil fallait creacuteer drsquoabord les tables laquo pegraveres raquo puis les tables laquo fils raquo (si descontraintes sont deacutefinies en mecircme temps que les tables) Lrsquoordre de destruction des tablespour des raisons de coheacuterence est inverse (il faut deacutetruire les tables laquo fils raquo puis les tableslaquo pegraveres raquo) Dans notre exemple il serait malvenu de supprimer la table Compagnie avant latable Pilote En effet la cleacute eacutetrangegravere compa nrsquoaurait plus de sens

Suppression drsquoune table (DROP TABLE)

Pour pouvoir supprimer une table dans une base il faut posseacuteder le privilegravege DROP sur cettebase Lrsquoinstruction DROP TABLE entraicircne la suppression des donneacutees de la structure de ladescription dans le dictionnaire des donneacutees des index des deacuteclencheurs associeacutes (triggers) etla reacutecupeacuteration de la place dans lrsquoespace de stockage

DROP [TEMPORARY] TABLE [IF EXISTS]

[nomBase] nomTable1 [[nomBase2]nomTable2]

[RESTRICT | CASCADE]

4055_01_C01 Page 33 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

34 copy Eacuteditions Eyrolles

TEMPORARY pour supprimer des tables temporaires Les transactions en cours ne sont pasaffecteacutees Lrsquoutilisation de TEMPORARY peut ecirctre un bon moyen de srsquoassurer qursquoon nedeacutetruit pas accidentellement une table non temporairehellip

IF EXISTS permet drsquoeacuteviter qursquoune erreur se produise si la table nrsquoexiste pas

RESTRICT et CASCADE ne sont pas encore opeacuterationnels Le premier permettra de veacuteri-fier qursquoaucun autre eacuteleacutement nrsquoutilise la table (vue deacuteclencheur etc) Le second reacutepercu-tera la destruction agrave tous les eacuteleacutements reacutefeacuterenceacutes

Les eacuteleacutements qui utilisaient la table (vues synonymes fonctions et proceacutedures) ne sont passupprimeacutes mais sont temporairement inopeacuterants Attention une suppression ne peut pas ecirctrepar la suite annuleacutee

Ordre des suppressions

Il suffit de relire agrave lrsquoenvers le script de creacuteation de vos tables pour en deacuteduire lrsquoordre de sup-pression agrave eacutecrire dans le script de destruction de votre scheacutema

Le tableau suivant preacutesente deux eacutecritures possibles pour deacutetruire des scheacutemas La premiegravereeacutecriture nrsquoest pas encore possible et il reste agrave voir comment drsquoun point de vue des performan-ces MySQL programmera le CASCADE

Tableau 1-11 Scripts eacutequivalents de destruction

Avec CASCADE (pas encore opeacuterationnel) Les laquo fils raquo puis les laquo pegraveres raquo

DROP TABLE Compagnie CASCADEDROP TABLE Pilote

DROP TABLE PiloteDROP TABLE Compagnie

4055_01_C01 Page 34 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 35

chapitre ndeg 1 Deacutefinition des donneacutees

Exercices

Lrsquoobjectif de ces exercices est de creacuteer des tables leur cleacute primaire et des contraintes de veacuteri-fication (NOT NULL et CHECK)

11 Preacutesentation de la base de donneacutees

Une entreprise deacutesire geacuterer son parc informatique agrave lrsquoaide drsquoune base de donneacutees Le bacirctiment estcomposeacute de trois eacutetages Chaque eacutetage possegravede son reacuteseau (ou segment distinct) eacutethernet Cesreacuteseaux traversent des salles eacutequipeacutees de postes de travail Un poste de travail est une machine surlaquelle sont installeacutes certains logiciels Quatre cateacutegories de postes de travail sont recenseacutees(stations Unix terminaux X PC Windows et PC NT) La base de donneacutees devra aussi deacutecrire lesinstallations de logiciels

Les noms et types des colonnes sont les suivants

Tableau 1-12 Caracteacuteristiques des colonnes

Colonne Commentaire Type

indIP trois premiers groupes IP (exemple 13012080) VARCHAR(11)

nomSegment nom du segment VARCHAR(20)

etage eacutetage du segment TINYINT(1)

nSalle numeacutero de la salle VARCHAR(7)

nomSalle nom de la salle VARCHAR(20)

nbPoste nombre de postes de travail dans la salle TINYINT(2)

nPoste code du poste de travail VARCHAR(7)

nomPoste nom du poste de travail VARCHAR(20)

ad dernier groupe de chiffres IP (exemple 11) VARCHAR(3)

typePoste type du poste (UNIX TX PCWS PCNT) VARCHAR(9)

dateIns date drsquoinstallation du logiciel sur le poste dateTIME

nLog code du logiciel VARCHAR(5)

nomLog nom du logiciel VARCHAR(20)

dateAch date drsquoachat du logiciel dateTIME

version version du logiciel VARCHAR(7)

typeLog type du logiciel (UNIX TX PCWS PCNT) VARCHAR(9)

prix prix du logiciel DECIMAL(62)

numIns numeacutero seacutequentiel des installations INTEGER(5)

dateIns date drsquoinstallation du logiciel TIMESTAMP

delai intervalle entre achat et installation SMALLINT

typeLP types des logiciels et des postes VARCHAR(9)

nomType noms des types (Terminaux X PC Windowshellip) VARCHAR(20)

4055_01_C01 Page 35 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

36 copy Eacuteditions Eyrolles

12 Creacuteation des tables

Eacutecrire puis exeacutecuter le script SQL (que vous appellerez creParcsql) de creacuteation des tables avecleur cleacute primaire (en gras dans le scheacutema suivant) et les contraintes suivantes

bull Les noms des segments des salles et des postes sont non nuls

bull Le domaine de valeurs de la colonne ad srsquoeacutetend de 0 agrave 255

bull La colonne prix est supeacuterieure ou eacutegale agrave 0

bull La colonne dateIns est eacutegale agrave la date du jour par deacutefaut

13 Structure des tables

Eacutecrire puis exeacutecuter le script SQL (que vous appellerez descParcsql) qui affiche la description detoutes ces tables (en utilisant des commandes DESCRIBE) Comparer le reacutesultat obtenu avec lescheacutema ci-dessus

14 Destruction des tables

Eacutecrire puis exeacutecuter le script SQL de destruction des tables (que vous appellerez dropParcsql)Lancer ce script puis celui de la creacuteation des tables agrave nouveau

Figure 1-4 Composition des tables

SegmentindIP nomSegment etage

SallenSalle nomSalle nbPoste indIP

PostenPoste nomPoste indIP ad typePoste nSalle

LogicielnLog nomLog dateAch version typeLog prix

InstallernPoste nLog numIns dateIns delai

TypestypeLP nomType

4055_01_C01 Page 36 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

37

Chapitre 2

Manipulation des donneacutees

Ce chapitre deacutecrit lrsquoaspect LMD (langage de manipulation des donneacutees) de MySQL Nousverrons que SQL propose trois instructions pour manipuler des donneacutees

lrsquoinsertion drsquoenregistrements

INSERT

la modification de donneacutees

UPDATE

la suppression drsquoenregistrements

DELETE

(et

TRUNCATE

)

Il existe drsquoautres possibiliteacutes que nous ne deacutetaillerons pas dans ce chapitre pour inseacuterer desdonneacutees en utilisant des outils drsquoimportation ou de migration citons MySQL Migration Tool-kit SQLPorter Navicat Intelligent Converters et MySQL Data Import de la socieacuteteacute EMS

Insertions drsquoenregistrements (

INSERT

)

Pour pouvoir inseacuterer des enregistrements dans une table il faut que vous ayez reccedilu le privilegravege

INSERT

Il existe plusieurs possibiliteacutes drsquoinsertion lrsquoinsertion monoligne qui ajoute un enre-gistrement par instruction (que nous allons deacutetailler maintenant) et lrsquoinsertion multiligne quiinsegravere plusieurs enregistrements par une requecircte (que nous deacutetaillerons au chapitre 4)

Syntaxe

La syntaxe simplifieacutee de lrsquoinstruction

INSERT

monoligne est la suivante

INSERT

[LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] [

nomBase

]

nomTable

|

nomVue

[(

nomColonne

)]

VALUES (

expression

| DEFAULT)()

[ON DUPLICATE KEY UPDATE

nomColonne

=

expression

]

DELAYED

indique que lrsquoinsertion est diffeacutereacutee (si la table est modifieacutee par ailleurs leserveur attend qursquoelle se libegravere pour y inseacuterer peacuteriodiquement de nouveaux enregistre-ments si elle redevient active entre-temps)

LOW_PRIORITY

indique que lrsquoinsertion est diffeacutereacutee agrave la libeacuteration complegravete de la table(option agrave ne pas utiliser sur des tables

MyISAM

)

HIGH_PRIORITY

annule lrsquooption

low priority

du serveur

IGNORE

indique que les eacuteventuelles erreurs deacuteclencheacutees suite agrave lrsquoinsertion seront consideacute-reacutees en tant que

warning

s

4055_02_C02 Page 37 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

38

copy Eacuteditions Eyrolles

ON DUPLICATE KEY UPDATE

permet de mettre agrave jour lrsquoenregistrement preacutesent dansla table qui a deacuteclencheacute lrsquoerreur de doublon (dans le cas drsquoun index

UNIQUE

ou drsquounecleacute primaire) Dans ce cas le nouvel enregistrement nrsquoest pas inseacutereacute seul lrsquoancien estmis agrave jour

Agrave lrsquoaide drsquoexemples nous allons deacutetailler les possibiliteacutes de cette instruction en consideacuterant lamajeure partie des types de donneacutees proposeacutes par MySQL

Renseigner toutes les colonnes

Ajoutons trois lignes dans la table

Compagnie

en alimentant toutes les colonnes de la tablepar des valeurs La deuxiegraveme insertion utilise le mot-cleacute

DEFAULT

pour affecter explicitementla valeur par deacutefaut agrave la colonne

ville

La troisiegraveme insertion attribue explicitement la valeur

NULL

agrave la colonne

nrue

Renseigner certaines colonnes

Inseacuterons deux lignes dans la table

Compagnie

en ne preacutecisant pas toutes les colonnes Lapremiegravere insertion affecte implicitement la valeur par deacutefaut agrave la colonne

ville

Ladeuxiegraveme donne implicitement la valeur

NULL

agrave la colonne

nrue

La table

Compagnie

contient agrave preacutesent les lignes suivantes

Tableau 2-1 Insertions

Instruction SQL Commentaires

INSERT INTO Compagnie VALUES (SING 7 Camparols Singapour Singapore AL)

Toutes les valeurs sont renseigneacutees dans lrsquoordre de la structure de la table

INSERT INTO Compagnie VALUES (AC 10 Gambetta

DEFAULT

Air France)

DEFAULT

explicite

INSERT INTO Compagnie VALUES (AN1

NULL

Hoche Blagnac Air Nul1)

NULL

explicite

Web

Tableau 2-2 Insertions de certaines colonnes

Instruction SQL Commentaires

INSERT INTO Compagnie(comp nrue rue nomComp) VALUES (AF 8 Champs Elyseacutees Castanet Air)

DEFAULT

implicite

INSERT INTO Compagnie(comp rue ville nomComp) VALUES (AN2 Foch Blagnac Air Nul2)

NULL

sur

nrue

implicite

Web

4055_02_C02 Page 38 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

39

chapitre ndeg 2 Manipulation des donneacutees

Plusieurs enregistrements

Le script suivant ajoute trois nouvelles compagnies en une seule instruction

INSERT

INSERT INTO Compagnie VALUES

(LUFT9SalasMunichLuftansa)

(QUAN1KangourooSydneyQuantas)

(SNCM3P PaoliBastiaCorse Air)

Ne pas respecter des contraintes

Inseacuterons des enregistrements dans la table

Pilote

qui ne respectent pas des contraintes Le tableausuivant deacutecrit les messages renvoyeacutes pour chaque erreur (le nom de la contrainte apparaicirct danschaque message les valeurs erroneacutees sont noteacutees en gras) La premiegravere erreur vient de la cleacute primairela seconde de lrsquouniciteacute du nom La troisiegraveme erreur signifie que la cleacute eacutetrangegravere reacutefeacuterence une cleacuteprimaire absente (ici une compagnie inexistante) Nous reviendrons sur ce dernier problegraveme dans lasection

Erreur Source du renvoi introuvable

La derniegravere concerne la contrainte en ligne

NOT NULL

Figure 2-1

Table apregraves les insertions

Compagnie

comp nrue rue ville nomComp

SING 7 Camparols Singapour Singapore AL AF 10 Gambetta Paris Air France AN1 Hoche Blagnac Air Nul1 AC 8 Champs Elyseacutees Paris Castanet Air AN2 Foch Blagnac Air Nul2

Valeur par deacutefaut Valeur NULL

Tableau 2-3 Insertions

Insertions veacuterifiant les contraintes Insertions ne veacuterifiant pas les contraintes

INSERT INTO Pilote VALUES (PL-1 Louise Ente 450 AF)

mysqlgt INSERT INTO Pilote VALUES(

PL-1

Ameacutelie Sulpice 100 AF)ERROR

1062

(23000)

Duplicate entry

PL-1 forkey 1

INSERT INTO Pilote VALUES (PL-2 Jules Ente 900 AF)

mysqlgt INSERT INTO Pilote VALUES (PL-4

Louise Ente

450 AF)ERROR

1062

(23000)

Duplicate entry

Louise Ente for key 2

INSERT INTO Pilote VALUES (PL-3 Paul Soutou 1000 SING)

mysqlgt INSERT INTO Pilote VALUES (PL-5 Thomas Sulpice 500

TOTO

)ERROR

1452

(23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT`fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))mysqlgt INSERT INTO Pilote VALUES (PL-6

NULL

100 AF)ERROR

1048

(23000) Column nom cannot be null

Web

4055_02_C02 Page 39 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

40

copy Eacuteditions Eyrolles

Donneacutees binaires

Le type BIT permet de manipuler des suites variables de bits Des fonctions sont disponiblespour programmer le laquo ET raquo le laquo OU raquo exclusif ou inclusif etc La table suivante contientdeux colonnes de ce type Notez lrsquoutilisation du preacutefixe laquo b raquo pour initialiser un tel type

CREATE TABLE Registres (nom CHAR(5)numero BIT(2)adresse BIT(16))

INSERT INTO Registres VALUES (COM2 )

Eacutenumeacuterations

Le type ENUM est consideacutereacute comme une liste de chaicircnes de caractegraveres Toute valeur drsquounecolonne de ce type devra appartenir agrave cette liste eacutetablie lors de la creacuteation de la table Suppo-sons qursquoon recense quatre types possibles de diplocircmes (BTS DUT Licence et INSA) pourchaque eacutetudiant On ne stocke qursquoun seul diplocircme par eacutetudiant

Le script de la creacuteation de la table et des insertions est le suivant Notez que les parenthegravesessont optionnelles pour deacutesigner la colonne ENUM

Le type SET permet de comparer une liste agrave une combinaison de valeurs permises agrave partir drsquounensemble de reacutefeacuterence (chaicircnes de caractegraveres) Supposons qursquoon deacutesire stocker plusieursdiplocircmes par eacutetudiant

b10 b0000010011110111

Figure 2-2 Table avec une colonne ENUM

UnCursus

num nom diplome

E1 F Brouard BTS E2 F Degrelle Licence

ENUM

BTS DUT Licence INSA

Tableau 2-4 Insertions avec un ENUM

Creacuteation Insertions (deux bonnes une illicite)

CREATE TABLE UnCursus (num CHAR(4) nom CHAR(15) diplome ENUM CONSTRAINT pk_Cusus PRIMARY KEY(num))

mysqlgt INSERT INTO UnCursus VALUES (E1 F Brouard (BTS))mysqlgt INSERT INTO UnCursus VALUES (E2 F Degrelle Licence)

mysqlgt INSERT INTO UnCursus VALUES (E3 Bug (MathSup))ERROR 1265 (01000) Data truncated for column diplome at row 1

(BTSDUTLicenceINSA)

4055_02_C02 Page 40 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 41

chapitre ndeg 2 Manipulation des donneacutees

Le script de la creacuteation de la table et des insertions est le suivant (mecircme remarque pour lesparenthegraveses)

Dates et heures

Nous avons deacutecrit au chapitre 1 les caracteacuteristiques geacuteneacuterales des types MySQL pour stockerdes eacuteleacutements de type dateheure Eacutetudions maintenant la manipulation de ces types Nousverrons que MySQL peut les consideacuterer soit en tant que chaicircnes de caractegraveres soit commenumeacuteriques

Formats

Concernant les types DATETIME DATE et TIMESTAMP les formats possibles sont lessuivants

Chaicircnes de caractegraveres YYYY-MM-DD HHMMSS ou YY-MM-DD HHMMSS (pour lescolonnes DATE YYYY-MM-DD ou YY-MM-DD) Tout autre deacutelimiteur est autoriseacute comme 20051231 113045 (pour les colonnes DATE 651231 651231 et651231 sont eacutequivalents et deacutesignent tous le reacuteveillon de lrsquoanneacutee 1965)

Consideacutereacutes comme chaicircnes de caractegraveres dans les formats suivants YYYYMMDD-HHMMSS ou YYMMDDHHMMSS (pour les DATE YYYYMMDD ou YYMMDD) ensupposant que la chaicircne ait un sens en tant que date Ainsi 19650205063000 est inter-preacuteteacute comme le 5 feacutevrier 1965 agrave 6 heures et 30 minutes Par contre 19650255 nrsquoa pas desens du fait du jour (il sera interpreacuteteacute comme 0000-00-00)

Figure 2-3 Table avec une colonne SET

Cursus

num nom diplomes

E1 F Brouard BTS Licence E2 F Degrelle Licence INSA DUT

SET

BTS DUT Licence INSA

Tableau 2-5 Insertions avec un SET

Creacuteation Insertions (deux bonnes une illicite)

CREATE TABLE Cursus (num CHAR(4) nom CHAR(15) diplomes SET CONSTRAINT pk_Cusus PRIMARY KEY(num))

mysqlgt INSERT INTO Cursus VALUES (E1 F Brouard )mysqlgt INSERT INTO Cursus VALUES (E2 F Degrelle

mysqlgt INSERT INTO Cursus VALUES (E3 Bug )ERROR 1265 (01000) Data truncated for column diplomes at row 1

(BTSDUTLicenceINSA)

(BTSLicence)

LicenceINSADUT

(BTSINSAENAC)

4055_02_C02 Page 41 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

42 copy Eacuteditions Eyrolles

Consideacutereacutes comme numeacuteriques dans les formats suivants YYYYMMDDHHMMSS ouYYMMDDHHMMSS (pour les DATE YYYYMMDD ou YYMMDD) en supposant que le nombre aitun sens en tant que date Ainsi 19650205063000 est interpreacuteteacute comme le 5 feacutevrier 1965 agrave6 heures et 30 minutes Par contre 19650205069000 nrsquoa pas de sens du fait des minutes (ilsera interpreacuteteacute comme 00000000000000)

Exemple avec DATE et DATETIME

Deacuteclarons la table Pilote qui contient deux colonnes de type dateheure DATE et DATETIME

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) dateNaiss DATE

nbHVol DECIMAL(72)dateEmbauche DATETIME compa VARCHAR(4)

CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

Lrsquoinsertion du pilote initialise la date de naissance au 5 feacutevrier 1965 ainsi que celle delrsquoembauche agrave la date du moment (heures minutes secondes) par la fonction SYSDATE

INSERT INTO Pilote

VALUES (PL-1 Christian Soutou 1965-02-05 900 SYSDATE() AF)

Nous verrons au chapitre 4 comment extraire les anneacutees mois jours heures minutes etsecondes Nous verrons aussi qursquoil est possible drsquoajouter ou de soustraire des dates entre elles

Exemple avec TIME et YEAR

Par analogie aux diffeacuterents formats des dates les heures (type TIME HHMMSS ouHHHMMSS) peuvent aussi ecirctre manipuleacutees sous la forme de chaicircnes ou de nombres

Chaicircne D HHMMSSfraction avec le nombre de jours (0 agrave 34) et la fraction deseconde (pas encore opeacuterationnelle) HHMMSSfraction HHMMSS HHMMD HHMMSS D HHMM D HH ou SS

Chaicircne sans les deacutelimiteurs sous reacuteserve que la chaicircne ait un sens Ainsi 101112 estconsideacutereacute comme 101112 mais 109712 est incorrect du fait des minutes ildevient 000000

Nombre en raisonnant comme les chaicircnes Ainsi 101112 est consideacutereacute comme101112 mais 109712 est incorrect du fait des minutes il devient 000000Les formats suivants sont aussi corrects SS MMSS HHMMSS

La table Pilote suivante contient la colonne pasVolDepuis pour stocker le deacutelai depuis ledernier vol et la colonne retraite qui indique lrsquoanneacutee de retraite

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) pasVolDepuis TIME retraite YEAR

CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

4055_02_C02 Page 42 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 43

chapitre ndeg 2 Manipulation des donneacutees

Les insertions suivantes utilisent diffeacuterents formats Le premier pilote nrsquoa pas voleacute depuis1 jour et 23 heures (47 heures) le second depuis 15 heures 26 minutes 30 secondes le troi-siegraveme depuis 4 jours et 23 heures (119 heures) le quatriegraveme depuis 3 heures 27 minutes et50 secondes et le dernier se croit plus preacutecis que tous les autres en ajoutant une fraction qui nesera pas prise en compte au niveau de la base

INSERT INTO Pilote VALUES (PL-1 Hait 1 2300 2002)

INSERT INTO Pilote VALUES (PL-2 Crampes 152630 2006)

INSERT INTO Pilote VALUES (PL-3 Tuffery 4 2300 05)

INSERT INTO Pilote VALUES (PL-4 Mercier 032750 07)

INSERT INTO Pilote VALUES (PL-5 Albaric 1 2300457 01)

Lrsquoeacutetat de la base est le suivant

mysqlgt SELECT FROM Pilote

+--------+---------+--------------+----------+

| brevet | nom | pasVolDepuis | retraite |

+--------+---------+--------------+----------+

| PL-1 | Hait | 470000 | 2002 |

| PL-2 | Crampes | 152630 | 2006 |

| PL-3 | Tuffery | 1190000 | 2005 |

| PL-4 | Mercier | 032750 | 2007 |

| PL-5 | Albaric | 470000 | 2001 |

+--------+---------+--------------+----------+

Si un deacutepassement se produit au niveau drsquoune colonne TIME celle-ci est eacutevalueacutee au maximumou au minimum (-8500000 et 9990000 sont respectivement convertis agrave -8385959 et8385959)

Exemple avec TIMESTAMP

Toute colonne du type TIMESTAMP est actualiseacutee agrave chaque modification de lrsquoenregistrement la premiegravere fois agrave lrsquoINSERT puis agrave chaque UPDATE (quelle que soit la colonne mise agrave jour)Deacuteclarons la table Pilote qui contient une colonne de ce type

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) misaJour TIMESTAMP

CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

Lrsquoinsertion du pilote suivant initialisera la colonne agrave la date systegraveme (comme SYSDATE)

INSERT INTO Pilote (brevetnom) VALUES (PL-1 Hait)

Par la suite et agrave la diffeacuterence drsquoun type DATE ou DATETIME pour chaque modification de cepilote la colonne misaJour sera reacuteactualiseacutee avec la date de lrsquoinstant de la mise agrave jour

4055_02_C02 Page 43 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

44 copy Eacuteditions Eyrolles

Mecircme si vous croyez mettre agrave NULL cette colonne avec une instruction UPDATE elle contien-dra toujours lrsquoinstant de votre vaine tentative

Fonctions utiles

Les fonctions CURRENT_TIMESTAMP() CURRENT_DATE() et CURRENT_TIME() UTC_TIME() renseignent sur lrsquoinstant la date lrsquoheure et lrsquoheure GMT de la session en cours

Il nrsquoest pas neacutecessaire drsquoutiliser une table pour afficher une expression dans lrsquointerface decommande Lrsquoexemple suivant montre que la requecircte a eacuteteacute exeacutecuteacutee le 1er novembre 2005 agrave10 heures 11 minutes et 27 secondes Le client est sur le fuseau GMT+1h

mysqlgt SELECT CURRENT_TIMESTAMP() CURRENT_TIME() CURRENT_DATE() UTC_TIME()+---------------------+----------------+----------------+------------+| CURRENT_TIMESTAMP() | CURRENT_TIME() | CURRENT_DATE() | UTC_TIME() |+---------------------+----------------+----------------+------------+| 2005-11-01 101127 | 101127 | 2005-11-01 | 091127 |+---------------------+----------------+----------------+------------+

Seacutequences

Bien que laquo seacutequence raquo ne soit pas dans le vocabulaire de MySQL car le meacutecanisme qursquoilpropose nrsquoest pas aussi puissant que celui drsquoOracle MySQL offre la possibiliteacute de geacuteneacutererautomatiquement des valeurs numeacuteriques Ces valeurs sont bien utiles pour composer des cleacutesprimaires de tables quand vous ne disposez pas de colonnes adeacutequates agrave cet effet Ce meacuteca-nisme reacutepond en grande partie agrave ce qursquoon attendrait drsquoune seacutequence

En attendant que MySQL offre peut-ecirctre dans une prochaine version un meacutecanisme plus richeque celui que nous allons eacutetudier je me permets drsquoappeler laquo seacutequence raquo une colonne indexeacuteede type entier (INTEGER SMALLINT TINYINT MEDIUMINT et BIGINT) deacutefinie agrave lrsquoaide de ladirective AUTO_INCREMENT Cette colonne est cleacute primaire ou unique et non nulle Uneseacutequence est en geacuteneacuteral affecteacutee agrave une table mais vous pouvez lrsquoutiliser pour plusieurs tablesou variables

Utilisation en tant que cleacute primaire

La figure suivante illustre la seacutequence appliqueacutee agrave la colonne numAff pour initialiser lesvaleurs de la cleacute primaire de la table Affreter La fonction LAST_INSERT_ID() retournela derniegravere valeur de la seacutequence geacuteneacutereacutee (ici le pas est de 1 la seacutequence deacutebute par deacutefaut agrave 1nous verrons par la suite qursquoil est possible drsquoutiliser une valeur diffeacuterente)

4055_02_C02 Page 44 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 45

chapitre ndeg 2 Manipulation des donneacutees

Le tableau suivant deacutecrit la creacuteation de cette table et diffeacuterentes eacutecritures pour les insertions

Modification drsquoune seacutequence

La seule modification possible drsquoune seacutequence est celle qui consiste agrave changer la valeur dedeacutepart de la seacutequence (avec ALTER TABLE) Seules les valeurs agrave venir de la seacutequence modi-fieacutee seront changeacutees (heureusement pour les donneacutees existantes des tables)

Supposons qursquoon deacutesire continuer agrave inseacuterer des nouveaux affregravetements agrave partir de lavaleur 100 Le prochain affregravetement sera estimeacute agrave 100 et les insertions suivantes prendront encompte le nouveau point de deacutepart tout en laissant intactes les donneacutees existantes des tables

ALTER TABLE Affreter AUTO_INCREMENT = 100

INSERT INTO Affreter (compimmatdateAffnbPax)

VALUES (SING F-NEW SYSDATE() 77)

mysqlgt SELECT FROM Affreter

Figure 2-4 Seacutequence appliqueacutee agrave une cleacute primaire

Affreter numAff comp immat dateAff nbPax

1 AF F-WTSS 13-05-2005 85 2 SING F-GAFU 05-02-2005 155 3 AF F-WTSS 11-09-2005 90 4 AF F-GLFS 11-09-2005 75 AUTO_INCREMENT

LAST_INSERT_ID() rArr 4

Tableau 2-6 Seacutequence pour une cleacute primaire

Table Insertions

CREATE TABLE Affreter( comp CHAR(4) immat CHAR(6) dateAff DATE nbPax SMALLINT(3) CONSTRAINT pk_Affreter PRIMARY KEY (numAff))

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES (AFF-WTSS2005-05-1385)

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES (SINGF-GAFU2005-02-05155)

INSERT INTO Affreter VALUES (NULLAFF-WTSS2005-09-1190)

INSERT INTO Affreter VALUES (0AFF-GLFS2005-09-1175)

numAff SMALLINT AUTO_INCREMENT

4055_02_C02 Page 45 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

46 copy Eacuteditions Eyrolles

+--------+------+--------+------------+-------+

| numAff | comp | immat | dateAff | nbPax |

+--------+------+--------+------------+-------+

| 1 | AF | F-WTSS | 2005-05-13 | 85 |

| 2 | SING | F-GAFU | 2005-02-05 | 155 |

| 3 | AF | F-WTSS | 2005-09-11 | 90 |

| 4 | AF | F-GLFS | 2005-09-11 | 75 |

| 100 | SING | F-NEW | 2005-11-01 | 77 |

+--------+------+--------+------------+-------+

Utilisation en tant que cleacute eacutetrangegravere

Creacuteons deux seacutequences qui vont permettre de donner leur valeur aux cleacutes primaires des deuxtables illustreacutees agrave la figure suivante (les affregravetements commencent agrave 1 les passagers agrave 100)Servons-nous aussi de la seacutequence de la table Affreter pour indiquer le dernier vol dechaque passager La section Inteacutegriteacute reacutefeacuterentielle deacutetaille les meacutecanismes relatifs aux cleacuteseacutetrangegraveres

Le script SQL de deacutefinition et de manipulation des donneacutees est indiqueacute ci-apregraves La valeur dedeacutepart drsquoune seacutequence peut ecirctre deacutefinie agrave la fin de lrsquoordre CREATE TABLE Notez eacutegalementlrsquoutilisation de la fonction LAST_INSERT_ID dans les insertions pour reacutecupeacuterer la valeur dela cleacute primaire

Figure 2-5 Seacutequence appliqueacutee agrave une cleacute eacutetrangegravere

Affreter

numAff comp immat dateAff nbPax

1 AF F-WTSS 13-05-2005 85 2 SING F-GAFU 05-02-2005 155 3 AF F-WTSS 15-05-2005 82 AUTO_INCREMENT

LAST_INSERT_ID() rArr 3

Passager

numPax nom siege dernierVol

100 Payrissat 7A 2 101 Castaings 2E 3

AUTO_INCREMENT

LAST_INSERT_ID() rArr 101

4055_02_C02 Page 46 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 47

chapitre ndeg 2 Manipulation des donneacutees

Modifications de colonnes

Lrsquoinstruction UPDATE permet la mise agrave jour des colonnes drsquoune table Pour pouvoir modifierdes enregistrements drsquoune table il faut que cette derniegravere soit dans votre base ou que vousayez reccedilu le privilegravege UPDATE sur la table

Syntaxe (UPDATE)

La syntaxe simplifieacutee de lrsquoinstruction UPDATE est la suivante

UPDATE [LOW_PRIORITY] [IGNORE] [nomBase] nomTable

SET col_name1=expr1 [ col_name2=expr2 ]

SET colonne1 = expression1 | (requecircte_SELECT) | DEFAULT

[colonne2 = expression2]

[WHERE (condition)]

[ORDER BY listeColonnes]

[LIMIT nbreLimite]

LOW_PRIORITY indique que la modification est diffeacutereacutee agrave la libeacuteration complegravete de latable (option agrave ne pas utiliser sur des tables MyISAM)

IGNORE signifie que les eacuteventuelles erreurs deacuteclencheacutees suite aux modifications serontconsideacutereacutees en tant que warnings

La clause SET actualise une colonne en lui affectant une expression (valeur valeur pardeacutefaut calcul ou reacutesultat drsquoune requecircte)

Tableau 2-7 Seacutequence pour une cleacute eacutetrangegravere

Tables Insertions

CREATE TABLE Affreter( comp CHAR(4) immat CHAR(6) dateAff DATEnbPax SMALLINT(3) CONSTRAINT pk_Affreter PRIMARY KEY (numAff))

CREATE TABLE Passager( nom CHAR(15) siege CHAR(4) dernierVol SMALLINTCONSTRAINT pk_Passager PRIMARY KEY(numPax)CONSTRAINT fk_Pax_vol_Affreter FOREIGN KEY (dernierVol) REFERENCES Affreter(numAff))

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES(AFF-WTSS2005-05-1385)

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES(SINGF-GAFU2005-02-05155)

INSERT INTO Passager VALUES (NULLPayrissat7ALAST_INSERT_ID())

INSERT INTO Affreter VALUES (NULLAFF-WTSS2005-05-1582)

INSERT INTO Passager VALUES (NULLCastaings2ELAST_INSERT_ID())

WebnumAff SMALLINT AUTO_INCREMENT

numPax SMALLINT AUTO_INCREMENT

AUTO_INCREMENT = 100

4055_02_C02 Page 47 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

48 copy Eacuteditions Eyrolles

La condition du WHERE filtre les lignes agrave mettre agrave jour dans la table Si aucune conditionnrsquoest preacuteciseacutee tous les enregistrements seront actualiseacutes Si la condition ne filtre aucuneligne aucune mise agrave jour ne sera reacutealiseacutee

ORDER BY indique lrsquoordre de modification des colonnes

LIMIT speacutecifie le nombre maximum drsquoenregistrements agrave changer (par ordre de cleacuteprimaire croissante)

Modification drsquoune colonne

Modifions la compagnie de code AN1 en affectant la valeur 50 agrave la colonne nrue

UPDATE Compagnie SET nrue = 50 WHERE comp = AN1

Modification de plusieurs colonnes

Modifions la compagnie de code AN2 en affectant simultaneacutement la valeur 14 agrave la colonnenrue et la valeur par deacutefaut (Paris) agrave la colonne ville

UPDATE Compagnie SET nrue = 14 ville = DEFAULT WHERE comp = AN2

La table Compagnie contient agrave preacutesent les donneacutees suivantes

Modification de plusieurs enregistrements

Modifions les deux premiegraveres compagnies (par ordre de cleacute primaire ici AC et AF) en affec-tant la valeur Toulouse agrave la colonne ville

UPDATE Compagnie SET ville = Toulouse LIMIT 2

Ne pas respecter les contraintes

Il faut comme pour les insertions respecter les contraintes qui existent au niveau des colon-nes Dans le cas inverse une erreur est renvoyeacutee (le nom de la contrainte apparaicirct) et la mise agravejour nrsquoest pas effectueacutee

Figure 2-6 Table apregraves les modifications

Compagnie

comp nrue rue ville nomComp

SING 7 Camparols Singapour Singapore AL AF 10 Gambetta Paris Air France AN1 50 Hoche Blagnac Air Nul1 AC 8 Champs Elyseacutees Paris Castanet Air AN2 14 Foch Paris Air Nul2

Modifications 2

Modification 1

4055_02_C02 Page 48 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 49

chapitre ndeg 2 Manipulation des donneacutees

Agrave partir de la table Pilote le tableau suivant deacutecrit des modifications (certaines ne veacuterifientpas de contraintes) La mise agrave jour drsquoune cleacute eacutetrangegravere est possible si elle nrsquoest pas reacutefeacuterenceacuteepar une cleacute primaire (voir la section Inteacutegriteacute reacutefeacuterentielle)

Tableau 2-8 Table donneacutees et contraintes

Donneacutees Table et contraintes

Figure 2-7 Donneacutees CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) NOT NULL nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT ck_nbHVol CHECK (nbHVol BETWEEN 0 AND 20000) CONSTRAINT un_nom UNIQUE(nom) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))

Web

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

Tableau 2-9 Modifications

Veacuterifiant les contraintes (sauf une ) Ne veacuterifiant pas les contraintes

--Modification drsquoune cleacute eacutetrangegravereUPDATE Pilote SET compa = SING WHERE brevet = PL-2

-- Modification drsquoune cleacute primaireUPDATE Pilote SET brevet = PL3bis WHERE brevet = PL-3

--Passe outre la contrainte CHECK UPDATE Pilote SET nbHVol= 30000 WHERE brevet = PL-1

Figure 2-8 Apregraves modifications

mysqlgt UPDATE Pilote SET brevet=PL-2 WHERE brevet=PL-1ERROR 1062 (23000) Duplicate entry PL-2 for key 1

mysqlgt UPDATE Pilote SET nom = NULL WHERE brevet = PL-1ERROR 1263 (22004) Column set to default value NULL supplied to NOT NULL column nom at row 1

mysqlgt UPDATE Pilote SET nom=Paul Soutou WHERE brevet = PL-1ERROR 1062 (23000) Duplicate entry Paul Soutou for key 2

mysqlgt UPDATE Pilote SET compa=TOTO WHERE brevet = PL-1ERROR 1452 (23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))

Web

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 30000 AF PL-2 Jules Ente 900 SING PL3bis Paul Soutou 1000 SING

4055_02_C02 Page 49 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

50 copy Eacuteditions Eyrolles

Restrictions

Pour lrsquoheure il nrsquoest pas possible de modifier une table en utilisant une requecircte (dans la clauseSET) portant sur cette mecircme table

Dates et intervalles

Le tableau suivant reacutesume les principales opeacuterations possibles entre des colonnes de type date-heure

Consideacuterons la table suivante

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) dateNaiss DATETIME dernierVol DATE

dateEmbauche DATETIME prochainVolControle DATETIME

nombreJoursNaisBoulot INTEGER(5)

intervalleNaisBoulot Decimal (206) intervalleVolExterieur

Decimal (106)

intervalleEntreVols Decimal (106) intervalleEmbaucheControle

TIME

compa VARCHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

Agrave lrsquoinsertion du pilote Thierry Albaric de la compagnie de code AF initialisons sa date denaissance (25 mars 1967) la date de son dernier vol (30 octobre 2005) sa date drsquoembauche (agravecelle du jour) et la date de son prochain controcircle en vol (13 novembre 2005 15h30)

INSERT INTO Pilote VALUES

(PL-1 Thierry Albaric1967-03-252005-10-30 SYSDATE()

2005-11-13 153000 NULL NULL NULL NULL NULL AF)

Les mises agrave jour par UPDATE sur cet enregistrement vont consister sur la base de ces quatredates agrave calculer les intervalles illustreacutes agrave la figure suivante

Tableau 2-10 Opeacuterations entre colonnes date-heure

Opeacuterande 1 Opeacuterateur Opeacuterande 2 Reacutesultat

DATE | DATETIME + ou - Interval DATE | DATETIME

DATE | DATETIME + ou - INTEGER DATE | DATETIME

TIME + ou - TIME TIME

TIME + ou - INTEGER TIME

Web

4055_02_C02 Page 50 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 51

chapitre ndeg 2 Manipulation des donneacutees

Modification drsquoune heure

On modifie une date en preacutecisant une heure via la fonction en rajoutant le format HHMMSSquels que soient les deacutelimiteurs (ici laquo raquo)

UPDATE Pilote SET dateNaiss = 1967-03-25 123500

WHERE brevet = PL-1

Ajout drsquoun deacutelai

On modifie la date drsquoembauche de 10 minutes apregraves la semaine prochaine Lrsquoajout drsquoun inter-valle srsquoopegravere par la fonction DATE_ADD coupleacutee agrave la directive DAY_MINUTE qui permet despeacutecifier un jour une heure et une minute Ainsi la semaine agrave ajouter correspond au laquo 7 raquo duparamegravetre de mecircme pour les 10 minutes

UPDATE Pilote

SET dateEmbauche =

WHERE brevet = PL-1

Diffeacuterence entre deux dates

La diffeacuterence entre deux dates peut se programmer agrave lrsquoaide de la fonction DATEDIFF quirenvoie un entier correspondant au nombre de jours seacuteparant les deux dates

UPDATE Pilote

SET nombreJoursNaisBoulot =

WHERE brevet = PL-1

Cette mecircme diffeacuterence au format drsquoun intervalle plus preacutecis (nombre de jours deacutecimaux) requiertlrsquoutilisation de la fonction TIMESTAMPDIFF(intervalledatetime1datetime2) quenous eacutetudierons au chapitre 4 (il existe bien sucircr drsquoautres possibiliteacutes de programmation) Cettefonction effectue la diffeacuterence entre deux dates suivant un format drsquointervalle donneacute (ici onobtient des secondes qursquoon divise par (243600) pour convertir en jours)

Figure 2-9 Intervalles agrave calculer

dateNais 2351967 qui passe agrave 12h35

dernierVol 30-10-2005

dateEmbauche 02-11-2005 x h y min qui passe agrave 09-11-2005 x h y+10 min

prochainVolControle13-11-2005 15h30

nombreJoursNaisBoulot

intervalleNaisBoulot

intervalleVolExterieur

intervalleEntreVols

intervalleEmbaucheControle

DATE_ADD(dateEmbaucheINTERVAL 7 010 DAY_MINUTE)

DATEDIFF(dateEmbauchedateNaiss)

4055_02_C02 Page 51 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

52 copy Eacuteditions Eyrolles

UPDATE Pilote SET

intervalleNaisBoulot =

intervalleEntreVols =

intervalleVolExterieur =

WHERE brevet = PL-1

Diffeacuterence entre deux intervalles

La diffeacuterence entre deux deacutecimaux renvoie un deacutecimal qursquoon convertit en format TIME (srsquoilest infeacuterieur agrave 839 h soit 3495 jours) par la fonction SEC_TO_TIME apregraves lrsquoavoir changeacute ensecondes (multiplieacute par 243600)

UPDATE Pilote SET

intervalleEmbaucheControle =

WHERE brevet = PL-1

La ligne contient deacutesormais les informations suivantes Les donneacutees en gras correspondentaux mises agrave jour On trouve qursquoil a fallu 14 109126875 jours pour que ce pilote soit embau-cheacute 106511181 jours seacuteparent le dernier vol du pilote du moment de son embauche14645833 jours seacuteparent son dernier vol de son prochain controcircle en vol La diffeacuterence entreces deux deacutelais est de 95 heures 52 minutes et 18 secondes

Nous verrons au chapitre 4 comment convertir en jours heures minutes et secondes un deacuteci-mal de grande taille

Figure 2-10 Ligne modifieacutee par des calculs de dates

TIMESTAMPDIFF(SECONDdateNaissdateEmbauche)(243600)

TIMESTAMPDIFF(SECONDdernierVolprochainVolControle)(243600)

TIMESTAMPDIFF(SECONDdernierVoldateEmbauche)(243600)

SEC_TO_TIME((intervalleEntreVols - intervalleVolExterieur)243600)

Pilote

brevet nom dateNaiss dernierVol dateEmbauche prochainVolControle

PL-1 Thierry Albaric 1967-03-25 1967-03-25 123500

2005-10-30 2005-11-02 152742 2005-11-09 153742

2005-11-13 153000

nombreJoursNaisBoulot intervalleNaisBoulot intervall eVolExterieur

13186 1596 14109126875 10651181

intervalleEntreVols intervalleEmbaucheControle compa

14645833 955218 AF

4055_02_C02 Page 52 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 53

chapitre ndeg 2 Manipulation des donneacutees

Fonctions utiles

Les fonctions suivantes vous seront drsquoun grand secours pour manipuler des dates et des intervalles

bull DATE_FORMAT(dateformat) convertit une date (heure) suivant un certain format

bull EXTRACT(type FROM date) extrait une partie donneacutee drsquoune date (heure)

bull FROM_DAYS(n) retourne une date agrave partir drsquoun entier (le 110001 correspond agrave 366) UNIX_TIMESTAMP(date) retourne le nombre de secondes qui se sont eacutecouleacutees depuis le1er janvier 1970 jusqursquoagrave la date (heure) en paramegravetre

bull GET_FORMAT(DATE|TIME|DATETIMEEUR|USA|JIS|ISO|INTERNAL)retourne un format de date (heure)

bull SEC_TO_TIME(secondes) convertit un nombre en un type TIME et son inverse TIME_TO_SEC(time)

bull STR_TO_DATE(chaineformat) convertit une chaicircne en date (heure) suivant un certain format

bull TIME(expression)extrait drsquoune date (heure) un type TIME

bull TIME_FORMAT(timeformat) convertit un intervalle suivant un certain format

Les tableaux suivants preacutesentent quelques exemples drsquoutilisation de ces fonctions

Tableau 2-11 Quelques formats pour DATE_FORMAT et STR_TO_DATE

Expression Reacutesultat Commentaire

DATE_FORMAT(SYSDATE()j) 306 Ce nrsquoest pas la vitesse de Danieldans Taxi2 mais le numeacutero du jourde lrsquoanneacutee (ici il srsquoagit du2 novembre 2005)

DATE_FORMAT(dateNaissW en M X)

Saturday en March 1967

Affichage des libelleacutes des jours etdes mois en anglais par deacutefaut

STR_TO_DATE(11092005 153742dmY His)

2005-09-11 153742 Conversion drsquoune chaicircne typeacutee datefranccedilaise au format DATETIME

Tableau 2-12 Utilisation de EXTRACT et UNIX_TIMESTAMP

Expression Reacutesultat Commentaire

EXTRACT(DAY FROM dateEmbauche) 9 Extraction du jour contenu dans la colonne

EXTRACT(MONTH FROM dateNaiss) 3 Extraction du mois contenu dans la colonne

UNIX_TIMESTAMP(SYSDATE())(243600) 130898850 Le 2 novembre 2005 au soir 13 089 jours etdes poussiegraveres srsquoeacutetaient eacutecouleacutes depuis1970

4055_02_C02 Page 53 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

54 copy Eacuteditions Eyrolles

Remplacement drsquoun enregistrement

Lrsquoinstruction REPLACE consiste comme son nom lrsquoindique agrave remplacer un enregistrementdans sa totaliteacute (toutes ses colonnes) Il faut avoir les privilegraveges INSERT et DELETE sur latable Crsquoest selon la valeur de la cleacute primaire ou celle drsquoun index unique que lrsquoenregistrementsera remplaceacute

Si la table ne dispose pas drsquoune contrainte PRIMARY KEY ou UNIQUE lrsquoutilisation de REPLACEnrsquoa pas de sens et devient eacutequivalente agrave INSERT

La syntaxe simplifieacutee de lrsquoinstruction UPDATE est la suivante

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] [nomBase] nomTable [(colonne1)]

VALUES (expression1 | DEFAULT) [()]

LOW_PRIORITY et DELAYED ont la mecircme signification que pour INSERT et UPDATE

VALUES contient les valeurs de remplacement

Lrsquoinstruction suivante remplace lrsquoenregistrement relatif agrave la compagnie de code AN1 (voirfigure 2-6)

REPLACE INTO Compagnie VALUES (AN1 24 Salas Ramonville Air RENATO)

Suppressions drsquoenregistrements

Les instructions DELETE et TRUNCATE permettent de supprimer un ou plusieurs enregistre-ments drsquoune table Pour pouvoir supprimer des enregistrements dans une table il faut quecette derniegravere soit dans votre base ou que vous ayez reccedilu le privilegravege DELETE sur la table

Instruction DELETELa syntaxe simplifieacutee de lrsquoinstruction DELETE est la suivante

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM [nomBase] nomTable

[WHERE (condition)]

[ORDER BY listeColonnes]

[LIMIT nbreLimite]

LOW_PRIORITY IGNORE et LIMIT ont la mecircme signification que pour UPDATE

4055_02_C02 Page 54 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 55

chapitre ndeg 2 Manipulation des donneacutees

QUICK (pour les tables de type MyISAM) ne met pas agrave jour les index associeacutes pour acceacuteleacutererle traitement

La condition du WHERE seacutelectionne les lignes agrave supprimer dans la table Si aucune condi-tion nrsquoest preacuteciseacutee toutes les lignes seront deacutetruites Si la condition ne seacutelectionne aucuneligne aucun enregistrement ne sera supprimeacute

ORDER BY reacutealise un tri des enregistrements qui seront effaceacutes dans cet ordre

Deacutetaillons les possibiliteacutes de cette instruction en consideacuterant les diffeacuterentes tables preacuteceacutedem-ment deacutefinies La premiegravere commande supprime tous les pilotes de la compagnie de code AFla seconde avec une autre eacutecriture deacutetruit la compagnie de code AF

DELETE FROM Pilote WHERE compa = AF

DELETE FROM Compagnie WHERE comp = AF

Tentons de supprimer une compagnie qui est reacutefeacuterenceacutee par un pilote agrave lrsquoaide drsquoune cleacute eacutetran-gegravere Il srsquoaffiche une erreur qui sera expliqueacutee dans la section Inteacutegriteacute reacutefeacuterentielle

mysqlgt DELETE FROM Compagnie WHERE comp = SING

ERROR 1451 (23000) Cannot delete or update a parent row a foreign

key constraint fails (`bdsoutoupilote` CONSTRAINT `fk_Pil_compa_

Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))

Deacutetruisons enfin les deux premiegraveres compagnies (trieacutees par ordre croissant de cleacute ici AC etAN1) qui ne sont reacutefeacuterenceacutees par aucun pilote

DELETE FROM Compagnie LIMIT 2

Instruction TRUNCATELa commande TRUNCATE est une extension de SQL qui a eacuteteacute proposeacutee par Oracle et reprisepar MySQL Cette commande supprime tous les enregistrements drsquoune table et libegravere eacuteven-tuellement lrsquoespace de stockage utiliseacute par la table La syntaxe est la suivante

TRUNCATE [TABLE] [nomBase] nomTable

Avec le moteur InnoDB lrsquoopeacuteration est programmeacutee en DELETE Pour les autres moteurslrsquoopeacuteration diffegravere de DELETE de la maniegravere suivante

La table est supprimeacutee (DROP) puis recreacuteeacutee (CREATE) ce qui est plus rapide que dedeacutetruire les enregistrements un agrave un

Lrsquoopeacuteration peut ecirctre interrompue si une transaction active utilise la table (ou si un verrouest poseacute)

Le nombre drsquoenregistrements supprimeacutes nrsquoest pas retourneacute

Lrsquoeacuteventuelle derniegravere valeur drsquoune colonne AUTO_INCREMENT nrsquoest pas meacutemoriseacutee

Web

4055_02_C02 Page 55 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

56 copy Eacuteditions Eyrolles

Il nrsquoest pas possible de laquo tronquer raquo une table qui est reacutefeacuterenceacutee par des cleacutes eacutetrangegraveres acti-ves La solution consiste agrave deacutesactiver les contraintes puis agrave tronquer la table

Inteacutegriteacute reacutefeacuterentielle

Lrsquointeacutegriteacute reacutefeacuterentielle forme le cœur de la coheacuterence drsquoune base de donneacutees relationnelleCette inteacutegriteacute est fondeacutee sur la relation entre cleacutes eacutetrangegraveres et cleacutes primaires (ou candidates colonnes indexeacutees uniques et non nulles) qui permettent de programmer des regravegles de gestion(exemple lrsquoaffregravetement drsquoun vol doit se faire par une compagnie et pour un avion tous deuxexistant dans la base de donneacutees) Ce faisant la plupart des controcircles cocircteacute client (interface)sont ainsi deacuteporteacutes cocircteacute serveur

Pour les regravegles de gestion plus complexes (exemple lrsquoaffregravetement drsquoun avion doit se faire parune compagnie qui a embaucheacute au moins quinze pilotes dans les six derniers mois) il faudraprogrammer un deacuteclencheur (deacutecrits au chapitre 7) Il faut savoir que les deacuteclencheurs sontplus peacutenalisants que des contraintes dans un mode transactionnel

La contrainte reacutefeacuterentielle concerne toujours deux tables ndash une table laquo pegravere raquo aussi dite laquo maicirctre raquo(parentreferenced) et une table laquo fils raquo (childdependent) ndash posseacutedant une ou plusieurs colonnesen commun Pour la table laquo pegravere raquo ces colonnes composent la cleacute primaire (ou candidate avec unindex unique) Pour la table laquo fils raquo ces colonnes composent une cleacute eacutetrangegravere

Syntaxe

Crsquoest seulement dans sa version 32344 en 2002 (dix ans apregraves Oracle) que MySQL a inclusdans son offre les contraintes reacutefeacuterentielles pour les tables InnoDB Lrsquointeacutegriteacute reacutefeacuterentielle seprogramme dans la table laquo fils raquo par la contrainte suivante Il est conseilleacute de nommer lacontrainte sinon MySQL srsquoen charge Si la cleacute eacutetrangegravere nrsquoest pas deacutejagrave indexeacutee MySQL srsquoencharge aussi Les deux tables ne doivent pas ecirctre temporaires

[CONSTRAINT nomContrainte] FOREIGN KEY [id] (listeColonneEnfant)

REFERENCES nomTable (listeColonneParent)

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

Coheacuterences assureacutees

Lrsquoexemple suivant illustre quatre contraintes reacutefeacuterentielles Une table peut ecirctre laquo pegravere raquo pourune contrainte et laquo fils raquo pour une autre (crsquoest le cas de la table Avion)

Web

4055_02_C02 Page 56 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 57

chapitre ndeg 2 Manipulation des donneacutees

Deux types de problegravemes sont automatiquement reacutesolus par MySQL pour assurer lrsquointeacutegriteacutereacutefeacuterentielle

bull La coheacuterence du laquo fils raquo vers le laquo pegravere raquo on ne doit pas pouvoir inseacuterer un enregistrementlaquo fils raquo (ou modifier sa cleacute eacutetrangegravere) rattacheacute agrave un enregistrement laquo pegravere raquo inexistant Il estcependant possible drsquoinseacuterer un laquo fils raquo (ou de modifier sa cleacute eacutetrangegravere) sans rattacherdrsquoenregistrement laquo pegravere raquo agrave la condition qursquoil nrsquoexiste pas de contrainte NOT NULL auniveau de la cleacute eacutetrangegravere

bull La coheacuterence du laquo pegravere raquo vers le laquo fils raquo on ne doit pas pouvoir supprimer un enregistre-ment laquo pegravere raquo si un enregistrement laquo fils raquo y est encore rattacheacute Il est possible de suppri-mer les laquo fils raquo associeacutes (DELETE CASCADE) drsquoaffecter la valeur nulle aux cleacutes eacutetrangegraveresdes laquo fils raquo associeacutes (DELETE SET NULL) ou de reacutepercuter une modification de la cleacute pri-maire du pegravere (UPDATE CASCADE et UPDATE SET NULL)

Deacuteclarons agrave preacutesent ces contraintes sous MySQL en deacutetaillant les options disponibles

Contraintes cocircteacute laquo pegravere raquo

Le tableau suivant illustre les deux possibiliteacutes (cleacute primaire ou candidate) dans le cas de latable Compagnie Notons que pour le cas de la cleacute candidate une cleacute primaire peut ecirctre deacutefi-nie par ailleurs (sur nomComp par exemple)

Figure 2-11 Inteacutegriteacute reacutefeacuterentielle

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2005-05-13 85 SING F-GAFU 2005-02-05 155 AF F-WTSS 2005-05-15 82

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

dependent child referenced parent

referenced parent

dependent child dependent child NOT NULL

4055_02_C02 Page 57 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

58 copy Eacuteditions Eyrolles

Contraintes cocircteacute laquo fils raquo

Indeacutependamment de lrsquoeacutecriture de la table laquo pegravere raquo plusieurs eacutecritures sont possibles au niveaude la table laquo fils raquo selon qursquoon creacuteeacute les index ou qursquoon laisse MySQL le faire et selon qursquoonnomme ou pas la contrainte de cleacute eacutetrangegravere

La premiegravere eacutecriture nomme la contrainte mais ne preacutecise rien agrave propos de lrsquoindex Ladeuxiegraveme ne nomme pas la contrainte mais deacutefinit lrsquoindex (sans option toutefois) Lrsquoeacutecritureagrave adopter est un meacutelange des deux agrave savoir nommer les contraintes et deacutecrire les index

Cleacutes composites et nulles

Les cleacutes eacutetrangegraveres ou primaires peuvent ecirctre deacutefinies sur plusieurs colonnes (16 au maxi-mum) on parle de composite keys

Des cleacutes eacutetrangegraveres peuvent ecirctre nulles (si elles ne font pas partie drsquoune cleacute primaire) siaucune contrainte NOT NULL nrsquoest deacuteclareacutee

Deacutecrivons agrave preacutesent le script SQL qui convient agrave notre exemple (la syntaxe de creacuteation desdeux premiegraveres tables a eacuteteacute discuteacutee plus haut) et eacutetudions ensuite les meacutecanismes program-meacutes par ces contraintes Deacutecidons qursquoun avion aura toujours un proprieacutetaire (NOT NULL)

Tableau 2-13 Eacutecritures des contraintes de la table laquo pegravere raquo

Cleacute primaire Cleacute candidate

CREATE TABLE Compagnie(comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) nomComp CHAR(15) CONSTRAINT pk_Compagnie PRIMARY KEY(comp))

CREATE TABLE Compagnie(comp CHAR(4) NOT NULL nrue INTEGER(3) rue CHAR(20) ville CHAR(15) nomComp CHAR(15) CONSTRAINT un_Compagnie UNIQUE(comp) CONSTRAINT pk_Compagnie PRIMARY KEY(nomComp))

Tableau 2-14 Eacutecritures des contraintes de la table laquo fils raquo

Contrainte nommeacutee sans index Contrainte pas nommeacutee et index

CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))

CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) INDEX (compa) FOREIGN KEY (compa) REFERENCESCompagnie(comp))

4055_02_C02 Page 58 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 59

chapitre ndeg 2 Manipulation des donneacutees

CREATE TABLE Avion

(immat CHAR(6) typeAvion CHAR(15) nbhVol DECIMAL(102)

proprio CHAR(4) NOT NULL CONSTRAINT pk_Avion PRIMARY KEY(immat)

INDEX (proprio)

CONSTRAINT fk_Avion_comp_Compag

FOREIGN KEY(proprio) REFERENCES Compagnie(comp))

CREATE TABLE Affreter

(compAff CHAR(4) immat CHAR(6) dateAff DATE nbPax INTEGER(3)

CONSTRAINT pk_Affreter PRIMARY KEY (compAff immat dateAff)

INDEX (immat)

CONSTRAINT fk_Aff_na_Avion

FOREIGN KEY(immat) REFERENCES Avion(immat)

INDEX (compAff)

CONSTRAINT fk_Aff_comp_Compag

FOREIGN KEY(compAff) REFERENCES Compagnie(comp))

Coheacuterence du fils vers le pegravere

Si la cleacute eacutetrangegravere est deacuteclareacutee NOT NULL lrsquoinsertion drsquoun enregistrement laquo fils raquo nrsquoest possibleque srsquoil est rattacheacute agrave un enregistrement laquo pegravere raquo existant Dans le cas inverse lrsquoinsertion drsquounenregistrement laquo fils raquo rattacheacute agrave aucun laquo pegravere raquo est possible

Le tableau suivant deacutecrit des insertions correctes et une incorrecte Le message drsquoerreur est icien anglais (il y est question de ne pouvoir ajouter un enregistrement laquo fils raquo)

Pour inseacuterer un affregravetement il faut donc avoir ajouteacute au preacutealable au moins une compagnie etun avion Le chargement de la base de donneacutees est conditionneacute par la hieacuterarchie des contrain-tes reacutefeacuterentielles Ici il faut inseacuterer drsquoabord les compagnies puis les pilotes (ou les avions)enfin les affregravetements

Tableau 2-15 Insertions correctes et incorrectes

Insertions correctes Insertion incorrecte

-- fils avec pegravere INSERT INTO Pilote VALUES (PL-3 Paul Soutou 1000 SING)-- fils sans pegravereINSERT INTO Pilote VALUES (PL-4 Un Connu 0 NULL)-- fils avec pegraveresINSERT INTO Avion VALUES (F-WTSS Concorde 6570 SING)INSERT INTO Affreter VALUES(AF F-WTSS 15-05-2003 82)

-- avec pegravere inconnumysqlgt INSERT INTO Pilote VALUES (PL-5 Pb de Compagnie 0 )

ERROR 1452 (23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT`fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))

Web

4055_02_C02 Page 59 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

60 copy Eacuteditions Eyrolles

Il suffit de relire le script de creacuteation de vos tables pour en deacuteduire lrsquoordre drsquoinsertion des enre-gistrements

Coheacuterence du pegravere vers le fils

En fonction des options choisies au niveau de la contrainte reacutefeacuterentielle se trouvant dans latable laquo fils raquo

CONSTRAINT nomContrainte FOREIGN KEY hellip REFERENCES hellip

plusieurs sceacutenarios sont possibles pour assurer la coheacuterence de la table laquo pegravere raquo vers la table laquo fils raquo

Preacutevenir la modification ou la suppression drsquoune cleacute primaire (ou candidate) de la tablelaquo pegravere raquo Cette alternative est celle par deacutefaut Soit vous nrsquoajoutez pas drsquooption agrave la clauseREFERENCES ndash dans notre exemple toutes les cleacutes eacutetrangegraveres sont ainsi composeacutees ndash soitvous utilisez NO ACTION pour les directives ON DELETE et ON UPDATE La suppressiondrsquoun avion nrsquoest donc pas possible si ce dernier est reacutefeacuterenceacute dans un affregravetement

Propager la suppression des enregistrements laquo fils raquo associeacutes agrave lrsquoenregistrement laquo pegravere raquosupprimeacute Ce meacutecanisme est reacutealiseacute par la directive ON DELETE CASCADE Dans notre exem-ple nous pourrions ainsi deacutecider de supprimer tous les affregravetements degraves qursquoon retire un avion

Eacutetendre la modification de la cleacute primaire de lrsquoenregistrement laquo pegravere raquo aux enregistrementslaquo fils raquo associeacutes Ce meacutecanisme est reacutealiseacute par la directive ON UPDATE CASCADE Dansnotre exemple nous pourrions ainsi deacutecider de mettre agrave jour tous les affregravetements degravesqursquoon modifie lrsquoimmatriculation drsquoun avion

Propager lrsquoaffectation de la valeur nulle aux cleacutes eacutetrangegraveres des enregistrements laquo fils raquoassocieacutes agrave lrsquoenregistrement laquo pegravere raquo supprimeacute ou modifieacute Ce meacutecanisme est reacutealiseacute par ladirective ON DELETE SET NULL (ou ON UPDATE SET NULL en cas de modification dela cleacute primaire du laquo pegravere raquo) Dans ces deux cas il ne faut pas poser de contrainte NOTNULL sur la cleacute eacutetrangegravere Dans notre exemple nous pourrions ainsi deacutecider de mettreNULL dans la colonne compa de la table Pilote pour chaque pilote drsquoune compagniesupprimeacutee Nous ne pourrions pas appliquer ce meacutecanisme agrave la table Affreter quidispose de contraintes NOT NULL sur ses cleacutes eacutetrangegraveres (car composant la cleacute primaire)

RESTRICT est une directive de la norme SQL qui nrsquoest pas encore mise en œuvre sousMySQL Elle concerne les SGBD compatibles avec les contraintes diffeacutereacutees Pour lrsquoheure NOACTION (qui en principe diffegravere les contraintes) et RESTRICT (qui ne diffegravere pas les contraintes)jouent le mecircme rocircle

Les options DELETE CASCADE et DELETE SET NULL sont disponibles depuis laversion 32350 celles relatives agrave ON UPDATE sont disponibles depuis la version 408

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

4055_02_C02 Page 60 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 61

chapitre ndeg 2 Manipulation des donneacutees

Le tableau suivant deacutecrit quelques alternatives de coheacuterence agrave notre base de donneacutees exempleentre les tables Avion et Affreter puis Pilote et Compagnie

Pour lrsquoheure aucun deacuteclencheur ne peut ecirctre activeacute suite agrave la modification drsquoune colonneinduite drsquoune action de reacutepercussion (CASCADE ou SET NULL)

MySQL ne permet pas encore de propager une valeur par deacutefaut (set default) comme la normeSQL le preacutevoit

Tableau 2-16 Alternatives de coheacuterence du laquo pegravere raquo vers les laquo fils raquo

Alternatives Syntaxe Message drsquoerreur

Preacutevenir la modification de lrsquoimmatriculation drsquoun avion ou la suppression drsquoun avion

--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON DELETE NO ACTION ON UPDATE NO ACTION

mysqlgt DELETE FROM AvionERROR 1451 (23000) Cannot delete or update a parent row a foreign key constraint fails (`bdsoutouaffreter` CONSTRAINT `fk_Aff_na_Avion` FOREIGN KEY (`immat`) REFERENCES `avion` (`immat`)ON DELETE NO ACTION ON UPDATE NO ACTION)

Propager la suppression drsquoun avion

--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON DELETE CASCADE

Propager la modification de lrsquoimmatriculation drsquoun avion

--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON UPDATE CASCADE

Propager la modification du code de la compagnie dansles tables Pilote Avion et Affreter Affecter la valeur nulle dans la table Pilote suite agrave la suppression drsquoune compagnie tout en preacuteservant lrsquointeacutegriteacute avec la table Avion

--dans AffreterCONSTRAINT fk_Aff_comp_Compag FOREIGN KEY(compAff) REFERENCES Compagnie(comp) ON UPDATE CASCADE--dans AvionCONSTRAINT fk_Avion_comp_Compag FOREIGN KEY(proprio) REFERENCES Compagnie(comp) ON UPDATE CASCADE--dans PiloteCONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp) ON DELETE SET NULL ON UPDATE CASCADE

Web

4055_02_C02 Page 61 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

62 copy Eacuteditions Eyrolles

En reacutesumeacute

Le tableau suivant reacutesume les conditions requises pour modifier lrsquoeacutetat de la base de donneacutees enrespectant lrsquointeacutegriteacute reacutefeacuterentielle

Insertions agrave partir drsquoun fichier

Lrsquoimportation de donneacutees (au format fichier texte) dans une table peut ecirctre programmeacutee agravelrsquoaide de la directive LOAD DATA INFILE Un tel meacutecanisme lit un fichier dans un reacuteper-toire du serveur et insegravere tout ou partie des informations dans une table La syntaxe simplifieacuteede cette directive est la suivante

LOAD DATA INFILE nomEtCheminFichiertxt

[REPLACE | IGNORE] INTO TABLE nomTable

[FIELDS [TERMIATED BY string]

[[OPTIONALLY] ENCLOSED BY char]

[ESCAPED BY char ] ]

[LINES [STARTING BY string] [TERMINATED BY string] ]

[IGNORE number LINES]

REPLACE option agrave utiliser pour remplacer systeacutematiquement les anciens enregistrementspar les nouveaux (valeur de cleacute primaire ou drsquoindex unique)

IGNORE fait en sorte de ne pas inseacuterer des enregistrements de cleacute primaire ou drsquoindexunique deacutejagrave preacutesents dans la table

Tableau 2-17 Instructions SQL sur les cleacutes

Instructions Table laquo pegravere raquo Table laquo fils raquo

INSERT Correcte si la cleacute primaire (ou candidate) est unique

Correcte si la cleacute eacutetrangegravere est reacutefeacuterenceacutee dans la table laquo pegravere raquo ou est nulle (partiellement ou en totaliteacute)

UPDATE Correcte si lrsquoinstruction ne laisse pas drsquoenregistrements dans la table laquo fils raquo ayant une cleacute eacutetrangegravere non reacutefeacuterenceacutee

Correcte si la nouvelle cleacute eacutetrangegravere reacutefeacuterence un enregistrement laquo pegravere raquo existant

DELETE Correcte si aucun enregistrement de la table laquo fils raquo ne reacutefeacuterence le ou les enregistrements deacutetruits

Correcte sans condition

DELETE Cascade Correcte sans condition Sans objet

DELETE SET NULL Correcte sans condition Sans objet

UPDATE Cascade Correcte sans condition Sans objet

UPDATE SET NULL Correcte srsquoil nrsquoy a pas de NOT NULL dans la table laquo fils raquo

Sans objet

4055_02_C02 Page 62 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 63

chapitre ndeg 2 Manipulation des donneacutees

FIELDS deacutecrit comment sont formateacutees dans le fichier les valeur agrave inseacuterer dans la tableEn lrsquoabsence de cette clause TERMINATED BY vaut t ENCLOSED BY vaut etESCAPED BY vaut

ndash FIELDS TERMINATED BY deacutecrit le caractegravere qui seacutepare deux valeurs de colonnes

ndash FIELDS ENCLOSED BY permet de controcircler le caractegravere qui encadrera chaque valeurde colonne

ndash FIELDS ESCAPED BY permet de controcircler les caractegraveres speacuteciaux

LINES deacutecrit comment seront eacutecrites dans le fichier les lignes extraites de(s) table(s) Enlrsquoabsence de cette clause TERMINATED BY vaut n et STARTING BY vaut

IGNORE permet de ne pas importer les nb premiegraveres lignes du fichier (contenant des eacuteven-tuelles deacuteclarations)

Lisons le fichier laquo pilotestxt raquo situeacute dans le reacutepertoire laquo Ddev raquo (ouvert agrave lrsquoaide du Word-Pad dans la figure suivante) en important la totaliteacute des donneacutees dans la table Pilote2 creacuteeacutee agravecet effet (brevet VARCHAR(6) nom VARCHAR(16) nbHVol DECIMAL(72)compa CHAR(4) et PRIMARY KEY(brevet)) Notez lrsquoutilisation du double laquo raquo pour deacutesi-gner une arborescence Windows Le caractegravere NULL est importeacute par le caractegravere laquo N raquo

Une fois la table creacuteeacutee il est possible de lrsquointerroger

mysqlgt SELECT FROM Pilote2 ORDER BY compa nom

+--------+------------------+---------+-------+

| brevet | nom | nbHVol | compa |

+--------+------------------+---------+-------+

| PL-5 | Daniel Vielle | NULL | AF |

| PL-2 | Didier Donsez | 000 | AF |

| PL-1 | Gratien Viel | 45000 | AF |

| PL-4 | Placide Fresnais | 245000 | CAST |

| PL-3 | Richard Grin | 100000 | SING |

+--------+------------------+---------+-------+

Figure 2-12 Importation de donneacutees

LOAD DATA INFILE Ddevpilotestxt REPLACE INTO TABLE Pilote2FIELDS TERMINATED BY ENCLOSED BY LINES STARTING BY import -Pilote TERMINATED BY $ n

4055_02_C02 Page 63 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

64 copy Eacuteditions Eyrolles

Exercices

Les objectifs de ces exercices sont

drsquoinseacuterer des donneacutees dans les tables du scheacutema Parc Informatique

de creacuteer une seacutequence et drsquoinseacuterer des donneacutees en utilisant une seacutequence

de modifier des donneacutees

21 Insertion de donneacutees

Eacutecrire puis exeacutecuter le script SQL (que vous appellerez insParcsql) afin drsquoinseacuterer les donneacuteesdans les tables suivantes

Tableau 2-18 Donneacutees des tables

Table Donneacutees

Segment INDIP NOMSEGMENT ETAGE----------- -------------------- ----------13012080 Brin RDC13012081 Brin 1er eacutetage13012082 Brin 2e eacutetage

Salle NSALLE NOMSALLE NBPOSTE INDIP------- -------------------- ---------- -----------s01 Salle 1 3 13012080s02 Salle 2 2 13012080s03 Salle 3 2 13012080s11 Salle 11 2 13012081s12 Salle 12 1 13012081s21 Salle 21 2 13012082s22 Salle 22 0 13012083s23 Salle 23 0 13012083

Poste NPOSTE NOMPOSTE INDIP AD TYPEPOSTE NSALLE------- -------------------- ----------- --- --------- -------p1 Poste 1 13012080 01 TX s01p2 Poste 2 13012080 02 UNIX s01p3 Poste 3 13012080 03 TX s01p4 Poste 4 13012080 04 PCWS s02p5 Poste 5 13012080 05 PCWS s02p6 Poste 6 13012080 06 UNIX s03p7 Poste 7 13012080 07 TX s03p8 Poste 8 13012081 01 UNIX s11p9 Poste 9 13012081 02 TX s11p10 Poste 10 13012081 03 UNIX s12p11 Poste 11 13012082 01 PCNT s21p12 Poste 12 13012082 02 PCWS s21

4055_02_C02 Page 64 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 65

chapitre ndeg 2 Manipulation des donneacutees

22 Gestion drsquoune seacutequence

Dans ce mecircme script geacuterer la seacutequence associeacutee agrave la colonne numIns commenccedilant agrave la valeur 1 demaniegravere agrave inseacuterer les enregistrements suivants

Logiciel NLOG NOMLOG DATEACH VERSION TYPELOG PRIX ----- -------------------- ---------- ------- --------- --------log1 Oracle 6 1995-05-13 62 UNIX 3000log2 Oracle 8 1999-09-15 8i UNIX 5600log3 SQL Server 1998-04-12 7 PCNT 2700log4 Front Page 1997-06-03 5 PCWS 500log5 WinDev 1997-05-12 5 PCWS 750log6 SQLNet 20 UNIX 500log7 I I S 2002-04-12 2 PCNT 810log8 DreamWeaver 2003-09-21 20 BeOS 1400

Types TYPELP NOMTYPE--------- --------------------TX Terminal X-WindowUNIX Systegraveme UnixPCNT PC Windows NTPCWS PC WindowsNC Network Computer

Tableau 2-18 Donneacutees des tables (suite)

Table Donneacutees

Tableau 2-19 Donneacutees de la table Installer

Table Donneacutees

Installer NPOSTE NLOG NUMINS DATEINS DELAI------- --------- ------- -------- -------------------------p2 log1 1 2003-05-15p2 log2 2 2003-09-17p4 log5 3 p6 log6 4 2003-05-20p6 log1 5 2003-05-20p8 log2 6 2003-05-19p8 log6 7 2003-05-20p11 log3 8 2003-04-20p12 log4 9 2003-04-20p11 log7 10 2003-04-20p7 log7 11 2002-04-01

4055_02_C02 Page 65 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

66 copy Eacuteditions Eyrolles

23 Modification de donneacutees

Eacutecrire le script modificationsql qui permet de modifier (avec UPDATE) la colonne etage (pourlrsquoinstant nulle) de la table Segment afin drsquoaffecter un numeacutero drsquoeacutetage correct (0 pour le segment13012080 1 pour le segment 13012081 2 pour le segment 13012082)

Diminuer de 10 le prix des logiciels de type PCNT

Veacuterifier

SELECT FROM SegmentSELECT nLog typeLog prix FROM Logiciel

4055_02_C02 Page 66 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

67

Chapitre 3

Eacutevolution drsquoun scheacutema

Lrsquoeacutevolution drsquoun scheacutema est un aspect tregraves important agrave prendre en compte car il reacutepond auxbesoins de maintenance des applicatifs qui utilisent la base de donneacutees Nous verrons qursquoil estpossible de modifier une base de donneacutees drsquoun point de vue structurel (colonnes et index) maisaussi comportemental (contraintes)

Lrsquoinstruction principalement utiliseacutee est

ALTER TABLE

(commande du LDD) qui permetdrsquoajouter de renommer de modifier et de supprimer des colonnes drsquoune table Ellepermet aussi drsquoajouter et de supprimer des contraintes Avant de deacutetailler ces meacutecanis-mes eacutetudions la commande qui permet de renommer une table

Renommer une table (

RENAME

)

Lrsquoinstruction

RENAME

renomme une ou plusieurs tables ou vues Il faut posseacuteder le privilegravege

ALTER

et

DROP

sur la table drsquoorigine et

CREATE

sur la base

RENAME

[

nomBase

]

ancienNomTable

TO [

nomBase

]

nouveauNomTable

[[

nomBase

]

ancienNom2

TO [

nomBase

]

nouveauNom2

]]

Les contraintes drsquointeacutegriteacute index et preacuterogatives associeacutes agrave lrsquoancienne table sont automatique-ment transfeacutereacutes sur la nouvelle En revanche les vues et proceacutedures catalogueacutees sont invali-deacutees et doivent ecirctre recreacuteeacutees

Il est aussi possible drsquoutiliser lrsquooption

RENAME TO

de lrsquoinstruction

ALTER TABLE

pourrenommer une table existante Le tableau suivant deacutecrit comment renommer la table

Pilote

sans perturber lrsquointeacutegriteacute reacutefeacuterentielle

Tableau 3-1 Renommer une table

Commande RENAME Commande ALTER TABLE

RENAME

Pilote

TO

Naviguant

ALTER TABLE

Pilote

RENAME

TO

Naviguant

4055_03_C03 Page 67 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

68

copy Eacuteditions Eyrolles

Modifications structurelles (

ALTER TABLE

)

Consideacuterons la table suivante que nous allons faire eacutevoluer

Ajout de colonnes

La directive

ADD

de lrsquoinstruction

ALTER TABLE

permet drsquoajouter une nouvelle colonne agrave unetable Cette colonne est initialiseacutee agrave

NULL

pour tous les enregistrements (agrave moins de speacutecifierune contrainte

DEFAULT

auquel cas tous les enregistrements de la table sont mis agrave jour avecune valeur non nulle)

Il est possible drsquoajouter une colonne en ligne

NOT NULL

seulement si la table est vide ou si unecontrainte

DEFAULT

est deacutefinie sur la nouvelle colonne (dans le cas inverse il faudra utiliser

MODIFY

agrave la place de

ADD

)

Le script suivant ajoute trois colonnes agrave la table

Pilote

La premiegravere instruction insegravere lacolonne

nbHVol

en lrsquoinitialisant agrave

NULL

pour tous les pilotes (ici il nrsquoen existe qursquoune seule)La deuxiegraveme commande ajoute deux colonnes initialiseacutees agrave une valeur non nulle La colonne

ville

ne sera jamais nulle

ALTER TABLE

Pilote

ADD

(nbHVol DECIMAL(72))

ALTER TABLE

Pilote

ADD

(compa VARCHAR(4) DEFAULT AF

ville VARCHAR(30) DEFAULT Paris NOT NULL)

La table est deacutesormais la suivante

Figure 3-1

Table agrave modifier

CREATE TABLE Pilote (brevet VARCHAR(4) nom VARCHAR(20))

INSERT INTO Pilote VALUES (PL -1 Agnegraves Labat)

Pilote

brevet nom

PL-1 Agnegraves Labat

Figure 3-2

Table apregraves lrsquoajout de colonnes

Web

Pilote

brevet nom nbHVol compa ville

PL-1 Agnegraves Labat AF Paris

4055_03_C03 Page 68 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

69

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Renommer des colonnes

Il faut utiliser lrsquooption

CHANGE

de lrsquoinstruction

ALTER TABLE

pour renommer une colonneexistante Le nouveau nom de colonne ne doit pas ecirctre deacutejagrave utiliseacute dans la table Le type (avecune eacuteventuelle contrainte) doit ecirctre repreacuteciseacute La position de la colonne peut aussi ecirctre modi-fieacutee en mecircme temps La syntaxe geacuteneacuterale de cette option est la suivante

ALTER TABLE

[

nomBase

]

nomTable

CHANGE

[COLUMN]

ancienNom

nouveauNom

typeMySQL

[NOT NULL | NULL] [DEFAULT

valeur

]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT

chaine

] [REFERENCES ]

[FIRST|AFTER

nomColonne

]

Lrsquoinstruction suivante permet de renommer la colonne

ville

en

adresse

en la positionnantavant la colonne

compa

ALTER TABLE Pilote CHANGE ville adresse VARCHAR(30) AFTER nbHVol

Modifier le type des colonnes

Lrsquooption MODIFY de lrsquoinstruction ALTER TABLE modifie le type drsquoune colonne existantesans pour autant la renommer La syntaxe geacuteneacuterale de cette instruction est la suivante lesoptions sont les mecircmes que pour CHANGE

ALTER TABLE [nomBase]nomTable MODIFY [COLUMN] nomColonneAmodifier

typeMySQL [NOT NULL | NULL] [DEFAULT valeur]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT chaine] [REFERENCES ]

[FIRST|AFTER nomColonne]

Il est possible drsquoaugmenter la taille drsquoune colonne numeacuterique (largeur ou preacutecision) ndash ou drsquounechaicircne de caractegraveres (CHAR et VARCHAR) ndash ou de la diminuer si toutes les donneacutees preacutesentesdans la colonne peuvent srsquoadapter agrave la nouvelle taille

Attention agrave ne pas reacuteduire les colonnes indexeacutees agrave une taille infeacuterieure agrave celle deacuteclareacutee lors dela creacuteation de lrsquoindex

Les contraintes en ligne peuvent ecirctre aussi modifieacutees par cette instruction Une fois la colonnechangeacutee les nouvelles contraintes srsquoappliqueront aux mises agrave jour ulteacuterieures de la table et lesdonneacutees preacutesentes devront toutes veacuterifier cette nouvelle contrainte

4055_03_C03 Page 69 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

70 copy Eacuteditions Eyrolles

Le tableau suivant preacutesente diffeacuterentes modifications de colonnes

La table est deacutesormais la suivante

Valeurs par deacutefaut

Lrsquooption ALTER COLUMN de lrsquoinstruction ALTER TABLE modifie la valeur par deacutefaut drsquounecolonne existante La syntaxe geacuteneacuterale de cette instruction est la suivante

ALTER TABLE [nomBase]nomTable ALTER [COLUMN] nomColonneAmodifier

SET DEFAULT lsquochainersquo | DROP DEFAULT

Le script suivant deacutefinit une valeur par deacutefaut pour la colonne adresse puis supprime cellerelative agrave la colonne compa

ALTER TABLE Pilote ALTER COLUMN adresse SET DEFAULT Blagnac

ALTER TABLE Pilote ALTER COLUMN compa DROP DEFAULT

Supprimer des colonnes

Lrsquooption DROP de lrsquoinstruction ALTER TABLE permet de supprimer une colonne (aussi unindex ou une cleacute que nous eacutetudierons plus loin) La possibiliteacute de supprimer une colonne eacuteviteaux administrateurs drsquoexporter les donneacutees de recreacuteer une nouvelle table drsquoimporter les

Tableau 3-2 Modifications de colonnes

Instructions SQL Commentaires

ALTER TABLE Pilote MODIFY compa VARCHAR(6) DEFAULT SINGINSERT INTO Pilote (brevet nom) VALUES (PL-2 Laurent Boutrand)

Augmente la taille de la colonne compa et changela contrainte de valeur par deacutefaut puis insegravere unnouveau pilote

ALTER TABLE Pilote MODIFY compa CHAR(4) NOT NULL

Diminue la colonne et modifie eacutegalement son typede VARCHAR en CHAR tout en le deacuteclarant NOTNULL (possible car les donneacutees contenues dans lacolonne ne deacutepassent pas quatre caractegraveres)

ALTER TABLE Pilote MODIFY compa CHAR(4)

Rend possible lrsquoinsertion de valeur nulle dans lacolonne compa

Figure 3-3 Apregraves modification des colonnes

Pilote

brevet nom nbHVol adresse compa

PL-1 Agnegraves Labat Paris AF

PL-2 Laurent Boutrand Paris SING

CHAR(4)NULL possibleDeacutefaut lsquoSINGrsquo

4055_03_C03 Page 70 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 71

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

donneacutees et de recreacuteer les eacuteventuels index et contraintes Lorsqursquoune colonne est supprimeacutee lesindex qui lrsquoutilisent sont mis agrave jour voire eacutelimineacutes si toutes les colonnes qui le composent sonteffaceacutees La syntaxe des ces options est la suivante

ALTER TABLE [nomBase]nomTable DROP [COLUMN] nomColonne | PRIMARY KEY

| INDEX nomIndex | FOREIGN KEY nomContrainte

Il nrsquoest pas possible de supprimer avec cette instruction

bull toutes les colonnes drsquoune table

bull les colonnes qui sont cleacutes primaires (ou candidates par UNIQUE) reacutefeacuterenceacutees par des cleacuteseacutetrangegraveres

La suppression de la colonne adresse de la table Pilote est programmeacutee par lrsquoinstructionsuivante

ALTER TABLE Pilote DROP COLUMN adresse

Modifications comportementales

Nous eacutetudions dans cette section les meacutecanismes drsquoajout de suppression drsquoactivation et dedeacutesactivation de contraintes

Faisons eacutevoluer le scheacutema suivant Les seules contraintes existantes sont les cleacutes primairesnommeacutees pk_Compagnie pour la table Compagnie et pk_Avion pour la table Avion

Ajout de contraintes

Jusqursquoagrave preacutesent nous avons creacuteeacute les contraintes en mecircme temps que les tables Il est possiblede creacuteer des tables sans contraintes (dans ce cas lrsquoordre de geacuteneacuteration nrsquoest pas important et on

Figure 3-4 Scheacutema agrave faire eacutevoluer

Web

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85 SING F-GAFU 2003-02-05 155 AF F-WTSS 2003-05-15 82

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

4055_03_C03 Page 71 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

72 copy Eacuteditions Eyrolles

peut mecircme les eacutelaborer par ordre alphabeacutetique) puis drsquoajouter les contraintes Les outils deconception (WinrsquoDesign Designer ou PowerAMC) adoptent cette deacutemarche lors de la geacuteneacutera-tion automatique de scripts SQL

La directive ADD CONSTRAINT de lrsquoinstruction ALTER TABLE permet drsquoajouter une contrainteagrave une table Il est aussi possible drsquoajouter un index La syntaxe geacuteneacuterale est la suivante

ALTER TABLE [nomBase]nomTable ADD INDEX [nomIndex] [typeIndex] (nomColonne1) | CONSTRAINT nomContrainte typeContrainte

Trois types de contraintes sont possibles

UNIQUE (colonne1 [colonne2])

PRIMARY KEY (colonne1 [colonne2])

FOREIGN KEY (colonne1 [colonne2])

REFERENCES nomTablePegravere (col1 [col2])

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

Uniciteacute

Ajoutons la contrainte drsquouniciteacute portant sur la colonne du nom de la compagnie Un index estautomatiquement geacuteneacutereacute sur cette colonne agrave preacutesent

ALTER TABLE Compagnie ADD CONSTRAINT un_nomC UNIQUE (nomComp)

Cleacute eacutetrangegravere

Ajoutons la cleacute eacutetrangegravere (indexeacutee) agrave la table Avion au niveau de la colonne proprio en luiassignant une contrainte NOT NULL

ALTER TABLE Avion ADD INDEX (proprio)

ALTER TABLE Avion ADD CONSTRAINT fk_Avion_comp_Compag

FOREIGN KEY(proprio) REFERENCES Compagnie(comp)

ALTER TABLE Avion MODIFY proprio CHAR(4) NOT NULL

Cleacute primaire

Ajoutons agrave la table Affreter en une seule instruction sa cleacute primaire et deux cleacutes eacutetrangegrave-res (une vers la table Avion et lrsquoautre vers Compagnie)

ALTER TABLE Affrete ADD (CONSTRAINT pk_Affreter PRIMARY KEY (compAff immat dateAff)CONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES

Avion(immat)CONSTRAINT fk_Aff_comp_Compag FOREIGN KEY(compAff)

REFERENCES Compagnie(comp))

4055_03_C03 Page 72 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 73

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Pour que lrsquoajout ou la modification drsquoune contrainte soient possibles il faut que les donneacuteespreacutesentes dans la table concerneacutee ou reacutefeacuterenceacutee respectent la nouvelle contrainte

Les tables contiennent agrave preacutesent les contraintes suivantes

Suppression de contraintes

Il nrsquoexiste pas encore lrsquooption DROP CONSTRAINT agrave lrsquoinstruction ALTER TABLE poursupprimer une contrainte de nom donneacutee (peut-ecirctre parce que les contraintes CHECK ne sontpas encore consideacutereacutees et car la prise en compte des contraintes a eacuteteacute eacutetaleacutee au fil des versionssuccessives de MySQL) Il faut donc utiliser une directive diffeacuterente de lrsquoinstruction ALTERTABLE pour supprimer chaque type de contrainte

Contrainte NOT NULL

Il faut utiliser la directive MODIFY de lrsquoinstruction ALTER TABLE pour supprimer unecontrainte NOT NULL existant sur une colonne Dans notre exemple deacutetruisons la contrainteNOT NULL de la cleacute eacutetrangegravere proprio dans la table Avion

ALTER TABLE Avion MODIFY proprio CHAR(4) NULL

Contrainte UNIQUE

Il faut utiliser la directive DROP INDEX de lrsquoinstruction ALTER TABLE pour supprimer unecontrainte drsquouniciteacute Dans notre exemple effaccedilons la contrainte portant sur le nom de lacompagnie Lrsquoindex est eacutegalement deacutetruit

ALTER TABLE Compagnie DROP INDEX un_nomC

Figure 3-5 Apregraves ajout de contraintes

Web Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85 SING F-GAFU 2003-02-05 155 AF F-WTSS 2003-05-15 82

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

referenced parent

referenced parent

dependent child dependent child NOT NULL

4055_03_C03 Page 73 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

74 copy Eacuteditions Eyrolles

Cleacute eacutetrangegravere

Lrsquooption DROP FOREIGN KEY de lrsquoinstruction ALTER TABLE permet de supprimer une cleacuteeacutetrangegravere drsquoune table La syntaxe geacuteneacuterale est la suivante

ALTER TABLE [nomBase]nomTable DROP FOREIGN KEY nomContrainte

Le nom de la contrainte est celui qui a eacuteteacute deacuteclareacute lors de la creacuteation de la table soit lors de samodification (dans CREATE TABLE ou ALTER TABLE)

Si la contrainte a eacuteteacute deacutefinie sans ecirctre nommeacutee son nom est geacuteneacutereacute par le moteur InnoDB etlrsquoinstruction SHOW CREATE TABLE [nomBase]nomTable permet de le deacutecouvrir

Deacutetruisons la cleacute eacutetrangegravere de la colonne proprio

ALTER TABLE Avion DROP FOREIGN KEY fk_Avion_comp_Compag

Cleacute primaire

Lrsquooption DROP PRIMARY KEY de lrsquoinstruction ALTER TABLE permet de supprimer une cleacuteprimaire Dans des versions preacuteceacutedentes de MySQL si aucune cleacute primaire nrsquoexistait lapremiegravere contrainte UNIQUE disparaissait agrave la place Ce nrsquoest plus le cas depuis la version 51

Si la colonne cleacute primaire agrave supprimer contient des cleacutes eacutetrangegraveres il faut drsquoabord retirer lescontraintes de cleacute eacutetrangegravere Si la cleacute primaire agrave supprimer est reacutefeacuterenceacutee par des cleacutes eacutetran-gegraveres drsquoautres tables il faut drsquoabord ocircter les contraintes de cleacute eacutetrangegravere de ces autres tables

Ainsi pour supprimer la cleacute primaire de la table Affreter il faut drsquoabord enlever les deuxcontraintes de cleacute eacutetrangegravere concernant des colonnes composant la cleacute primaire

ALTER TABLE Affreter DROP FOREIGN KEY fk_Aff_na_Avion

ALTER TABLE Affreter DROP FOREIGN KEY fk_Aff_comp_Compag

ALTER TABLE Affreter DROP PRIMARY KEY

La figure suivante illustre les contraintes qui restent actives les cleacutes primaires des tablesCompagnie et Avion et une contrainte de non nulliteacute

Aucun ordre particulier nrsquoest neacutecessaire pour supprimer ces trois contraintes car il nrsquoy a plusde contrainte reacutefeacuterentielle active

4055_03_C03 Page 74 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 75

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Concernant tout scheacutema il faut eacuteliminer drsquoabord les contraintes de cleacute eacutetrangegravere des tableslaquo fils raquo puis laquo pegravere raquo puis les contraintes de cleacute primaire Il suffit pour eacuteviter toute incoheacuterencede deacutetruire les contraintes dans lrsquoordre inverse drsquoapparition dans le script de creacuteation

Deacutesactivation des contraintes

La deacutesactivation des contraintes reacutefeacuterentielles peut ecirctre inteacuteressante pour acceacuteleacuterer des proceacute-dures de chargement drsquoimportation et drsquoexportation massives de donneacutees externes Ce meacuteca-nisme ameacuteliore aussi les performances de programmes batchs qui ne modifient pas desdonneacutees concerneacutees par lrsquointeacutegriteacute reacutefeacuterentielle ou pour lesquelles on veacuterifie la coheacuterence dela base agrave la fin En effet les index ne sont pas mis agrave jour pour chaque insertion ou modificationet aucun ordre nrsquoest requis pour inseacuterer ou supprimer des enregistrements

Syntaxe

Lrsquoinstruction SET FOREIGN_KEY_CHECKS=0 permet de deacutesactiver temporairement(jusqursquoagrave la reacuteactivation) toutes les contraintes reacutefeacuterentielles drsquoune base

Nrsquoessayez pas de deacutesactiver lrsquointeacutegriteacute reacutefeacuterentielle avec lrsquooption DISABLE KEYS de lrsquoinstruc-tion ALTER TABLE Cette option concerne les tables MyISAM et speacutecifie seulement de ne pasmettre agrave jour les index non uniques

Exemple

En consideacuterant lrsquoexemple suivant deacutesactivons les contraintes drsquointeacutegriteacute reacutefeacuterentielle ettentons drsquoinseacuterer des enregistrements ne respectant aucune contrainte (drsquointeacutegriteacute reacutefeacuterentielleet autres)

Figure 3-6 Apregraves suppression de contraintes

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85SING F-GAFU 2003-02-05 155

AF F-WTSS 2003-05-15 82

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

NULL

4055_03_C03 Page 75 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

76 copy Eacuteditions Eyrolles

On remarque bien que seules les cleacutes eacutetrangegraveres ne sont plus veacuterifieacutees Toute autre contrainte(UNIQUE PRIMARY KEY et NOT NULL) reste active Lrsquoeacutetat de la base est deacutesormais commesuit

Bien qursquoil semble incoheacuterent de reacuteactiver les contraintes sans srsquooccuper au preacutealable desvaleurs ne respectant pas lrsquointeacutegriteacute reacutefeacuterentielle (donneacutees noteacutees en gras) nous verrons qursquoilest possible de le faire

Figure 3-7 Avant la deacutesactivation de contraintes

Web Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING

referenced parent

referenced parent

dependent child dependent child NOT NULL

UNIQUE

Tableau 3-3 Insertions apregraves la deacutesactivation de lrsquointeacutegriteacute reacutefeacuterentielle

Instructions valides Instructions non valides

mysqlgt SET FOREIGN_KEY_CHECKS=0

mysqlgt INSERT INTO Avion VALUES ( TB-22 500 Toto)Query OK 1 row affected (004 sec)

mysqlgt INSERT INTO Avion VALUES (Bidon1 TB-21 1000 AF)Query OK 1 row affected (010 sec)

mysqlgt INSERT INTO Affreter VALUES (AF Toto 2005-05-13 0)Query OK 1 row affected (010 sec)

mysqlgt INSERT INTO Affreter VALUES (GTI F-WTSS 2005-11-0710)Query OK 1 row affected (002 sec)

mysqlgt INSERT INTO Affreter VALUES (GTI Toto 2005-11-0740)Query OK 1 row affected (003 sec)

mysqlgt INSERT INTO Compagnie VALUES (GTR 1 Brassens Blagnac

)ERROR 1062 (23000) Duplicate entry Air France for key 2

mysqlgt INSERT INTO Avion VALUES (Bidon1 TB-20 2000 NULL)ERROR 1048 (23000) Column proprio cannot be null

mysqlgt INSERT INTO Avion VALUES ( TB-21 1000 AF)ERROR 1062 (23000) Duplicate entry F-GLFS for key 1

Web

F-GLFS AirFrance

F-GLFS

4055_03_C03 Page 76 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 77

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Reacuteactivation des contraintes

Lrsquoinstruction SET FOREIGN_KEY_CHECKS=1 permet de reacuteactiver toutes les contraintesreacutefeacuterentielles drsquoune base

Nrsquoessayez pas de deacutesactiver lrsquointeacutegriteacute reacutefeacuterentielle avec lrsquooption ENABLE KEYS de lrsquoinstructionALTER TABLE Cette option concerne les tables MyISAM et speacutecifie de mettre agrave jour les indexnon uniques

Syntaxe

La reacuteactivation totale de lrsquointeacutegriteacute reacutefeacuterentielle de la base se programme ainsi

mysqlgt SET FOREIGN_KEY_CHECKS=1

Lrsquointeacutegriteacute est assureacutee de nouveau mais ne concerne que les mises agrave jour agrave venir (ajoutsdrsquoenregistrements modifications de colonnes et suppressions drsquoenregistrements) Les eacuteven-tuelles donneacutees preacutesentes dans les tables qui ne veacuterifient pas lrsquointeacutegriteacute sont toujours en base

Reacutecupeacuteration de donneacutees erroneacutees

Il nrsquoexiste pas pour lrsquoheure de meacutethode de reacutecupeacuteration automatique comme Oracle lepropose par exemple avec la directive EXCEPTIONS INTO de lrsquoinstruction ALTER TABLEEn conseacutequence il faut programmer des requecirctes drsquoextraction (eacutetudieacutees au chapitre 4) quipermettent des recherches drsquoenregistrements sous critegraveres

Le tableau suivant deacutecrit les deux requecirctes agrave programmer afin drsquoextraire les enregistrementsposant problegraveme Ici nous extrayons les avions qui reacutefeacuterencent une compagnie inexistante etles affregravetements qui reacutefeacuterencent une compagnie inexistante ou un avion inexistant Une fois

Figure 3-8 Apregraves la deacutesactivation des contraintes reacutefeacuterentielles

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 82 AF Toto 2005-05-13 0GTI F-WTSS 2005-11-07 10GTI Toto 2005-11-07 40

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GLFS TB-22 500 Toto

4055_03_C03 Page 77 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

78 copy Eacuteditions Eyrolles

extraits il faudra statuer pour chacun drsquoeux entre une modification de telle ou telle colonne oubien une suppression Il apparaicirct que quatre enregistrements ne respectent pas des contraintes

Deacutesactivez de nouveau lrsquointeacutegriteacute reacutefeacuterentielle avant de modifier les enregistrements ne veacuteri-fiant pas les contraintes car sinon certaines modifications coheacuterentes ne pourraient avoir lieuagrave cause de la veacuterification reacutefeacuterentielle sur des valeurs erroneacutees (dans notre exemple si on veutmodifier la compagnie GTI du dernier affregravetement lrsquoerreur portera sur la colonne immat)

Dans notre exemple choisissons

Drsquoaffecter la compagnie AF aux avions appartenant agrave des compagnies non reacutefeacuterenceacuteesdans la table Avion Notez qursquoil faut compleacuteter par deux espaces le code compagnie(CHAR inutile srsquoil avait eacuteteacute VARCHAR) et qursquoon utilise la mecircme requecircte que preacuteceacutedem-ment

SET FOREIGN_KEY_CHECKS=0

UPDATE Avion SET proprio =

WHERE proprio

De modifier la compagnie GTI par la compagnie SING dans la table Affreter et touteimmatriculation drsquoavion inexistant en F-GLFS

UPDATE Affreter SET compAff =SING WHERE compAff =

UPDATE Affreter SET immat=F-GLFS

WHERE immat

Maintenant il conviendra de reacuteactiver lrsquointeacutegriteacute reacutefeacuterentielle Lrsquoeacutetat de la base avec lescontraintes reacuteactiveacutees est le suivant (les mises agrave jour sont en gras)

Tableau 3-4 Enregistrements posant problegraveme

Table Avion Table Affreter

mysqlgt SELECT immatproprio FROM Avion WHERE proprio NOT IN (SELECT comp FROM Compagnie)

+--------+---------+| immat | proprio |+--------+---------+| F-GLFS | Toto |+--------+---------+

mysqlgt SELECT compAffimmatdateAff FROM Affreter WHERE compAff NOT IN (SELECT comp FROM Compagnie) OR immat NOT IN (SELECT immat FROM Avion)+---------+--------+------------+| compAff | immat | dateAff |+---------+--------+------------+| GTI | F-WTSS | 2005-11-07 || AF | Toto | 2005-05-13 || GTI | Toto | 2005-11-07 |+---------+--------+------------+

AF

NOT IN (SELECT comp FROM Compagnie)

GTI

NOT IN (SELECT immat FROM Avion)

4055_03_C03 Page 78 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 79

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Contraintes diffeacutereacutees

Les contraintes que nous avons eacutetudieacutees jusqursquoagrave maintenant sont des contraintes immeacutediates(immediate) qui sont controcircleacutees apregraves chaque instruction Une contrainte est dite laquo diffeacutereacutee raquo(deferred) si elle deacuteclenche sa veacuterification seulement agrave la fin de la transaction (premiegravereinstruction commit rencontreacutee) Pour lrsquoheure MySQL avec InnoDB ne propose pas ce modede programmation

Figure 3-9 Tables apregraves modifications et reacuteactivation des contraintes

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

AffretercompAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85 AF F-GLFS 2005-05-13 0SING F-WTSS 2005-11-07 10SING F-GLFS 2005-11-07 40

referenced parent

dependent child

NOT NULL Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GLFS TB-22 500 AF

dependent child

4055_03_C03 Page 79 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

80 copy Eacuteditions Eyrolles

Exercices

Les objectifs de ces exercices sont

drsquoajouter et de modifier des colonnes

drsquoajouter des contraintes

de traiter les erreurs

31 Ajout de colonnes

Eacutecrire le script eacutevolutionsql qui contient les instructions neacutecessaires pour ajouter les colonnessuivantes (avec ALTER TABLE) Le contenu de ces colonnes sera modifieacute ulteacuterieurement

Veacuterifier la structure et le contenu de chaque table avec DESCRIBE et SELECT

32 Modification de colonnes

Dans ce mecircme script rajouter les instructions neacutecessaires pour

bull augmenter la taille dans la table Salle de la colonne nomSalle (passer agrave VARCHAR(30))

bull diminuer la taille dans la table Segment de la colonne nomSegment agrave VARCHAR(15)

bull tenter de diminuer la taille dans la table Segment de la colonne nomSegment agrave VARCHAR(14)Pourquoi la commande nrsquoest-elle pas possible

Veacuterifier la structure et le contenu de chaque table avec DESCRIBE et SELECT

33 Ajout de contraintes

Ajouter la contrainte afin de srsquoassurer qursquoon ne puisse installer plusieurs fois le mecircme logiciel sur unposte de travail donneacute

Ajouter les contraintes de cleacutes eacutetrangegraveres pour assurer lrsquointeacutegriteacute reacutefeacuterentielle (avec ALTER TABLEhellipADD CONSTRAINThellip) entre les tables suivantes Adopter les conventions recommandeacutees dans lechapitre 1 (comme indiqueacute pour la contrainte entre Poste et Types)

Si lrsquoajout drsquoune contrainte reacutefeacuterentielle renvoie une erreur veacuterifier les enregistrements des tableslaquo pegraveres raquo et laquo fils raquo (notamment au niveau de la casse des chaicircnes de caractegraveres Tx est diffeacuterent deTX par exemple)

Tableau 3-5 Donneacutees de la table Installer

Table Nom type et signification des nouvelles colonnes

Segment nbSalle TINYINT(2) nombre de salles par deacutefaut = 0nbPoste TINYINT(2) nombre de postes par deacutefaut = 0

Logiciel nbInstall TINYINT(2) nombre drsquoinstallations par deacutefaut = 0

Poste nbLog TINYINT(2) nombre de logiciels installeacutes par deacutefaut = 0

4055_03_C03 Page 80 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 81

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Modifier le script SQL de destruction des tables (dropParcsql) en fonction des nouvelles contrain-tes Lancer ce script puis tous ceux eacutecrits jusqursquoici

34 Traitements des erreurs

Tentez drsquoajouter les contraintes de cleacutes eacutetrangegraveres entre les tables Salle et Segment et entreLogiciel et Types (en gras dans le scheacutema suivant)

Figure 3-10 Contraintes reacutefeacuterentielles agrave creacuteer

SegmentindIP nomSegment etage nbSalle nbPoste

SallenSalle nomSalle nbPoste indIP

PostenPoste nomPoste indIP ad typePoste nSalle nbLog

LogicielnLog nomLog dateAch version typeLog prix nbInstall

InstallernPoste nLog numIns dateIns delai

TypestypeLP nomType

fk_Poste_typePoste_Types

Figure 3-11 Contraintes reacutefeacuterentielles agrave creacuteer

SegmentindIP nomSegment etage nbSalle nbPoste

SallenSalle nomSalle nbPoste indIP

PostenPoste nomPoste indIP ad typePoste nSalle nbLog

LogicielnLog nomLog dateAch version typeLog prix nbInstall

InstallernPoste nLog numIns dateIns delai

TypestypeLP nomType

4055_03_C03 Page 81 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

82 copy Eacuteditions Eyrolles

La mise en place de ces contraintes doit renvoyer une erreur car

bull Il existe des salles (s22 et s23) ayant un numeacutero de segment inexistant dans la table Segment

bull Il existe un logiciel (log8) dont le type nrsquoest pas reacutefeacuterenceacute dans la table Types

Extraire les enregistrements qui posent problegraveme (numeacutero des salles pour le premier cas numeacutero delogiciel pour le second) Supprimer les enregistrements de la table Salle qui posent problegraveme Ajou-ter le type de logiciel (BeOS Systegraveme Be) dans la table Types

Exeacutecuter agrave nouveau lrsquoajout des deux contraintes de cleacute eacutetrangegravere Veacuterifier que les instructions nerenvoient plus drsquoerreur et que les deux requecirctes drsquoextraction ne renvoient aucune donneacutee

4055_03_C03 Page 82 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

83

Chapitre 4

Interrogation des donneacutees

Ce chapitre traite de lrsquoaspect le plus connu du langage SQL qui concerne lrsquoextraction desdonneacutees par requecirctes (nom donneacute aux instructions

SELECT

) Une requecircte permet de rechercherdes donneacutees dans une ou plusieurs tables ou vues agrave partir de critegraveres simples ou complexes Lesinstructions

SELECT

peuvent ecirctre exeacutecuteacutees dans lrsquointerface de commande (voir les exemples dece chapitre) ou au sein drsquoun programme SQL (proceacutedure catalogueacutee) PHP Java C etc

Geacuteneacuteraliteacutes

Lrsquoinstruction

SELECT

est une commande deacuteclarative (elle deacutecrit ce que lrsquoon cherche sans expli-quer le moyen drsquoopeacuterer) Agrave lrsquoinverse une instruction proceacutedurale (comme un programme)deacutevelopperait le moyen pour reacutealiser lrsquoextraction de donneacutees (comme le chemin agrave emprunter

entre des tables ou une iteacuteration pour parcourir un ensemble drsquoenregistrements)

La figure suivante scheacutematise les principales fonctionnaliteacutes de lrsquoinstruction

SELECT

Celle-ciest composeacutee drsquoune directive

FROM

qui preacutecise la (les) table(s) interrogeacutee(s) et drsquoune directive

WHERE

qui contient les critegraveres

Figure 4-1

Possibiliteacutes de lrsquoinstruction

SELECT

Pilote

Compagnie

Air France

Jointure1 (WHERE )

Restriction (WHERE )Projection (SELECT )

Jointure2

Avion

4055_04_C04 Page 83 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

84

copy Eacuteditions Eyrolles

La restriction qui est programmeacutee dans le

WHERE

de la requecircte permet de restreindre larecherche agrave une ou plusieurs lignes Dans notre exemple une restriction reacutepond agrave laquestion laquo

Quels sont les avions de type A320

raquo

La projection qui est programmeacutee dans le

SELECT

de la requecircte permet drsquoextraire une ouplusieurs colonnes Dans notre exemple elle reacutepond agrave la question laquo

Quels sont les numeacute-ros de brevet et les nombres drsquoheures de vol de tous les pilotes

raquo

La jointure qui est programmeacutee dans le

WHERE

de la requecircte permet drsquoextraire des donneacuteesde diffeacuterentes tables en les reliant deux agrave deux (le plus souvent agrave partir de contraintes reacutefeacute-rentielles) Dans notre exemple la premiegravere jointure reacutepond agrave la question laquo

Quels sont lesnumeacuteros de brevet et nombres drsquoheures de vol des pilotes de la compagnie de nom AirFrance

raquo La deuxiegraveme jointure reacutepond agrave la question laquo

Quels sont les avions de lacompagnie de nom Air France

raquo

En combinant ces trois fonctionnaliteacutes toute question logique devrait trouver en theacuteorie unereacuteponse par une ou plusieurs requecirctes Les questions trop complexes peuvent ecirctre program-meacutees agrave lrsquoaide des vues (chapitre 5) ou par traitement (programmes meacutelangeant requecirctes etinstructions proceacutedurales)

Syntaxe (

SELECT

)

Pour pouvoir extraire des enregistrements drsquoune table il faut que celle-ci soit dans votre baseou que vous ayez reccedilu le privilegravege

SELECT

sur la table

La syntaxe SQL simplifieacutee de lrsquoinstruction

SELECT

est la suivante

SELECT

[ DISTINCT | DISTINCTROW | ALL ]

listeColonnes

FROM

nomTable1

[

nomTable2

]

[ WHERE

condition

]

[

clauseRegroupement

]

[ HAVING

condition

]

[

clauseOrdonnancement

]

[ LIMIT [

rangDeacutepart

]

nbLignes

]

Nous deacutetaillerons chaque option agrave lrsquoaide drsquoexemples au cours de ce chapitre

Pseudotable

La pseudotable est une table qui nrsquoa pas de nom et qui est utile pour eacutevaluer une expression dela maniegravere suivante

laquo SELECT

expression

raquo

Les reacutesultats fournis seront uniques (siaucune jointure ou opeacuterateur ensembliste ne sont employeacutes dans lrsquointerrogation)

4055_04_C04 Page 84 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

85

chapitre ndeg 4 Interrogation des donneacutees

Projection (eacuteleacutements du

SELECT

)

Eacutetudions la partie de lrsquoinstruction

SELECT

qui permet de programmer lrsquoopeacuterateur de projec-tion (surligneacute dans la syntaxe suivante)

SELECT

FROM

nomTable

[

aliasTable

]

[

clauseOrdonnancement

]

[ LIMIT [

rangDeacutepart

]

nbLignes

]

DISTINCT

et

DISTINCTROW

jouent le mecircme rocircle agrave savoir ne pas inclure les duplicatas

ALL

prend en compte les duplicatas (option par deacutefaut)

listeColonnes

|

expression1

[[AS]

alias1

] [

expression2

[[AS]

alias2

]

ndash

extrait toutes les colonnes de la table

ndash

expression

nom de colonne fonction SQL constante ou calcul

ndash

alias

renomme lrsquoexpression (nom valable pendant la dureacutee de la requecircte)

FROM

deacutesigne la table (qui porte un alias ou non) agrave interroger

Tableau 4-1 Extraction drsquoexpressions

Besoin Requecircte et reacutesultat

Aucun utilisation proba-blement la plus superflue

mysqlgt SELECT Il reste encore beaucoup de pages+------------------------------------+| Il reste encore beaucoup de pages |+------------------------------------+| Il reste encore beaucoup de pages |+------------------------------------+

Jrsquoai oublieacute ma montre

mysqlgt SELECT SYSDATE() Maintenant +---------------------+| Maintenant |+---------------------+| 2005-11-07 091546 |+---------------------+

Pour les matheux qui vou-draient retrouver le reacutesul-tat de 2

14

le carreacute du cosi-nus de 3

π

sur 2 et e

1

mysqlgt SELECT POWER(214) POWER(COS(135314159265359180)2) Environ EXP(1)+-------------+------------------+----------------+| POWER(214) | Environ | EXP(1) |+-------------+------------------+----------------+| 16384 | 050000000000015 | 2718281828459 |+-------------+------------------+----------------+

[ DISTINCT | DISTINCTROW | ALL ] listeColonnes

4055_04_C04 Page 85 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

86

copy Eacuteditions Eyrolles

clauseOrdonnancement tri sur une ou plusieurs colonnes ou expressions

LIMIT pour limiter le nombre de lignes apregraves reacutesultat

Interrogeons la table suivante en utilisant chaque option

Extraction de toutes les colonnes

Lrsquoextraction de toutes les colonnes drsquoune table requiert lrsquoutilisation du symbole laquo raquo

Extraction de certaines colonnes

La liste des colonnes agrave extraire se trouve dans la clause SELECT

Figure 4-2 Table Pilote

VARCHAR(6) VARCHAR(16) DECIMAL(72) CHAR(4)

Pilote

brevet nom nbHVol compa

PL-1 Gratien Viel 450 AF PL-2 Didier Donsez 0 AF PL-3 Richard Grin 1000 SING PL-4 Placide Fresnais 2450 CAST PL-5 Daniel Vielle AF

Tableau 4-2 Utilisation de laquo raquo

Requecircte SQL Reacutesultat

mysqlgt SELECT FROM Pilote

+--------+------------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+------------------+---------+-------+| PL-1 | Gratien Viel | 45000 | AF || PL-2 | Didier Donsez | 000 | AF || PL-3 | Richard Grin | 100000 | SING || PL-4 | Placide Fresnais | 245000 | CAST || PL-5 | Daniel Vielle | NULL | AF |+--------+------------------+---------+-------+

Web

Tableau 4-3 Liste de colonnes

Requecircte SQL Reacutesultat

SELECT compa brevet FROM Pilote

+-------+--------+| compa | brevet |+-------+--------+| AF | PL-1 || AF | PL-2 || SING | PL-3 || CAST | PL-4 || AF | PL-5 |+-------+--------+

Web

4055_04_C04 Page 86 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 87

chapitre ndeg 4 Interrogation des donneacutees

Alias

Les alias permettent de renommer des colonnes agrave lrsquoaffichage ou des tables dans la requecircte Lesalias de colonnes sont utiles pour les calculs

Lrsquoutilisation de la directive AS est facultative (pour se rendre conforme agrave SQL2)

Il faut preacutefixer les colonnes par lrsquoalias de la table lorsqursquoil existe

Il semble preacutefeacuterable drsquoutiliser la directive AS afin qursquoil nrsquoy ait pas drsquoambiguiumlteacute dans lrsquoexpression(oubli drsquoune virgule) SELECT col1 col2 FROM nomTable ougrave MySQL interpreacutetera la secondecolonne comme un alias de la premiegravere

Duplicatas

Les directives DISTINCT ou DISTINCTROW eacuteliminent les eacuteventuels duplicatas Pour ladeuxiegraveme requecircte les eacutecritures laquo DISTINCT compa raquo laquo DISTINCTROW(compa) raquo etlaquo DISTINCTROW compa raquo sont eacutequivalentes La notation entre parenthegraveses est neacutecessairelorsque lrsquoon deacutesire eacuteliminer des duplicatas par paires triplets etc

Tableau 4-4 Alias (colonnes et tables)

Alias de colonnes Alias de table

SELECT compa AS c1 nom AS NometPrenom brevet c3 FROM Pilote

+------+------------------+------+| c1 | NometPrenom | c3 |+------+------------------+------+| AF | Gratien Viel | PL-1 || AF | Didier Donsez | PL-2 || SING | Richard Grin | PL-3 || CAST | Placide Fresnais | PL-4 || AF | Daniel Vielle | PL-5 |+------+------------------+------+

SELECT aliasPilotescompa AS c1 aliasPilotesnom FROM Pilote aliasPilotes

+------+------------------+| c1 | nom |+------+------------------+| AF | Gratien Viel || AF | Didier Donsez || SING | Richard Grin || CAST | Placide Fresnais || AF | Daniel Vielle |+------+------------------+

Web

4055_04_C04 Page 87 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

88 copy Eacuteditions Eyrolles

Expressions et valeurs nulles

Il est possible drsquoeacutevaluer et drsquoafficher simultaneacutement des expressions dans la clause SELECT(types numeacuteriques DATE et DATETIME)

Les opeacuterateurs arithmeacutetiques sont eacutevalueacutes par ordre de prioriteacute ( + et -)

Le reacutesultat drsquoune expression comportant une valeur NULL est eacutevalueacute agrave NULL

Nous avons deacutejagrave eacutetudieacute les opeacuterations sur les dates et intervalles (chapitre 2) Dans lrsquoexemplesuivant lrsquoexpression 10nbHVol+52 est calculeacutee en multipliant par 10 le nombre drsquoheuresde vol puis en ajoutant le reacutesulat de 5 diviseacute par 2 Dans le second exemple on convertit lemoment actuel (anneacutee mois jour heures minutes et secondes) en un entier

Tableau 4-5 Gestion des duplicatas

Avec duplicata Sans duplicata

SELECT compa FROM Pilote

+-------+| compa |+-------+| AF || AF || SING || CAST || AF |+-------+

SELECT DISTINCT(compa) FROM Pilote

+-------+| compa |+-------+| AF || SING || CAST |+-------+

Web

Tableau 4-6 Expressions numeacuteriques

Requecircte Reacutesultat

SELECT brevet nbHVol nbHVolnbHVol AS auCarre 10nbHVol+52 FROM Pilote

+--------+---------+--------------+---------------+| brevet | nbHVol | auCarre | 10nbHVol+52 |+--------+---------+--------------+---------------+| PL-1 | 45000 | 2025000000 | 45025000 || PL-2 | 000 | 00000 | 25000 || PL-3 | 100000 | 10000000000 | 100025000 || PL-4 | 245000 | 60025000000 | 245025000 || PL-5 | NULL | NULL | NULL |+--------+---------+--------------+---------------+

SELECT SYSDATE()+0 +----------------+| SYSDATE()+0 |+----------------+| 20051107145522 |+----------------+

Web

4055_04_C04 Page 88 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 89

chapitre ndeg 4 Interrogation des donneacutees

Ordonnancement

Pour trier le reacutesultat drsquoune requecircte il faut speacutecifier la clause drsquoordonnancement par ORDERBY de la maniegravere suivante

ORDER BY

expression1 | position1 | alias1 [ASC | DESC]

[expr2 | position2 | alias2 [ASC | DESC]

expression nom de colonne fonction SQL constante calcul

position entier qui deacutesigne lrsquoexpression (au lieu de la nommer) dans son ordre drsquoappa-rition dans la clause SELECT

ASC ou DESC tri ascendant ou descendant (par deacutefaut ASC)

Dans lrsquoexemple suivant on remarque que la valeur NULL est consideacutereacutee comme plus petiteque 0

Concateacutenation

Lrsquoopeacuterateur de concateacutenation se programme agrave lrsquoaide de la fonction CONCAT qui admet deuxchaicircnes de caractegraveres en paramegravetre Cette fonction permet de concateacutener diffeacuterentes expres-sions (colonnes calculs reacutesultats de fonctions SQL ou constantes) sous reacuteserve drsquoeacuteventuellesconversions (casting) La colonne reacutesultante est consideacutereacutee comme une chaicircne de caractegraveres

Lrsquoexemple suivant preacutesente un alias dans lrsquoen-tecircte de colonne (Embauche) qui met enforme les reacutesultats La concateacutenation concerne deux colonnes et la constante vole pour

Tableau 4-7 Ordonnancement

Options par deacutefaut Ordre deacutecroissant (et NULL)

mysqlgt SELECT brevet nom FROM Pilote

+--------+------------------+| brevet | nom |+--------+------------------+| PL-5 | Daniel Vielle || PL-2 | Didier Donsez || PL-1 | Gratien Viel || PL-4 | Placide Fresnais || PL-3 | Richard Grin |+--------+------------------+

mysqlgt SELECT brevetnbHVol FROM Pilote

+--------+---------+| brevet | nbHVol |+--------+---------+| PL-4 | 245000 || PL-3 | 100000 || PL-1 | 45000 || PL-2 | 000 || PL-5 | |+--------+---------+

WebORDER BY nom ORDER BY nbHvol DESC

NULL

4055_04_C04 Page 89 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

90 copy Eacuteditions Eyrolles

Insertion multiligne

Nous pouvons maintenant deacutecrire lrsquoinsertion multiligne eacutevoqueacutee au chapitre preacuteceacutedent Danslrsquoexemple suivant il srsquoagit drsquoinseacuterer tous les pilotes de la table Pilote (en consideacuterant lenom le nombre drsquoheures de vol et la compagnie) dans la table NomsetHVoldesPilotes

Notez que les instructions (CREATE TABLE et INSERT) peuvent ecirctre programmeacutees en uneinstruction (option AS SELECT de la commande CREATE TABLE)

CREATE TABLE NomsetHVoldesPilotes AS SELECT nom nbHVol compa

FROM Pilote

Limitation du nombre de lignes

Pour limiter le nombre de lignes agrave extraire agrave partir du reacutesultat drsquoune requecircte il faut speacutecifier laclause LIMIT de la maniegravere suivante

LIMIT [rangDeacutepart] nbLignes

Tableau 4-8 Concateacutenation

Requecircte Reacutesultat

SELECT brevet AS Embauche FROM Pilote

+--------+---------------------------------+| brevet | Embauche |+--------+---------------------------------+| PL-1 | Gratien Viel vole pour AF || PL-2 | Didier Donsez vole pour AF || PL-3 | Richard Grin vole pour SING || PL-4 | Placide Fresnais vole pour CAST || PL-5 | Daniel Vielle vole pour AF |+--------+---------------------------------+

Web

CONCAT(nom vole pour compa)

Tableau 4-9 Insertion multiligne

Creacuteation et insertion Requecircte et reacutesultat

CREATE TABLE NomsetHVoldesPilotes (nom VARCHAR(16) nbHVol DECIMAL(72) compa CHAR(4))

INSERT INTO NomsetHVoldesPilotes

mysqlgt SELECT FROM NomsetHVoldesPilotes+------------------+---------+-------+| nom | nbHVol | compa |+------------------+---------+-------+| Gratien Viel | 45000 | AF || Didier Donsez | 000 | AF || Richard Grin | 100000 | SING || Placide Fresnais | 245000 | CAST || Daniel Vielle | NULL | AF |+------------------+---------+-------+

Web

SELECT nomnbHVolcompaFROM Pilote

4055_04_C04 Page 90 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 91

chapitre ndeg 4 Interrogation des donneacutees

Le premier entier preacutecise le rang de la premiegravere ligne seacutelectionneacutee (en fonction du tri du reacutesul-tat) Le second entier indique le nombre maximum de lignes agrave extraire La premiegravere ligne estconsideacutereacutee comme preacutesente au rang 0 Ainsi laquo LIMIT n raquo eacutequivaut agrave laquo LIMIT 0n raquoLrsquoexemple suivant illustre deux utilisations de la clause LIMIT

Restriction (WHERE)

Les eacuteleacutements de la clause WHERE drsquoune requecircte permettent de programmer lrsquoopeacuterateur derestriction Cette clause limite la recherche aux enregistrements qui respectent une conditionsimple ou complexe Cette section srsquointeacuteresse agrave la partie surligneacutee de lrsquoinstruction SELECTsuivante

SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes

FROM nomTable [aliasTable]

condition composeacutee de colonnes drsquoexpressions de constantes lieacutees deux agrave deux entredes opeacuterateurs

ndash de comparaison (gt = lt gt= lt= ltgt)

ndash logiques (NOT AND ou OR)

ndash inteacutegreacutes (BETWEEN IN LIKE IS NULL)

Interrogeons la table suivante en utilisant chaque cateacutegorie drsquoopeacuterateur

Tableau 4-10 Limitation des reacutesultats

Requecircte Reacutesultat

Deuxiegraveme et troisiegraveme (ordre de cleacute) pilote

SELECT FROM Pilote

+--------+---------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+---------------+---------+-------+| PL-2 | Didier Donsez | 000 | AF || PL-3 | Richard Grin | 100000 | SING |+--------+---------------+---------+-------+

Les deux pilotes les plus expeacuterimenteacutes (par ordre du nombre drsquoheures de vol)

SELECT FROM Pilote ORDER BY nbHvol DESC

+--------+------------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+------------------+---------+-------+| PL-4 | Placide Fresnais | 245000 | CAST || PL-3 | Richard Grin | 100000 | SING |+--------+------------------+---------+-------+

Web

LIMIT 12

LIMIT 2

[ WHERE condition ]

4055_04_C04 Page 91 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

92 copy Eacuteditions Eyrolles

Opeacuterateurs de comparaison

Le tableau suivant deacutecrit des requecirctes pour lesquelles la clause WHERE contient des opeacuterateursde comparaison

Les eacutecritures laquo prime=500 raquo et laquo (prime=500) raquo sont eacutequivalentes Les eacutecritureslaquo primeltgt500 raquo et laquo NOT (prime=500) raquo sont eacutequivalentes Les parenthegraveses sont utilespour composer des conditions

Notez lrsquoutilisation du simple guillemet pour comparer des chaicircnes de caractegraveres

Figure 4-3 Table Pilote

Web

Pilote

brevet nom nbHVol prime compa

PL-1 Gratien Viel 450 500 AF PL-2 Didier Donsez 0 AF PL-3 Richard Grin 1000 90 SING PL-4 Placide Fresnais 2450 500 CAST PL-5 Daniel Vielle 400 600 SING PL-6 Francoise Tort 0 CAST

Tableau 4-11 Eacutegaliteacute ineacutegaliteacute et comparaison

Eacutegaliteacute Comparaison et ineacutegaliteacute

SELECT brevet nom AS Prime 500 FROM Pilote WHERE +--------+------------------+| brevet | Prime 500 |+--------+------------------+| PL-1 | Gratien Viel || PL-4 | Placide Fresnais |+--------+------------------+

SELECT brevet nom de Air-France FROM Pilote WHERE +--------+---------------+| brevet | de Air-France |+--------+---------------+| PL-1 | Gratien Viel || PL-2 | Didier Donsez |+--------+---------------+

SELECT brevet nom prime FROM Pilote WHERE

+--------+----------------+-------+| brevet | nom | prime |+--------+----------------+-------+| PL-3 | Richard Grin | 90 || PL-6 | Francoise Tort | 0 |+--------+----------------+-------+

SELECT brevet nom prime FROM Pilote WHERE +--------+----------------+-------+| brevet | nom | prime |+--------+----------------+-------+| PL-3 | Richard Grin | 90 || PL-5 | Daniel Vielle | 600 || PL-6 | Francoise Tort | 0 |+--------+----------------+-------+

Webprime = 500

compa = AF

prime lt= 400

prime ltgt 500

4055_04_C04 Page 92 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 93

chapitre ndeg 4 Interrogation des donneacutees

Opeacuterateurs logiques

bull Lrsquoordre de prioriteacute des opeacuterateurs logiques est NOT AND et OR

bull Les opeacuterateurs de comparaison (gt = lt gt= lt= ltgt) sont prioritaires par rapport agrave NOT

bull Les parenthegraveses permettent de modifier ces regravegles de prioriteacute

La premiegravere requecircte de lrsquoexemple suivant contient une condition composeacutee de trois preacutedicatsqui sont eacutevalueacutes par ordre de prioriteacute (drsquoabord AND puis OR) La conseacutequence est lrsquoaffichagedes pilotes de la compagnie SING avec les pilotes de AF ayant moins de 500 heures de vol

La deuxiegraveme requecircte force la prioriteacute avec les parenthegraveses (AND et OR sur le mecircme pieddrsquoeacutegaliteacute) La conseacutequence est lrsquoaffichage des pilotes ayant moins de 500 heures de vol descompagnies SING et AF

Opeacuterateurs inteacutegreacutes

Les opeacuterateurs inteacutegreacutes sont BETWEEN IN LIKE et IS NULL

Tableau 4-12 Opeacuterateurs logiques

Requecircte Reacutesultat sous SQLPlus

SELECT brevet nom compa FROM Pilote WHERE (

+--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-3 | Richard Grin | SING || PL-5 | Daniel Vielle | SING |+--------+---------------+-------+

SELECT brevet nom compa FROM Pilote WHERE (( ) AND nbHVol lt 500)

+--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-5 | Daniel Vielle | SING |+--------+---------------+-------+

Web

compa = SING OR compa = AF AND nbHVol lt 500)

compa = SING OR compa = AF

4055_04_C04 Page 93 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

94 copy Eacuteditions Eyrolles

Tableau 4-13 Opeacuterateurs inteacutegreacutes

Opeacuterateur Exemple

BETWEEN limiteInf AND limiteSup teste lrsquoappartenance agrave un intervalle de valeurs

SELECT brevet nom nbHVol FROM Pilote WHERE nbHVol +--------+---------------+---------+| brevet | nom | nbHVol |+--------+---------------+---------+| PL-1 | Gratien Viel | 45000 || PL-3 | Richard Grin | 100000 || PL-5 | Daniel Vielle | 40000 |+--------+---------------+---------+

IN (listeValeurs) compare une expres-sion avec une liste de valeurs

SELECT brevet nom compa FROM Pilote WHERE compa +--------+------------------+-------+| brevet | nom | compa |+--------+------------------+-------+| PL-3 | Richard Grin | SING || PL-4 | Placide Fresnais | CAST || PL-5 | Daniel Vielle | SING || PL-6 | Francoise Tort | CAST |+--------+------------------+-------+

LIKE (expression) compare de maniegravere geacuteneacuterique des chaicircnes de caractegraveres agrave une expressionLe symbole remplace un ou plusieurs caractegraveresLe symbole _ remplace un caractegravereCes symboles peuvent se combinerUtilisez de preacutefeacuterence des colonnes VARCHAR ou compleacutetez si neacutecessaire par des blancs jusqursquoagrave la taille maximale pour des CHAR

SELECT brevet nom compa FROM Pilote WHERE compa +--------+------------------+-------+| brevet | nom | compa |+--------+------------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-4 | Placide Fresnais | CAST || PL-6 | Francoise Tort | CAST |+--------+------------------+-------+SELECT brevet nom compa FROM Pilote WHERE compa +--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF |+--------+---------------+-------+

IS NULL compare une expression (colonne calcul constante) agrave la valeur NULLLa neacutegation srsquoeacutecrit soit laquo expression IS NOT NULL raquo soit laquo NOT (expression IS NULL) raquo

SELECT nom prime nbHVol FROM Pilote WHERE prime OR nbHVol +----------------+-------+--------+| nom | prime | nbHVol |+----------------+-------+--------+| Didier Donsez | NULL | 000 || Francoise Tort | 0 | NULL |+----------------+-------+--------+

WebBETWEEN 399 AND 1000

IN (CAST SING)

LIKE (A)

LIKE (A_)

IS NULL IS NULL

4055_04_C04 Page 94 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 95

chapitre ndeg 4 Interrogation des donneacutees

Alias

Il nrsquoest pas permis drsquoutiliser un alias de colonne dans la clause WHERE Cette recommandationde la norme srsquoexplique par le fait que certaines expressions pourraient ne pas ecirctre deacutetermineacuteespendant que la condition WHERE est eacutevalueacutee

Ainsi la requecircte suivante renvoie une erreur alors qursquoelle ne contient pourtant pas drsquoexpres-sion litigieuse Il faudra ici remplacer laquo c1 raquo par laquo aliasDesPilotescompa raquo

mysqlgt SELECT aliasDesPilotescompa AS c1 aliasDesPilotesnom

FROM Pilote aliasDesPilotes WHERE c1 = AF

ERROR 1054 (42S22) Unknown column c1 in where clause

Fonctions

MySQL propose un grand nombre de fonctions qui srsquoappliquent dans les clauses SELECT ouWHERE drsquoune requecircte La syntaxe geacuteneacuterale drsquoune fonction est la suivante

nomFonction(colonne1 | expression1 [colonne2 | expression2 hellip])

bull Une fonction monoligne agit sur une ligne agrave la fois et ramegravene un reacutesultat par ligne On distin-gue quatre familles de fonctions monolignes caractegraveres numeacuteriques dates et conversionsde types de donneacutees Ces fonctions peuvent se combiner entre elles (exemple MAX(COS(ABS(n))) deacutesigne le maximum des cosinus de la valeur absolue de la colonne n)

bull Une fonction multiligne (fonction drsquoagreacutegat) agit sur un ensemble de lignes pour ramener unreacutesultat (voir la section Regroupements)

Caractegraveres

Interrogeons la table suivante en utilisant des fonctions pour les caractegraveres

Figure 4-4 Table Pilote

Pilote

brevet prenom nom surnom compa

PL-1 Gratien viel dba AF PL-2 Didier donsez smith AFPL-3 richard Grin Faucon SING

PL-4 placide Fresnais cool CASTPL-5 Daniel vielle jones SINGPL-6 Francoise tort NormaleSup CAST

4055_04_C04 Page 95 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

96 copy Eacuteditions Eyrolles

La plupart des fonctions pour les caractegraveres acceptent une chaicircne de caractegraveres en paramegravetrede nature CHAR ou VARCHAR Le tableau suivant deacutecrit les principales fonctions

Tableau 4-14 Fonctions pour les caractegraveres

Fonction Objectif Exemple

ASCII(c) Retourne le carac-tegravere ASCII eacutequiva-lent

(A) donne 65

CHAR(n) Retourne le carac-tegravere eacutequivalent dans le jeu de caractegraveres en cours

(161) || (162) donne iacuteoacute

CONCAT(c1c2) Concategravene deux chaicircnes

SELECT Personnel FROM Pilote+------------------------------+| Personnel |+------------------------------+| viel travaille pour AF || |

FIELD(cc1c2hellip) Retourne lrsquoindex qui correspond agrave la premiegravere eacutegaliteacute entre c et c1 c et c2 etc 0 si aucune eacutegaliteacute nrsquoest trouveacutee

SELECT Attention agrave la casse

+-----------------------+| Attention agrave la casse |+-----------------------+| 1 |+-----------------------+

INSERT(c1postc2) Modifie la chaicircne c1 en inseacuterant t caractegraveres de la sous-chaicircne c2 agrave partir de la posi-tion pos

SELECT Qui

+---------------------+| Qui |+---------------------+| Compagnie Airbus |+---------------------+

INSTR(c1c2) Premier indice drsquoune sous-chaicircne c1 dans une chaicircne c2Exemple indice de Air dans la chaicircne

SELECT Indice

+--------+| Indice |+--------+| 7 |+--------+

ASCII

CHR CHR

CONCAT(CONCAT(nom vole pour ) compa)

FIELD(Air air AirbusAir)

INSERT(Compxxxie Airbus 5 3 agn)

INSTR(Infos-Air AirBus pourAir-FranceAir)

4055_04_C04 Page 96 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 97

chapitre ndeg 4 Interrogation des donneacutees

LOWER(c) Tout en minuscu-les

SELECT CONCAT( ) Etat civil FROM Pilote WHERE compa = SING+---------------+| Etat civil |+---------------+| richard grin || daniel vielle |

LOCATE(c1c2pos) Premier indice drsquoune sous-chaicircne c1 dans une chaicircne c2 agrave partir de la position posExemple indice de Air dans la chaicircne agrave partir du 9e caractegravere

SELECT Indice apregraves 9

+----------------+| Indice apregraves 9 |+----------------+| 13 |+----------------+

LENGTH(c) Longueur de la chaicircne

SELECT Taille

+-------+| Taille |+--------+| 35 |+--------+

LEFT(cn) Extrait les n pre-miers caractegraveres agrave c en partant de la gauche

SELECT Bye les Jumbo+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+

LPAD(c1nc2) Insertion agrave gauche de c2 dans c1 sur n caractegraveres

SELECT sur 20+----------------------+| sur 20 |+----------------------+| -----------Rien |+----------------------+

REPLACE(c1c2c3) Recherche les c2 preacutesentes dans c1 et les remplace par c3

SELECT Changement+----------------------+| Changement |+----------------------+| EADS et Aerospatiale |+----------------------+

Tableau 4-14 Fonctions pour les caractegraveres (suite)

Fonction Objectif Exemple

LOWER(prenom)LOWER(nom)

LOCATE(AirInfos-Air AirBuspour Air-France9)

LENGTH(Infos-Air AirBus pourAir-France)

LEFT(A380 agrave BlagnacB747B74714)

LPAD(Rien20--)

REPLACE(Matra et AerospatialeMatraEADS)

4055_04_C04 Page 97 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

98 copy Eacuteditions Eyrolles

REVERSE(c) Retourne la chaicircne renverseacutee

SELECT Miroir+----------------+| Miroir |+----------------+| A380 agrave Blagnac |+----------------+

RIGHT(cn) Extrait les n der-niers caractegraveres agrave c en partant de la droite

SELECT Bye les Jumbo+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+

RPAD(c1nc2) Insertion agrave droite de c2 dans c1 sur n caractegraveres

SELECT sur 19+---------------------+| sur 19 |+---------------------+| Rien---------- |+---------------------+

SOUNDEX(c) Extrait la phoneacuteti-que drsquoune expres-sion (in english only )

SELECT nom surnom compa FROM Pilote WHERE IN ( )+--------+--------+-------+| nom | surnom | compa |+--------+--------+-------+| donsez | smith | AF || vielle | jone | SING |+--------+--------+-------+

SUBSTR(cn[t]) Extraction de la sous-chaicircne c commenccedilant agrave la position n sur t caractegraveres

SELECT

Ougrave ccedila +-----------+| Ougrave ccedila |+-----------+| agrave Blagnac |+-----------+

Tableau 4-14 Fonctions pour les caractegraveres (suite)

Fonction Objectif Exemple

REVERSE(cangalB agrave 083A)

RIGHT(B747B747A380 agrave Blagnac14)

RPAD(Rien19--)

SOUNDEX(surnom)SOUNDEX(SMYTHE) SOUNDEX(John)

SUBSTR(Air France agrave Blagnac Con129)

4055_04_C04 Page 98 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 99

chapitre ndeg 4 Interrogation des donneacutees

Numeacuteriques

En plus des opeacuterateurs arithmeacutetiques disponibles dans les langages de programmation (+ - et DIV pour la division entiegravere) MySQL supporte un grand nombre de fonctions numeacuteriques

TRIM(c1 FROM c2) Enlegraveve les carac-tegraveres c1 agrave la chaicircne c2 (options LEADING et TRAILING pour preacuteciser le sens du deacutecoupage) Existent aussi LTRIM et RTRIM qui enlegravevent des espaces respecti-vement au deacutebut ou agrave la fin drsquoune chaicircne

SELECT

Bye les Jumbo

+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+

UPPER Tout en majuscu-les

SELECT CONCAT( ) Pilotes de CAST

FROM Pilote WHERE compa = CAST+------------------+| Pilotes de CAST |+------------------+| PLACIDE FRESNAIS || FRANCOISE TORT |+------------------+

Tableau 4-14 Fonctions pour les caractegraveres (suite)

Fonction Objectif Exemple

TRIM(B FROM BA380 agrave BlagnacBBBBB)

UPPER(prenom)UPPER(nom)

Tableau 4-15 Fonctions numeacuteriques

Fonction Objectif Exemple

ABS(n) Valeur absolue de n

ACOS(n) Arc cosinus (n de -1 agrave 1) retour exprimeacute en radians (de 0 agrave pi)

ATAN(n) Arc tangente (forall n) retour exprimeacute en radians ( de -pi2 agrave pi2)

CEIL(n) Plus petit entier ge agrave n retourne 16

COS(n) Cosinus de n exprimeacute en radians de 0 agrave 2 pi

retourne 05

COT(n) Cotangente de n exprimeacutee en radians retourne 17320508075689

DEGREES(n) Conversion de radians en degreacutes retourne 90

CEIL(157)

COS(60PI()180)

COT(30PI()180)

DEGREES(PI()2)

4055_04_C04 Page 99 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

100 copy Eacuteditions Eyrolles

Fonction pour les bits

Les opeacuterateurs suivants sont disponibles jusqursquoagrave 64 bits (BIGINT) On peut en utiliser certainsen passant des paramegravetres en base 10 en binaire ou de type chaicircne de caractegraveres

EXP(n) e (271828183) agrave la puissance n

FLOOR(n) Plus grand entier le agrave n retourne 15

LN(n) Logarithme neacutepeacuterien de n

LOG(n)(mn) Logarithme de n dans une base m

MOD(mn) Reste de la division entiegravere de m par n

POW(mn) m puissance n

RADIANS(n) Conversion de degreacutes en radians retourne 15707963267949

RAND() Flottant aleacuteatoire (agrave 14 deacutecimales) entre 0 et 1

retourne 1757

ROUND(mn) Arrondi agrave une ou plusieurs deacutecimales retourne 1757

SIGN(n) Retourne le signe drsquoun nombre (-1 0 ou 1)

SIN(n) Sinus de n exprimeacute en radians de 0 agrave 2 pi retourne 05

SINH(n) Sinus hyperbolique de n

SQRT(n) Racine carreacutee de n

TAN(n) Tangente de n exprimeacutee en radians de 0 agrave 2 pi

TRUNCATE(nm) Coupure de n agrave m deacutecimales retourne 157

Tableau 4-15 Fonctions numeacuteriques (suite)

Fonction Objectif Exemple

FLOOR(157)

RADIANS(90)

ROUND(175672)

ROUND(175672)

SIN(30PI()180)

TRUNC(15791)

Tableau 4-16 Fonctions pour les bits

Fonction Objectif Exemple

OR | OU bits agrave bits b0100 b1100 retourne 12

AND amp ET bits agrave bits b0100 b1100 retourne 4

XOR ^ OU exclusif bits agrave bits b0100 b1100 retourne 8

SHL ltlt Deacutecalage agrave gauche de n posi-tions

3 2 retourne 12

SHR gtgt Deacutecalage agrave droite de n positions b0100 2 retourne 1

Compleacutement agrave 1 ~ Inversion de chaque bit 3+(~3+1) retourne 1 (ici on pro-gramme le compleacutement agrave 2)

BIN(n) Chaicircne qui repreacutesente la valeur binaire de n

retourne 1100

|

amp

^

ltlt

gtgt

BIN(12)

4055_04_C04 Page 100 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 101

chapitre ndeg 4 Interrogation des donneacutees

Dates

Le tableau suivant deacutecrit les principales fonctions pour les dates

BIT_LENGTH(c) Taille de la chaicircne en bits retourne 24 (3 octets)

HEX(ns) Chaicircne en hexadeacutecimal repreacute-sentant ns (nombre ou chaicircne)

retourne FE

OCT(n) Chaicircne en octal repreacutesentant n retourne 14

OCTET_LENGTH(c) Synonyme de LENGTH()

UNHEX(c) Fonction inverse de HEX retourne SQL

Tableau 4-16 Fonctions pour les bits (suite)

Fonction Objectif Exemple

BIT_LENGTH(GTR)

HEX(254)

OCT(12)

UNHEX(53514C)

Tableau 4-17 Fonctions pour les dates

Fonction Objectif Retour

ADDDATE(daten) Ajoute n jours agrave une date (heure) DATE ou DATETIME

ADDTIME(date1date2) Ajoute les deux dates avec date1 TIME ou DATETIME et date2 TIME

TIME ou DATETIME

CURDATE() CURRENT_DATE ou CURRENT_DATE()

Date courante (YYYY-MM-DD ou YYYYM-MDD)

INT ou DATE

CURTIME() CURRENT_TIME ou CURRENT_TIME()

Heure courante (HHMMSS or HHMMSS) INT ou DATE

CURRENT_TIMESTAMP CURRENT_TIMES-TAMP()ou NOW()

Date et heure courantes (YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMS)

INT ou DATETIME

DATE(datet) Extrait une date agrave partir drsquoune expression de type DATETIME

DATE

DATEDIFF(date1date2) Nombre entier de jours entre les 2 dates INT

DATE_ADD(dateINTERVAL expr type) Ajoute un intervalle agrave une date (heure) expr deacutesigne un intervalle type indique comment interpreacuteter le format de lrsquoexpres-sion (voir tableau suivant)

DATE ou DATETIME

DATE_FORMAT(dateformat) Preacutesente la date selon un format (voir tableau suivant)

VARCHAR

DATE_SUB(dateINTERVAL expr type) Soustrait un intervalle agrave une date (heure) Mecircmes paramegravetres que DATE_ADD

DATE ou DATETIME

DAYNAME(date) Nom du jour en anglais VARCHAR

DAY(date) ou DAYOFMONTH(date) Numeacutero du jour dans le mois (0 agrave 31) INT

DAYOFYEAR(date) Numeacutero du jour dans lrsquoanneacutee (0 agrave 366) INT

4055_04_C04 Page 101 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

102 copy Eacuteditions Eyrolles

EXTRACT(type FROM date) Extrait une partie drsquoune date selon un type drsquointervalle (comme pour DATE_ADD)

INT

FROM_DAYS(n) Retourne une date agrave partir drsquoun nombre de jours (le calendrier anneacutee 0 deacutebute agrave n=365)

DATE

FROM_UNIXTIME(nunix[format]) Retourne une date (heure) agrave partir drsquoune estampille Unix (nombre de jours depuis le 111970) Utilisation possible drsquoun format

INT ou DATETIME

HOUR(time) Extrait lrsquoheure drsquoun temps INT

LAST_DAY(date) Dernier jour du mois drsquoune date (heure) DATE

LOCALTIME LOCALTIME() LOCALTI-MESTAMP LOCALTIMESTAMP()

Synonymes de NOW()

MAKEDATE(anneenjour) Construit une date agrave partir drsquoune anneacutee et drsquoun nombre de jours (gt0 si njourgt365 lrsquoanneacutee srsquoincreacutemente automatiquement)

DATE

MAKETIME(heureminuteseconde) Construit une heure TIME

MICROSECOND(date) Extrait les microsecondes drsquoune date-heure

INT

MINUTE(time) Extrait les minutes drsquoun temps INT

MONTH(date) MONTHNAME(date) Retourne respectivement le numeacutero et le nom du mois drsquoune date-heure

INTVARCHAR

NOW() Date et heure courantes au format YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMSS

DATETIME ou INT

PERIOD_DIFF(int1int2) Nombre de mois seacuteparant les deux dates au format YYMM or YYYYMM

INT

SECOND(time) Extrait les secondes drsquoun temps INT

SEC_TO_TIME(secondes) Construit une heure au format HHMMSS ou HHMMSS

TIME ouINT

STR_TO_DATE(cformat) Construit une date (heure) selon un certain format Crsquoest lrsquoinverse de DATE_FORMAT()

DATE ou DATETIME ou TIME

SUBDATE(daten) Retranche n jours agrave une date (heure) DATE ou DATETIME

SUBTIME(date1date2) Retranche date2 (TIME) agrave date1 (TIME ou DATETIME)

TIME ou DATETIME

SYSDATE() Date et heure courantes au format YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMSS (diffeacuterence avec NOW voir chapitre 1)

DATETIME ou INT

TIME(datetime) Extrait le temps drsquoune date-heure TIME

Tableau 4-17 Fonctions pour les dates (suite)

Fonction Objectif Retour

4055_04_C04 Page 102 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 103

chapitre ndeg 4 Interrogation des donneacutees

TIMEDIFF(tdate1tdate2) Temps entre 2 temps ou 2 dates ou 2 dates-heure

TIME

TIMESTAMP(date) Construit une estampille agrave partir drsquoune date (heure)

TIMESTAMP

TIMESTAMPADD(intervalleintdate) Ajoute agrave la date (heure) un intervalle (int) du type FRAC_SECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER ou YEAR

TIMESTAMP

TIMESTAMPDIF(intervalleintdate) Retranche agrave la date (heure) un intervalle du type (idem preacuteceacutedent)

TIMESTAMP

TIME_TO_SEC(time) Retourne le nombre de secondes eacutequiva-lent au temps

INT

TO_DAYS(date) Retourne un nombre de jours agrave partir drsquoune date (YYYY-MM-DD ou YYYYMMDD) Inverse de FROM_DAYS()

INT

UNIX_TIMESTAMP(date) Retourne le nombre de secondes depuis le 111970 jusqursquoagrave la date (heure) passeacutee en paramegravetre (ou entier au format YYMMDD YYYYMMDD) Inverse de FROM_UNIX-TIME()

INT

UTC_DATE() UTC_TIME() UTC_TIMES-TAMP()

Retournent respectivement la date lrsquoheure et lrsquoestampille au meacuteridien de Greenwich

DATETIMEDATETIME

WEEKDAY(date) Numeacutero du jour (0 lundi 1 mardi 6 dimanche) drsquoune date (heure)

INT

WEEKOFYEAR(date) Numeacutero de la semaine en cours (1 agrave 53) INT

Tableau 4-17 Fonctions pour les dates (suite)

Fonction Objectif Retour

4055_04_C04 Page 103 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

104 copy Eacuteditions Eyrolles

Tableau 4-18 Paramegravetres drsquointervalles pour les fonctions DATE_ADD et DATE_SUB

Paramegravetre type Paramegravetre expr

MICROSECOND nSECOND n

MINUTE n

HOUR nn

DAY nn

WEEK n

MONTH nn

YEAR nnnn

SECOND_MICROSECOND ssmicrosec

MINUTE_MICROSECOND mimicrosec

MINUTE_SECOND missS

HOUR_MICROSECOND hhmicrosec

HOUR_SECOND hhmiss

HOUR_MINUTE hhmi

DAY_MICROSECOND ddmicrosec

DAY_SECOND dd hhmiss

DAY_MINUTE dd hhmi

DAY_HOUR dd hh

YEAR_MONTH yyyy-mm

Tableau 4-19 Principaux formats pour les fonctions DATE_FORMAT et STR_TO_DATE

Format Description

a Nom du jour en anglais abreacutevieacute (SunSat)

b Nom du mois en anglais abreacutevieacute (JanDec)

c Mois (012)

e Jour du mois (031)

f Microsecondes (000000999999)

H Heures (0023)

i Minutes (0059)

j Jour de lrsquoanneacutee (001366)

M Nom du mois en anglais (JanuaryDecember)

s Secondes (0059)

T Time sur 24 heures (hhmmss)

u Numeacutero de semaine (0053)

W Nom du jour en anglais (SundaySaturday)

w Jour de la semaine (0=Sunday6=Saturday)

Y Anneacutee sur 4 positions

4055_04_C04 Page 104 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 105

chapitre ndeg 4 Interrogation des donneacutees

Quelques exemples drsquoutilisation (date du jour mercredi 9 novembre 2005) sont donneacutes dansle tableau suivant

Conversions

MySQL autorise des conversions de types implicites ou explicites

Implicites

Il est possible drsquoaffecter dans une expression ou dans une instruction SQL (INSERTUPDATE) une donneacutee de type numeacuterique (ou date-heure) agrave une donneacutee de type VARCHAR(ou CHAR) Il en va de mecircme pour lrsquoaffectation drsquoune colonne VARCHAR par une donneacutee de typedate-heure (ou numeacuterique) On parle ainsi de conversions implicites

Tableau 4-20 Exemples de fonctions pour les dates

Besoin et fonction Reacutesultat

Date dans 31 joursSELECT

+--------------------------+| ADDDATE(2005-11-9 31) |+--------------------------+| 2005-12-10 |+--------------------------+

1 jour et 1 microseconde apregraves le 9112005 11 heures 1 microsecondeSELECT

exemple ADDTIME

+----------------------------+| exemple ADDTIME |+----------------------------+| 2005-11-10 230000000000 |+----------------------------+

Rendez-vous dans 4 moisSELECT DATE_ADD(CURRENT_TIMESTAMP INTERVAL 4 MONTH) RDV

+---------------------+| RDV |+---------------------+| 2006-03-09 170733 |+---------------------+

Rendez-vous dans 7 jours 1 heure et 30 minutesSELECT

RDV 1sem 1h30

+---------------------+| RDV 1sem 1h30 |+---------------------+| 2005-11-16 185303 |+---------------------+

Aujourdrsquohui en anglaisSELECT

Y) Today in English

+----------------------------+| Today in English |+----------------------------+| Wednesday 09 November 2005 |+----------------------------+

Extraction au format numeacuterique du jour heures et minutesSELECT

DAY_MINUTE

+------------+| DAY_MINUTE |+------------+| 90102 |+------------+

WebADDDATE(2005-11-9 31)

ADDTIME(2005-11-092259599999991 000000001)

DATE_ADD(CURRENT_TIMESTAMPINTERVAL 7 013000 DAY_SECOND)

DATE_FORMAT(SYSDATE() W d MY)

EXTRACT(DAY_MINUTE FROM 2005-11-09010203)

4055_04_C04 Page 105 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

106 copy Eacuteditions Eyrolles

Pour preuve le script suivant ne renvoie aucune erreur

CREATE TABLE Test (c1 DECIMAL(63) c2 DATE c3 VARCHAR(1) c4

CHAR)

INSERT INTO Test VALUES (54845 20060116 3 5)

Explicites

Une conversion est dite laquo explicite raquo quand on utilise une fonction agrave cet effet Les fonctions deconversion les plus connues sont CAST et CONVERT (qui respectent la syntaxe de la normeSQL)

Les fonctions de conversion sont deacutecrites dans le tableau suivant

Comparaisons

MySQL compare deux variables entre elles en suivant les regravegles suivantes

bull Si lrsquoune des deux valeurs est NULL la comparaison retourne NULL (sauf pour lrsquoopeacuterateurlt=gt qui renvoie vrai si les deux valeurs sont NULL)

bull Si les deux valeurs sont des chaicircnes elles sont compareacutees en tant que telles

bull Si les deux valeurs sont des numeacuteriques elles sont compareacutees en tant que telles

bull Les valeurs hexadeacutecimales sont traiteacutees comme des chaicircnes de bits si elles ne sont pascompareacutees agrave des numeacuteriques

bull Si lrsquoune des valeurs est TIMESTAMP ou DATETIME et si lrsquoautre est une constante cette der-niegravere est convertie en TIMESTAMP

bull Dans les autres cas les valeurs sont compareacutees comme des numeacuteriques (flottants)

Tableau 4-21 Fonctions de conversion

Fonction Conversion Exemple

BINARY(expr) Lrsquoexpression en bits Pour le premier pilote de notre dernier exemple le test =

renverra faux

CAST(expression AS typeMySQL )

Lrsquoexpression dans le type en para-megravetre (BINARY CHAR DATE DATETIME DECIMAL SIGNED TIME UNSIGNED)

retourne 2

CONVERT(c jeu-car)

La chaicircne c dans le jeu de caractegrave-res passeacute en paramegravetre jeu de caractegravere DOS retourne

Ecirc Iacute

BINARY(brevet)BINARY(pl-1)

CAST(2 AS CHAR)

CONVERT(Auml Ecirc Iacute Oslash USINGcp850)

4055_04_C04 Page 106 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 107

chapitre ndeg 4 Interrogation des donneacutees

Eacutenumeacuterations

Nous avons vu au chapitre 2 comment manipuler les deux types drsquoeacutenumeacuterations que MySQLpropose (ENUM et SET) Eacutetudions agrave preacutesent quelques fonctions relatives agrave ces types

Type ENUM

Chaque valeur de lrsquoeacutenumeacuteration est associeacutee agrave un indice commenccedilant agrave 1 Ainsi il est possiblede retrouver la position drsquoune valeur au sein de son eacutenumeacuteration comme lrsquoillustre lrsquoexemplesuivant deacutecrit au chapitre 2

Lrsquoindice drsquoune valeur vide (colonne valueacutee agrave () ou dans lrsquoINSERT) est 0 celui drsquounevaleur NULL est NULL

Type SET

Il est possible drsquoextraire des enregistrements en comparant des ensembles entre eux ou entestant lrsquoappartenance drsquoeacuteleacutements au sein drsquoune eacutenumeacuteration SET Lrsquoexemple suivant (deacutecritau chapitre 2) illustre deux possibiliteacutes drsquoextraction

Tableau 4-22 Exemples drsquoextraction drsquoindices drsquoune eacutenumeacuteration ENUM

Table et donneacutees Extraction

Figure 4-5 Table et donneacutees colonne ENUM mysqlgt SELECT nom diplome FROM UnCursus

+-------------+---------+-----------+| nom | diplome | diplome+0 |+-------------+---------+-----------+| F Brouard | BTS | 1 || F Degrelle | Licence | 3 |+-------------+---------+-----------+

Web

UnCursus

num nom diplome

E1 F Brouard BTS E2 F Degrelle Licence

ENUM

BTS DUT Licence INSA

diplome+0

4055_04_C04 Page 107 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

108 copy Eacuteditions Eyrolles

Il est possible drsquoeacutecrire des extractions baseacutees sur lrsquoopeacuterateur LIKE (exemple laquo SELECT hellipFROM Cursus WHERE diplomes LIKE (Licence) raquo) Cela nrsquoest cependant pasrecommandeacute car le mot Licence peut ecirctre preacutesent dans lrsquoensemble non pas en tant qursquoeacuteleacute-ment mais en tant que sous-chaicircne drsquoun eacuteleacutement

Autres fonctions

Drsquoautres fonctions nrsquoappartenant pas agrave la classification preacuteceacutedente sont preacutesenteacutees dans letableau suivant

Tableau 4-23 Exemples drsquoextration drsquoune eacutenumeacuteration SET

Table et donneacutees Extraction

Figure 4-6 Table et donneacutees colonne SET SELECT nom diplomes FROM Cursus WHERE

+-------------+------------------+| nom | diplomes |+-------------+------------------+| F Brouard | BTSLicence || F Degrelle | DUTLicenceINSA |+-------------+------------------+

SELECT nom diplomes FROM Cursus WHERE diplomes = +------------+-------------+| nom | diplomes |+------------+-------------+| F Brouard | BTSLicence |+------------+-------------+

Web

Cursus

num nom diplomes

E1 F Brouard BTS Licence E2 F Degrelle Licence INSA DUT E0 F Peyrard INSA DUT

SET

BTS DUT Licence INSA

FIND_IN_SET(Licencediplomes)gt0

BTSLicence

Tableau 4-24 Autres fonctions

Fonction Objectif Exemple

DEFAULT(colonne) Valeur par deacutefaut drsquoune colonne (NULL si aucune)

FORMAT(numeri-quenb)

Formate un nombre arrondi agrave nb deacutecimales de la maniegravere suivante

retourne 12345679

GREATEST(expres-sion[ expres-sion])

Retourne la plus grande des expressions retourne X-Men

FORMAT(12345678901 1)

GREATEST(RaffarinChiracX-Men)

4055_04_C04 Page 108 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 109

chapitre ndeg 4 Interrogation des donneacutees

Regroupements

Cette section traite agrave la fois des regroupements de lignes (agreacutegats) et des fonctions de groupe(ou multilignes) Nous eacutetudierons les parties surligneacutees de lrsquoinstruction SELECT suivante

SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes

FROM nomTable [ WHERE condition ]

[ clauseOrdonnancement ]

[ LIMIT [rangDeacutepart] nbLignes ]

listeColonnes peut inclure des expressions (preacutesentes dans la clause de regroupe-ment) ou des fonctions de groupe

clauseRegroupement GROUP BY (expression1[expression2]) permetde regrouper des lignes selon la valeur des expressions (colonnes fonction constante calcul)

HAVING condition pour inclure ou exclure des lignes aux groupes (la condition nepeut faire intervenir que des expressions du GROUP BY)

ClauseOrdonnancement deacutejagrave eacutetudieacute (ORDER BY dans la section ProjectionOrdon-nancement)

Interrogeons la table suivante en composant des regroupements et en appliquant des fonctionsde groupe

LEAST(expression[ expression])

Retourne la plus petite des expressions retourne Sarkozy

NULLIF(expr1expr2) Si expr1 = expr2 retourne NULL sinon retourne expr1

retourne Raffarine

IFNULL(expr1expr2) Convertit expr1 susceptible drsquoecirctre nul en une valeur reacuteelle (expr2)

retourne Aucun si diplome est NULL

Tableau 4-24 Autres fonctions (suite)

Fonction Objectif Exemple

LEAST(VillepinSarkozyX-Men)

NULLIF(RaffarineParafine)

IFNULL(diplomeAucun )

Figure 4-7 Table Pilote

[ clauseRegroupement ]

[ HAVING condition ]

Web

Pilote

brevet nom nbHVol prime embauche typeAvion compa

PL-1 Gratien Viel 450 500 1965-02-05 A320 AF PL-2 Didier Donsez 0 1995-05-13 A320 AFPL-3 Richard Grin 1000 2001-09-11 A320 SING

PL-4 Placide Fresnais 2450 500 2001-09-21 A330 SING PL-5 Daniel Vielle 400 600 1965-01-16 A340 AF PL-6 Francoise Tort 0 2000-12-24 A340 CAST

4055_04_C04 Page 109 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

110 copy Eacuteditions Eyrolles

Fonctions de groupe

Nous eacutetudions dans cette section les fonctions usuelles Drsquoautres sont proposeacutees pour manipu-ler des cubes (datawarehouse)

Le tableau suivant preacutesente les principales fonctions Lrsquooption DISTINCT eacutevite les duplicatas(pris en compte sinon par deacutefaut) Agrave lrsquoexception de COUNT toutes les fonctions ignorent lesvaleurs NULL (il faudra utiliser IFNULL pour contrer cet effet)

Utiliseacutees sans GROUP BY ces fonctions srsquoappliquent agrave la totaliteacute ou agrave une seule partie drsquounetable comme le montrent les exemples suivants

Tableau 4-25 Fonctions de groupe

Fonction Objectif

AVG([DISTINCT] expr) Moyenne de expr (nombre)

COUNT( | [DISTINCT ] expr) Nombre de lignes ( toutes les lignes expr pour les colonnes non nulles)

GROUP_CONCAT(expr) Composition drsquoun ensemble de valeurs

MAX([DISTINCT] expr) Maximum de expr (nombre date chaicircne)

MIN([DISTINCT] expr) Minimum de expr (nombre date chaicircne)

STDDEV(expr) Eacutecart type de expr (nombre)

SUM([DISTINCT] expr) Somme de expr (nombre)

VARIANCE(expr) Variance de expr (nombre)

Tableau 4-26 Exemples de fonctions de groupe

Fonction Exemples

AVG Moyenne des heures de vol et des primes des pilotes de la compagnie AFSELECT FROM Pilote WHERE compa = AF+-------------+------------+| AVG(nbHVol) | AVG(prime) |+-------------+------------+| 283333333 | 5500000 |+-------------+------------+

COUNT Nombre de pilotes drsquoheures de vol et de primes (toutes et distinctes) recenseacutees dans la tableSELECT

FROM Pilote+----------+---------------+--------------+-----------------------+| COUNT() | COUNT(nbHVol) | COUNT(prime) | COUNT(DISTINCT prime) |+----------+---------------+--------------+-----------------------+| 6 | 5 | 4 | 3 |+----------+---------------+--------------+-----------------------+

WebAVG(nbHVol) AVG(prime)

COUNT() COUNT(nbHVol) COUNT(prime)COCOUNT(DISTINCT prime)

4055_04_C04 Page 110 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 111

chapitre ndeg 4 Interrogation des donneacutees

Eacutetudions agrave preacutesent ces fonctions dans le cadre de regroupements de lignes

Eacutetude du GROUP BY et HAVINGLe groupement de lignes dans une requecircte se programme au niveau surligneacute de lrsquoinstructionSQL suivante

SELECT col1[ col2hellip] fonction1Groupe(hellip)[fonction2Groupe(hellip)hellip]

FROM nomTable [ WHERE condition ]

[ORDER BY col1 | expr1 | position1 [ASC | DESC] [col1 ] ]

GROUP_CONCAT

Nom des pilotes de la compagnie AFSELECT compa FROM Pilote GROUP BY compa+-------+------------------------------------------+| compa | GROUP_CONCAT(nom) |+-------+------------------------------------------+| AF | Gratien VielDidier DonsezDaniel Vielle || CAST | Francoise Tort || SING | Richard GrinPlacide Fresnais |+-------+------------------------------------------+

MAX ndash MIN

Nombre drsquoheures de vol le plus eacuteleveacute date drsquoembauche la plus reacutecente Nombre drsquoheures de vol le moins eacuteleveacute date drsquoembauche la plus ancienneSELECT Date+

Date- FROM Pilote+-------------+------------+------------+------------+| MAX(nbHVol) | Date+ | MIN(prime) | Date- |+-------------+------------+------------+------------+| 245000 | 2001-09-21 | 0 | 1965-02-05 |+-------------+------------+------------+------------+

STDEV ndash SUM ndash VARIANCE

Eacutecart type des primes somme des heures de vol variance des primes des pilotes de la compagnie AFSELECT FROM Pilote WHERE compa = AF+---------------+-------------+-----------------+| STDDEV(prime) | SUM(nbHVol) | VARIANCE(prime) |+---------------+-------------+-----------------+| 500000 | 85000 | 25000000 |+---------------+-------------+-----------------+

Tableau 4-26 Exemples de fonctions de groupe (suite)

Fonction Exemples

GROUP_CONCAT(nom)

MAX(nbHVol) MAX(embauche) MIN(prime)MIN(embauche)

STDDEV(prime) SUM(nbHVol) VARIANCE(prime)

GROUP BY col1 | expr1 | position1 [col2 ]

[ HAVING condition ]

4055_04_C04 Page 111 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

112 copy Eacuteditions Eyrolles

La clause WHERE de la requecircte permet drsquoexclure des lignes pour chaque groupement ou derejeter des groupements entiers Elle srsquoapplique donc agrave la totaliteacute de la table

La clause GROUP BY liste les colonnes du groupement

La clause HAVING permet de poser des conditions sur chaque groupement

La clause ORDER BY permet de trier le reacutesultat (deacutejagrave eacutetudieacutee)

Les colonnes preacutesentes dans le SELECT doivent apparaicirctre dans le GROUP BY Seules desfonctions ou expressions peuvent exister en plus dans le SELECT

Les alias de colonnes ne peuvent pas ecirctre utiliseacutes dans la clause GROUP BY

Dans lrsquoexemple suivant en groupant sur la colonne compa trois ensembles de lignes (groupe-ments) sont composeacutes Il est alors possible drsquoappliquer des fonctions de groupe agrave chacun deces ensembles (dont le nombre nrsquoest pas preacuteciseacute dans la requecircte ni limiteacute par le systegraveme quiparcourt toute la table)

Il est aussi possible de grouper sur plusieurs colonnes (par exemple ici sur les colonnes compaet typeAvion pour classifier les pilotes selon ces deux critegraveres)

Utiliseacutees avec GROUP BY les fonctions srsquoappliquent deacutesormais agrave chaque regroupementcomme le montrent les exemples suivants

Figure 4-8 Groupement sur la colonne compa

Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY

Fonction Exemples

AVG Moyenne des heures de vol et des primes pour chaque compagnieSELECT compa AVG(nbHVol) AVG(prime) FROM Pilote +-------+-------------+------------+| compa | AVG(nbHVol) | AVG(prime) |+-------+-------------+------------+| AF | 283333333 | 5500000 || CAST | NULL | 00000 || SING | 1725000000 | 5000000 |+-------+-------------+------------+

Pilote

brevet nom nbHVol prime embauche typeAvion compa

PL-1 Gratien Viel 450 500 1965-02-05 A320 AF

PL-2 Didier Donsez 0 1995-05-13 A320 AF

PL-5 Daniel Vielle 400 600 1965-01-16 A340 AF

PL-6 Francoise Tort 0 2000-12-24 A340 CAST

PL-3 Richard Grin 1000 2001-09-11 A320 SING

PL-4 Placide Fresnais 2450 500 2001-09-21 A330 SING

Web

GROUP BY(compa)

4055_04_C04 Page 112 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 113

chapitre ndeg 4 Interrogation des donneacutees

COUNT Nombre de pilotes (et ceux qui ont de lrsquoexpeacuterience du vol) par compagnieSELECT compa COUNT() COUNT(nbHVol) FROM Pilote +-------+----------+---------------+| compa | COUNT() | COUNT(nbHVol) |+-------+----------+---------------+| AF | 3 | 3 || CAST | 1 | 0 || SING | 2 | 2 |+-------+----------+---------------+

MAX Nombre drsquoheures de vol le plus eacuteleveacute date drsquoembauche la plus reacutecente pour cha-que compagnieSELECT compa MAX(nbHVol) MAX(embauche) Date+ FROM Pilote +-------+-------------+------------+| compa | MAX(nbHVol) | Date+ |+-------+-------------+------------+| AF | 45000 | 1995-05-13 || CAST | NULL | 2000-12-24 || SING | 245000 | 2001-09-21 |+-------+-------------+------------+

STDEV ndash SUM (avec WHERE)

Eacutecarts types des primes et sommes des heures de vol des pilotes volant sur A320 de chaque compagnieSELECT compa STDDEV(prime) SUM(nbHVol) FROM Pilote WHERE typeAvion = A320 +-------+---------------+-------------+| compa | STDDEV(prime) | SUM(nbHVol) |+-------+---------------+-------------+| AF | 00000 | 45000 || SING | NULL | 100000 |+-------+---------------+-------------+

Plusieurs colonnes dans le GROUP BY

Nombre de pilotes qualifieacutes par type drsquoappareil et par compagnieSELECT compatypeAvion COUNT(brevet) FROM Pilote +-------+-----------+---------------+| compa | typeAvion | COUNT(brevet) |+-------+-----------+---------------+| AF | A320 | 2 || AF | A340 | 1 || CAST | A340 | 1 || SING | A320 | 1 || SING | A330 | 1 |+-------+-----------+---------------+

Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY (suite)

Fonction Exemples

GROUP BY(compa)

GROUP BY(compa)

GROUP BY(compa)

GROUP BY compatypeAvion

4055_04_C04 Page 113 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

114 copy Eacuteditions Eyrolles

Opeacuterateurs ensemblistes

Une des forces du modegravele relationnel repose sur le fait qursquoil est fondeacute sur une base matheacutema-tique (theacuteorie des ensembles) Le langage SQL devrait programmer les opeacuterations binaires(entre deux tables) suivantes

intersection qui extrait des donneacutees preacutesentes simultaneacutement dans les deux tables

union par les opeacuterateurs UNION et UNION ALL qui fusionnent des donneacutees des deuxtables

diffeacuterence qui extrait des donneacutees preacutesentes dans une table sans ecirctre preacutesentes dans ladeuxiegraveme table

produit carteacutesien par le fait de disposer de deux tables dans la clause FROM ce qui permetde composer des combinaisons agrave partir des donneacutees des deux tables

Restrictions

Seules des colonnes de mecircme type (CHAR VARCHAR DATE numeacuteriques etc) doivent ecirctrecompareacutees avec des opeacuterateurs ensemblistes

Lrsquointersection et la diffeacuterence ne sont pas encore disponibles sous MySQL La diffeacuterence seprogramme agrave lrsquoaide de DISTINCT et NOT IN lrsquointersection agrave lrsquoaide de DISTINCT et IN

Attention pour les colonnes CHAR agrave veiller agrave ce que la taille soit identique entre les deuxtables pour que la comparaison fonctionnne Le nom des colonnes nrsquoa pas drsquoimportance Il estpossible de comparer plusieurs colonnes de deux tables

GROUP BY et HAVING

Compagnies (et nombre de leurs pilotes) ayant plus drsquoun piloteSELECT compa COUNT(brevet) FROM Pilote +-------+---------------+| compa | COUNT(brevet) |+-------+---------------+| AF | 3 || SING | 2 |+-------+---------------+

Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY (suite)

Fonction Exemples

GROUP BY(compa)HAVING COUNT(brevet)gt=2

4055_04_C04 Page 114 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 115

chapitre ndeg 4 Interrogation des donneacutees

Exemple

Eacutetudions agrave preacutesent chaque opeacuterateur agrave partir de lrsquoexemple composeacute des deux tables suivantes

AvionsdeAF(immat CHAR(6) typeAvion CHAR(10) nbHVol DECIMAL(102))

AvionsdeSING(immatriculation CHAR(6) typeAv CHAR(10) prixAchatDECIMAL(142))

Il est vraisemblable que seules les deux premiegraveres colonnes doivent ecirctre compareacutees Bien quepermises par MySQL la programmation de lrsquounion lrsquointersection ou la diffeacuterence entre lesprix des avions et les heures de vol (deux colonnes numeacuteriques) ne seraient pas valides drsquounpoint de vue seacutemantique

Intersection

Lrsquointersection entre deux ensembles homogegravenes se programme agrave lrsquoaide drsquoune requecircte du typeSELECT DISTINCT ensemble1 FROM Table1 WHERE ensemble1 IN (SELECT ensemble2FROM Table2) Comme lrsquoopeacuterateur drsquointersection cette requecircte est commutative (Table1 peutjouer le rocircle de Table2 et ensemble1 celui drsquoensemble2)

Notez qursquoagrave lrsquoaffichage le nom des colonnes est donneacute par la premiegravere requecircte La deuxiegravemefait apparaicirctre deux colonnes dans le SELECT

Figure 4-9 Tables pour les opeacuterateurs ensemblistes

Web

AviondeAF

immat typeAvion nbHVol

F-WTSS Concorde 6570 F-GLFS A320 3500 F-GTMP A340

AviondeSING

immatriculation typeAv PrixAchat

S-ANSI A320 104 500 S-AVEZ A320 156 000 S-SMILE A330 198 000 F-GTMP A340 204 500

Tableau 4-28 Exemples drsquointersections

Besoin Requecircte

Quels sont les types drsquoavions que lesdeux compagnies exploitent en com-mun

SELECT FROM AvionsdeAF WHERE typeAvion IN (SELECT typeAv FROM AvionsdeSING)+-----------+| typeAvion |+-----------+| A320 || A340 |+-----------+

WebDISTINCT typeAvion

4055_04_C04 Page 115 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

116 copy Eacuteditions Eyrolles

Si vous voulez continuer ce raisonnement en vous basant sur trois compagnies il suffit drsquoajou-ter une clause WHERE dans les requecirctes imbriqueacutees qui interrogera la troisiegraveme compagnie Ceprincipe se geacuteneacuteralise et pour n compagnies il faudra n imbrications de requecirctes

Opeacuterateurs UNION et UNION ALL

Les opeacuterateurs UNION et UNION ALL sont commutatifs Lrsquoopeacuterateur UNION permet drsquoeacuteviter lesduplicatas (comme DISTINCT dans un SELECT) UNION ALL ne les eacutelimine pas

Quels sont les avions qui sont exploi-teacutes par les deux compagnies en com-mun

SELECT FROM AvionsdeSING WHERE immatriculation IN (SELECT immat FROM AvionsdeAF) AND typeAv IN (SELECT typeAvion FROM AvionsdeAF)+-----------------+--------+| immatriculation | typeAv |+-----------------+--------+| F-GTMP | A340 |+-----------------+--------+

Tableau 4-28 Exemples drsquointersections (suite)

Besoin Requecircte

DISTINCT immatriculation typeAv

Tableau 4-29 Exemples avec les opeacuterateurs UNION

Besoin Requecircte

Quels sont tous les types drsquoavions que les deux compagnies exploitent

SELECT typeAvion FROM AvionsdeAF UNIONSELECT typeAv FROM AvionsdeSING+-----------+| typeAvion |+-----------+| A320 || A340 || Concorde || A330 |+-----------+

Web

4055_04_C04 Page 116 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 117

chapitre ndeg 4 Interrogation des donneacutees

Ce principe se geacuteneacuteralise agrave lrsquounion de n ensembles par n requecirctes relieacutees avec n-1 clausesUNION ou UNION ALL

Diffeacuterence

La diffeacuterence entre deux ensembles homogegravenes se programme agrave lrsquoaide drsquoune requecircte du typeSELECT DISTINCT ensemble1 FROM Table1 WHERE ensemble1 NOT IN (SELECT ensemble2FROM Table2) Comme lrsquoopeacuterateur ensembliste cette requecircte nrsquoest pas commutative car elleprogramme ensemble1-ensemble2

Mecircme requecircte avec les duplicatas On extraitles types de la compagnie AF suivis des typesde la compagnie SING

SELECT typeAvion FROM AvionsdeAF UNION ALLSELECT typeAv FROM AvionsdeSING+-----------+| typeAvion |+-----------+| A320 || A340 || Concorde || A340 || A320 || A320 || A330 |+-----------+

Tableau 4-29 Exemples avec les opeacuterateurs UNION (suite)

Besoin RequecircteWeb

Tableau 4-30 Exemples de diffeacuterences

Besoin Requecircte

Quels sont les types drsquoavions exploiteacutes par lacompagnie AF mais pas par SING

SELECT DISTINCT typeAvion FROM AvionsdeAF WHERE typeAvion NOT IN (SELECT typeAv FROM AvionsdeSING)+-----------+| typeAvion |+-----------+| Concorde |+-----------+

Quels sont les types drsquoavions exploiteacutes par lacompagnie SING mais pas par AF

SELECT DISTINCT typeAv FROM AvionsdeSING WHERE typeAv NOT IN (SELECT typeAvion FROM AvionsdeAF)+--------+| typeAv |+--------+| A330 |+--------+

Web

4055_04_C04 Page 117 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

118 copy Eacuteditions Eyrolles

Ce principe se geacuteneacuteralise agrave la diffeacuterence entre n ensembles par imbrication de n requecirctes (dansle bon ordre)

La directive NOT IN doit ecirctre utiliseacutee avec prudence car elle retourne faux si un membrerameneacute par la sous-interrogation est NULL

Ordonner les reacutesultats

Le reacutesultat drsquoune requecircte contenant des opeacuterateurs ensemblistes est trieacute par deacutefaut par ordrecroissant sauf avec lrsquoopeacuterateur UNION ALL

La clause ORDER BY nrsquoest utilisable qursquoune fois en fin drsquoune requecircte incluant des opeacuterateursensemblistes Cette clause accepte le nom des colonnes de la premiegravere requecircte ou la positionde ces colonnes

Le tableau suivant preacutesente trois eacutecritures diffeacuterentes de la mecircme requecircte ensembliste conte-nant une clause ORDER BY Le besoin est de connaicirctre tous les types drsquoavions que les deuxcompagnies exploitent (classement par ordre deacutecroissant)

Notez que la troisiegraveme requecircte produit le mecircme reacutesultat en faisant intervenir un SELECT(aliaseacute) dans le FROM Ce meacutecanisme permet de construire dynamiquement la table agrave interroger

Tableau 4-31 Exemples avec la clause ORDER BY

Technique Requecircte

Nom de la colonne SELECT typeAvion FROM AvionsdeAF UNIONSELECT typeAv FROM AvionsdeSING

Position de la colonne hellip

SELECT dans le FROM SELECT TtypeAvion FROM T ORDER BY TtypeAvion DESC

+-----------+| typeAvion |+-----------+| Concorde || A340 || A330 || A320 |+-----------+

Web

ORDER BY typeAvion DESC

ORDER BY 1 DESC

(SELECT typeAvion FROM AvionsdeAF UNION SELECT typeAv FROM AvionsdeSING)

4055_04_C04 Page 118 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 119

chapitre ndeg 4 Interrogation des donneacutees

Il faut affecter des alias aux expressions de la premiegravere requecircte pour pouvoir les utiliser dansle ORDER BY final

Pour illustrer cette restriction supposons que nous deacutesirions faire la liste des avions avec leurprix drsquoachat augmenteacute de 20 liste trieacutee en fonction de cette derniegravere hausse Le problegravemeest que la table AvionsdeAF ne possegravede pas une telle colonne Ajoutons donc au SELECT decette table dans le tableau suivant la valeur 0 pour rendre possible lrsquoopeacuterateur UNION

Produit carteacutesien

En matheacutematiques le produit carteacutesien de deux ensembles E et F est lrsquoensemble des couples(x y) ougrave x isin E et y isin F En transposant au modegravele relationnel le produit carteacutesien de deuxtables T1 et T2 est lrsquoensemble des enregistrements (x y) ougrave x isin T1 et y isin T2

Le produit carteacutesien total entre deux tables T1 et T2 se programme sous SQL en positionnantles deux tables dans la clause FROM sans ajouter de conditions dans la clause WHERE Si les conditions sont de la forme c1 opeacuterateur c2 avec c1 isin T1 et c2 isin T2 on parlera dejointure Si les conditions sont de la forme c1 opeacuterateur valeur1 ou c2 opeacuterateur valeur2on parlera de produit carteacutesien restreint

Le produit carteacutesien restreint illustreacute par lrsquoexemple suivant exprime les combinaisons drsquoeacutequi-pages qursquoil est possible de reacutealiser en consideacuterant les pilotes de la compagnie AF et les avionsde la table AviondeAF

Tableau 4-32 Alias pour ORDER BY

Requecircte Reacutesultat

SELECT immatriculation FROM Avions-deSINGUNION SELECT immat 0 FROM AvionsdeAF ORDER BY px DESC

+-----------------+------------+| immatriculation | px |+-----------------+------------+| F-GTMP | 245400000 || S-MILE | 237600000 || S-AVEZ | 187200000 || S-ANSI | 125400000 || F-GLFS | 0000 || F-GTMP | 0000 || F-WTSS | 0000 |+-----------------+------------+

Web12prixAchat px

4055_04_C04 Page 119 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

120 copy Eacuteditions Eyrolles

Le nombre drsquoenregistrements reacutesultant drsquoun produit carteacutesien est eacutegal au produit du nombredrsquoenregistrements des deux tables mises en relation

Dans le cadre de notre exemple le nombre drsquoenregistrements du produit carteacutesien sera de2 pilotes x 3 avions = 6 enregistrements Le tableau suivant deacutecrit la requecircte SQL permettantde construire le produit carteacutesien restreint de notre exemple Les alias distinguent les colonnessrsquoil advenait qursquoil en existe de mecircme nom entre les deux tables

Bilan

Seules les colonnes de mecircme type et repreacutesentant la mecircme seacutemantique peuvent ecirctre compareacuteesagrave lrsquoaide de termes ensemblistes Il est possible drsquoajouter des expressions (constantes oucalculs) agrave une requecircte pour rendre homogegravenes les deux requecirctes et permettre ainsi lrsquoutilisationdrsquoun opeacuterateur ensembliste

Parce qursquoil faut utiliser NOT IN avec prudence diffeacuterentes alternatives aux opeacuterateurs ensem-blistes existent sur la base de jointures de type SQL2 (qui sont deacutetailleacutees dans la prochainesection) elles sont deacutetailleacutees par Pierre Caboche et mises en ligne sur le site Web associeacute agravelrsquoouvrage

Figure 4-10 Produit carteacutesien drsquoenregistrements de tables

AviondeAF

immat typeAvion nbHVol

F-WTSS Concorde 6570 F-GLFS A320 3500 F-GTMP A340

Pilote

brevet nom nbHVol compa

PL-1 Gratien Viel 450 AF PL-2 Richard Grin 1000 SING PL-3 Placide Fresnais 2450 CAST PL-4 Daniel Vielle 5000 AF

Tableau 4-33 Produit carteacutesien

Besoin Requecircte

Quels sont les couples possibles (avion pilote)en consideacuterant les avions et les pilotes de lacompagnie AF

6 lignes extraites

SELECT pbrevet avAFimmat FROM WHERE pcompa = AF+--------+--------+| brevet | immat |+--------+--------+| PL-1 | F-GLFS || PL-1 | F-GTMP || PL-1 | F-WTSS || PL-4 | F-GLFS || PL-4 | F-GTMP || PL-4 | F-WTSS |+--------+--------+

WebPilote p AvionsdeAF avAF

4055_04_C04 Page 120 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 121

chapitre ndeg 4 Interrogation des donneacutees

Jointures

Les jointures permettent drsquoextraire des donneacutees issues de plusieurs tables Le processus denormalisation du modegravele relationnel est baseacute sur la deacutecomposition et a pour conseacutequencedrsquoaugmenter le nombre de tables drsquoun scheacutema Ainsi la majoriteacute des requecirctes utilisent desjointures neacutecessaires pour pouvoir extraire des donneacutees de tables distinctes

Une jointure met en relation deux tables sur la base drsquoune clause de jointure (comparaison decolonnes) Geacuteneacuteralement cette comparaison fait intervenir une cleacute eacutetrangegravere drsquoune table avecune cleacute primaire drsquoune autre table (car le modegravele relationnel est fondamentalement baseacute surles valeurs)

En consideacuterant les tables suivantes les seules jointures logiques doivent se faire sur lrsquoeacutegaliteacutesoit des colonnes comp et compa soit des colonnes brevet et chefPil Ces jointurespermettront drsquoafficher des donneacutees drsquoune table (ou des deux tables) tout en posant des condi-tions sur une table (ou les deux) Par exemple lrsquoaffichage du nom des compagnies (colonne dela table Compagnie) qui ont embaucheacute un pilote ayant moins de 500 heures de vol (conditionsur la table Pilote)

Classification

Une jointure peut srsquoeacutecrire dans une requecircte SQL de diffeacuterentes maniegraveres

laquo relationnelle raquo (aussi appeleacutee laquo SQL89 raquo pour rappeler la version de la norme SQL) laquo SQL2 raquo (aussi appeleacutee laquo SQL92 raquo) laquo proceacutedurale raquo (qui qualifie la structure de la requecircte) laquo mixte raquo (combinaison des trois approches preacuteceacutedentes)

Figure 4-11 Deux tables agrave mettre en jointure

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF

4055_04_C04 Page 121 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

122 copy Eacuteditions Eyrolles

Nous allons principalement eacutetudier les deux premiegraveres eacutecritures qui sont les plus utiliseacuteesNous parlerons en fin de section des deux derniegraveres

Jointure relationnelle

La forme la plus courante de la jointure est la jointure dite laquo relationnelle raquo (aussi appeleacuteeSQL89) caracteacuteriseacutee par une seule clause FROM contenant les tables et alias agrave mettre en join-ture deux agrave deux La syntaxe geacuteneacuterale suivante deacutecrit une jointure relationnelle

SELECT [alias1]col1 [alias2]col2hellip

FROM [nomBase]nomTable1 [alias1] [nomBase]nomTable2 [alias2]hellip

WHERE (conditionsDeJointure)

Cette forme est la plus utiliseacutee car elle est la plus simple agrave eacutecrire Un autre avantage de ce typede jointure est qursquoelle laisse le soin au SGBD drsquoeacutetablir la meilleure strateacutegie drsquoaccegraves (choix dupremier index agrave utiliser puis du deuxiegraveme etc) pour optimiser les performances

Afin drsquoeacuteviter les ambiguiumlteacutes concernant le nom des colonnes on utilise en geacuteneacuteral des alias detables pour suffixer les tables dans la clause FROM et preacutefixer les colonnes dans les clausesSELECT et WHERE

Jointures SQL2

Afin de se rendre conforme agrave la norme SQL2 MySQL propose aussi des directives qui permet-tent de programmer drsquoune maniegravere plus verbale les diffeacuterents types de jointures

SELECT [ALL | DISTINCT | DISTINCTROW ] listeColonnes

FROM [nomBase]nomTable1 [ INNER | LEFT | RIGHT [OUTER] ]

JOIN [nomBase]nomTable2 ON condition | USING ( colonne1 [ colonne2] )

| CROSS JOIN | NATURAL [ LEFT | RIGHT [OUTER] ]

JOIN [nomBase]nomTable2 hellip

[ WHERE condition ]

Cette eacutecriture est moins utiliseacutee que la syntaxe relationnelle Bien que plus concise pour desjointures agrave deux tables elle se complique pour des jointures plus complexes

4055_04_C04 Page 122 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 123

chapitre ndeg 4 Interrogation des donneacutees

Types de jointures

Bien que dans le vocabulaire courant on ne parle que de laquo jointures raquo en fonction de la naturede lrsquoopeacuterateur utiliseacute dans la requecircte de la clause de jointure et des tables concerneacutees ondistingue

Les jointures internes (inner joins)

ndash Lrsquoeacutequijointure (equi join) est la plus connue elle utilise lrsquoopeacuterateur drsquoeacutegaliteacute dans laclause de jointure La jointure naturelle est conditionneacutee en plus par le nom des colon-nes La non eacutequijointure utilise lrsquoopeacuterateur drsquoineacutegaliteacute dans la clause de jointure

ndash Lrsquoautojointure (self join) est un cas particulier de lrsquoeacutequijointure qui met en œuvre deuxfois la mecircme table (des alias de tables permettront de distinguer les enregistrementsentre eux)

La jointure externe (outer join) la plus compliqueacutee qui favorise une table (ditelaquo dominante raquo) par rapport agrave lrsquoautre (dite laquo subordonneacutee raquo) Les lignes de la table domi-nante sont retourneacutees mecircme si elles ne satisfont pas aux conditions de jointure

Le tableau suivant illustre cette classification sous la forme de quelques conditions appliqueacuteesagrave notre exemple

Pour mettre trois tables T1 T2 et T3 en jointure il faut utiliser deux clauses de jointures (uneentre T1 et T2 et lrsquoautre entre T2 et T3) Pour n tables il faut n-1 clauses de jointures Si vousoubliez une clause de jointure un produit carteacutesien restreint est geacuteneacutereacute

Eacutetudions agrave preacutesent chaque type de jointure avec les syntaxes laquo relationnelle raquo et laquo SQL2 raquo

Eacutequijointure

Une eacutequijointure utilise lrsquoopeacuterateur drsquoeacutegaliteacute dans la clause de jointure et compare geacuteneacuterale-ment des cleacutes primaires avec des cleacutes eacutetrangegraveres

En consideacuterant les tables suivantes les eacutequijointures se programment soit sur les colonnescomp et compa soit sur les colonnes brevet et chefPil Extrayons par exemple

Tableau 4-34 Exemples de conditions

Type de jointure Syntaxe de la condition

Eacutequijointure hellipWHERE comp compa

Autojointure hellipWHERE chefPil = brevet

Jointure externe hellipFROM Compagnie Pilote ON comp = compa

=

alias1 alias2

LEFT OUTER JOIN

4055_04_C04 Page 123 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

124 copy Eacuteditions Eyrolles

lrsquoidentiteacute des pilotes de la compagnie de nom Air France ayant plus de 500 heures de vol(requecircte R1)

les coordonneacutees des compagnies qui embauchent des pilotes de moins de 500 heures devol (requecircte R2)

La jointure qui reacutesoudra la premiegravere requecircte est illustreacutee dans la figure par les donneacutees griseacuteestandis que la deuxiegraveme jointure est repreacutesenteacutee par les donneacutees en gras

Eacutecriture laquo relationnelle raquo

bull MySQL recommande drsquoutiliser des alias de tables pour ameacuteliorer les performances

bull Les alias sont obligatoires quand des colonnes de diffeacuterentes tables portent le mecircme nomou dans le cas drsquoautojointures

Eacutecriture laquo SQL2 raquo

bull La clause JOIN hellip ON condition permet de programmer une eacutequijointure

bull Lrsquoutilisation de la directive INNER devant JOINhellip est optionnelle et est appliqueacutee par deacutefaut

Le tableau suivant deacutetaille ces requecirctes avec les deux syntaxes Les clauses de jointures sontgriseacutees

Figure 4-12 Eacutequijointures

Web

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF

4055_04_C04 Page 124 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 125

chapitre ndeg 4 Interrogation des donneacutees

Autojointure

Cas particulier de lrsquoeacutequijointure lrsquoautojointure relie une table agrave elle mecircme

Extrayons par exemple

lrsquoidentiteacute des pilotes placeacutes sous la responsabiliteacute des pilotes de nom Alquieacute(requecircte R3)

la somme des heures de vol des pilotes placeacutes sous la responsabiliteacute des chefs pilotes de lacompagnie de nom Air France (requecircte R4)

Ces requecirctes doivent ecirctre programmeacutees agrave lrsquoaide drsquoune autojointure car elles imposent deparcourir deux fois la table Pilote (examen de chaque pilote en le comparant agrave un autre)Les autojointures sont reacutealiseacutees entre les colonnes brevet et chefPil

La jointure de la premiegravere requecircte est illustreacutee dans la figure par les donneacutees surligneacutees enclair tandis que la deuxiegraveme jointure est mise en valeur par les donneacutees surligneacutees en fonceacute

Tableau 4-35 Exemples drsquoeacutequijointures

Requecircte Jointure relationnelle Jointure SQL2

R1 SELECT brevet nom FROM Pilote Compagnie AND nomComp = Air France AND nbHVol gt 500

SELECT brevet nom FROM Compagnie WHERE nomComp = Air France AND nbHVol gt 500

+--------+--------------+| brevet | nom |+--------+--------------+| PL-2 | Didier Linxe || PL-4 | Henri Alquieacute |+--------+--------------+

R2 SELECT cpgnomComp cpgnrue cpgrue cpgville FROM Pilote pil Compagnie cpg AND pilnbHVol lt 500

SELECT nomComp nrue rue ville FROM Compagnie WHERE nbHVol lt 500

+------------+------+------------+-------+| nomComp | nrue | rue | ville |+------------+------+------------+-------+| Air France | 124 | Port Royal | Paris |+------------+------+------------+-------+

Web

WHERE comp = compa JOIN Pilote ON comp = compa

WHERE cpgcomp = pilcompaINNER JOIN Pilote ON comp = compa

4055_04_C04 Page 125 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

126 copy Eacuteditions Eyrolles

Le tableau suivant deacutetaille ces requecirctes les clauses drsquoautojointures sont surligneacutees Dans lesdeux syntaxes il est impeacuteratif drsquoutiliser un alias de table Concernant lrsquoeacutecriture laquo SQL2 raquo onremarque que les clauses JOIN srsquoimbriquent (pour joindre plus de deux tables)

Figure 4-13 Autojointures

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF

Tableau 4-36 Exemples drsquoautojointures

Requecircte Jointure relationnelle Jointure SQL2

R3 SELECT p1brevet p1nom FROM Pilote p1 Pilote p2 AND p2nom LIKE Alquieacute

SELECT p1brevet p1nom FROM Pilote p1 WHERE p2nom LIKE Alquieacute

+--------+----------------+| brevet | nom |+--------+----------------+| PL-1 | Pierre Lamothe || PL-2 | Didier Linxe |+--------+----------------+

R4 SELECT SUM(p1nbHVol) FROM Pilote p1 Pilote p2 Compagnie cpg AND cpgnomComp = Air France

SELECT SUM(p1nbHVol) FROM Pilote p1 WHERE nomComp = Air France

+----------------+| SUM(p1nbHVol) |+----------------+| 135000 |+----------------+

Web

WHERE p1chefPil = p2brevet JOIN Pilote p2ON p1chefPil = p2brevet

WHERE p1chefPil = p2brevetAND cpgcomp = p2compa

JOIN Pilote p2ON p1chefPil = p2brevet

JOIN CompagnieON comp = p2compa

4055_04_C04 Page 126 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 127

chapitre ndeg 4 Interrogation des donneacutees

Ineacutequijointure

Les requecirctes drsquoineacutequijointures font intervenir tout type drsquoopeacuterateur (ltgt gt lt gt= lt= BETWEENLIKE IN) Agrave lrsquoinverse des eacutequijointures la clause drsquoune ineacutequijointure nrsquoest pas baseacutee surlrsquoeacutegaliteacute de cleacutes primaires (ou candidates) et de cleacutes eacutetrangegraveres

En consideacuterant les tables suivantes extrayons par exemple

les pilotes ayant plus drsquoexpeacuterience que le pilote de numeacutero de brevet PL-2 (requecircte R5)

le titre de qualification des pilotes en raisonnant sur la comparaison des heures de vol avecun ensemble de reacutefeacuterence ici la table HeuresVol (requecircte R6) Dans notre exemple ilsrsquoagit par exemple de retrouver le fait que le premier pilote est deacutebutant

La jointure qui reacutesoudra la deuxiegraveme requecircte est illustreacutee par les niveaux de gris

Le tableau suivant deacutetaille ces requecirctes les clauses drsquoineacutequijointures sont surligneacutees

Figure 4-14 Ineacutequijointures

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4PL-2 Didier Linxe 900 AF PL-4PL-3 Christian Soutou 1000 SINGPL-4 Henri Alquieacute 3400 AF

HeuresVol

titre basnbHVol hautnbHVol

Deacutebutant 0 500Initieacute 501 1000Expert 1001 20000

Tableau 4-37 Exemples drsquoineacutequijointures

Requecircte Jointure relationnelle Jointure SQL2

R5 SELECT p1brevet p1nomp1nbHVol p2nbHVol Reacutefeacuterence FROM Pilote p1 Pilote p2

AND p2brevet = PL-2

SELECT p1brevet p1nom p1nbHVol p2nbHVol Reacutefeacuterence FROM Pilote p1 WHERE p2brevet = PL-2

+--------+------------------+---------+-----------+| brevet | nom | nbHVol | Reacutefeacuterence |+--------+------------------+---------+-----------+| PL-3 | Christian Soutou | 100000 | 90000 || PL-4 | Henri Alquieacute | 340000 | 90000 |+--------+------------------+---------+-----------+

Web

WHERE p1nbHVol gt p2nbHVolJOIN

Pilote p2 ON p1nbHVolgtp2nbHVol

4055_04_C04 Page 127 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

128 copy Eacuteditions Eyrolles

Jointures externes

Les jointures externes permettent drsquoextraire des enregistrements qui ne reacutepondent pas aux cri-tegraveres de jointure Lorsque deux tables sont en jointure externe une table est laquo dominante raquo parrapport agrave lrsquoautre (qui est dite laquo subordonneacutee raquo) Ce sont les enregistrements de la table domi-nante qui sont retourneacutes (mecircme srsquoils ne satisfont pas aux conditions de jointure)

Comme les jointures internes les jointures externes sont geacuteneacuteralement baseacutees sur les cleacutesprimaires et eacutetrangegraveres On distingue les jointures unilateacuterales qui considegraverent une table domi-nante et une table subordonneacutee et les jointures bilateacuterales pour lesquelles les tables jouent unrocircle symeacutetrique (pas de dominant)

Jointures unilateacuterales

En consideacuterant les tables suivantes une jointure externe unilateacuterale permet drsquoextraire

la liste des compagnies et leurs pilotes mecircme les compagnies nrsquoayant pas de pilote(requecircte R7) Sans une jointure externe la compagnie CAST ne peut ecirctre extraite

la liste des pilotes et leurs qualifications mecircme les pilotes nrsquoayant pas encore de qualifica-tion (requecircte R8)

La figure illustre les tables dominantes et subordonneacutees

R6 SELECT pilbrevet pilnom pilnbHVol hvtitre FROM Pilote pil HeuresVol hv

SELECT brevet nom nbHVol titre FROM Pilote

+--------+------------------+---------+----------+| brevet | nom | nbHVol | titre |+--------+------------------+---------+----------+| PL-1 | Pierre Lamothe | 45000 | Deacutebutant || PL-2 | Didier Linxe | 90000 | Initieacute || PL-3 | Christian Soutou | 100000 | Initieacute || PL-4 | Henri Alquieacute | 340000 | Expert |+--------+------------------+---------+----------+

Tableau 4-37 Exemples drsquoineacutequijointures (suite)

Requecircte Jointure relationnelle Jointure SQL2

WHERE pilnbHVol BETWEENhvbasnbHVol AND hvhautnbHVol

JOIN HeuresVol ON nbHVolBETWEEN basnbHVol AND hautnbHVol

4055_04_C04 Page 128 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 129

chapitre ndeg 4 Interrogation des donneacutees

Eacutecriture laquo SQL2 raquo

Le sens de la directive de jointure externe LEFT ou RIGHT de la clause OUTER JOIN deacutesignela table dominante

Le tableau suivant deacutetaille les requecirctes de notre exemple les clauses de jointures externesunilateacuterales sont griseacutees Les tables dominantes sont noteacutees en gras (Compagnie pour lapremiegravere requecircte et Pilote pour la deuxiegraveme)

Figure 4-15 Jointures externes unilateacuterales

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alqu ieacute 3400 AF

Qualifs

brevet typeAv validite

PL-4 A320 2005-06-24 PL-4 A340 2005-06-24 PL-2 A320 2006-04-04 PL-3 A330 2006-05-13

dominantedominante

subordonneacutee

subordonneacutee

Tableau 4-38 Eacutecritures eacutequivalentes de jointures externes unilateacuterales

Requecircte Jointures relationnelles Jointures SQL2

R7 Sans objet SELECT nomComp brevet nom FROM Compagnie --eacutequivalent agraveSELECT nomComp brevet nom FROM Pilote

+--------------+--------+------------------+| nomComp | brevet | nom |+--------------+--------+------------------+| Air France | PL-1 | Pierre Lamothe || Air France | PL-2 | Didier Linxe || Air France | PL-4 | Henri Alquieacute || || Singapore AL | PL-3 | Christian Soutou |+--------------+--------+------------------+

WebLEFT OUTER JOIN Pilote ON comp = compa

RIGHT OUTER JOIN Compagnie ON comp = compa

Castanet AL | NULL | NULL

4055_04_C04 Page 129 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

130 copy Eacuteditions Eyrolles

Jointures bilateacuterales

Les deux tables jouent un rocircle symeacutetrique il nrsquoy a pas de table dominante Ce type de jointurepermet drsquoextraire des enregistrements qui ne reacutepondent pas aux critegraveres de jointure des deuxcocircteacutes de la clause de jointure

En consideacuterant les tables suivantes une jointure externe bilateacuterale permet drsquoextraire parexemple

la liste des compagnies et leurs pilotes incluant les compagnies nrsquoayant pas de pilote et lespilotes rattacheacutes agrave aucune compagnie (requecircte R9)

la liste des pilotes et leurs qualifications incluant les pilotes nrsquoayant pas encore drsquoexpeacute-rience et les qualifications associeacutees agrave des pilotes inconnus (requecircte R10)

R8 Sans objet SELECT quatypeAv pilbrevet pilnom FROM Qualifs qua --eacutequivalent agraveSELECT quatypeAv pilbrevet pilnom FROM Pilote pil

+--------+--------+------------------+| typeAv | brevet | nom |+--------+--------+------------------+| || A320 | PL-2 | Didier Linxe || A330 | PL-3 | Christian Soutou || A320 | PL-4 | Henri Alquieacute || A340 | PL-4 | Henri Alquieacute |+--------+--------+------------------+

Tableau 4-38 Eacutecritures eacutequivalentes de jointures externes unilateacuterales

Requecircte Jointures relationnelles Jointures SQL2

RIGHT OUTER JOIN Pilote pilON pilbrevet = quabrevet

LEFT OUTER JOIN Qualifs quaON pilbrevet = quabrevet

NULL | PL-1 | Pierre Lamothe

4055_04_C04 Page 130 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 131

chapitre ndeg 4 Interrogation des donneacutees

Eacutecriture laquo SQL2 raquo

La directive FULL OUTER JOIN permet drsquoignorer lrsquoordre (et donc le sens de la jointure) destables dans la requecircte

Le seul problegraveme crsquoest que

MySQL ne prend pas encore en charge en version 50 la directive FULL OUTER JOIN

Le tableau suivant deacutetaille les requecirctes de notre exemple les clauses de jointures externesbilateacuterales sont surligneacutees Les enregistrements qui ne respectent pas la condition de jointuresont surligneacutes

Figure 4-16 Jointures externes bilateacuterales

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings

Qualifs

brevet typeAv validite

PL-4 A320 2005-06-24 PL-2 A320 2006-04-04 PL-3 A330 2006-05-13 PL-7 A380 2007-07-20

4055_04_C04 Page 131 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

132 copy Eacuteditions Eyrolles

Jointures proceacutedurales

Les jointures proceacutedurales sont eacutecrites par des requecirctes qui contiennent des sous-interroga-tions (SELECT imbriqueacute) Chaque clause FROM ne contient qursquoune seule table

SELECT colonnesTable1 FROM [nomBase]nomTable1 WHERE colonne(s) | expression(s) IN | = | opeacuterateur (SELECT colonne(s)delaTable2 FROM [nomBase]nomTable2 WHERE colonne(s) | expression(s) IN | = | opeacuterateur (SELECT hellip) [AND (conditionsTable2)] ) [AND (conditionsTable1)]

Tableau 4-39 Jointures externes bilateacuterales

Requecircte Jointure relationnelle Jointures (theacuteoriques) SQL2

R9 Sans objet SELECT nomComp brevet nom FROM Pilote --eacutequivalent agraveSELECT nomComp brevet nom FROM Compagnie

NOMCOMP BREVET NOM--------------- ------ --------------------Air France PL-4 Henri AlquieacuteAir France PL-1 Pierre LamotheAir France PL-2 Didier LinxeSingapore AL PL-3 Christian Soutou

R10 Sans objet SELECT quatypeAv pilbrevet pilnom FROM Pilote pil --eacutequivalent agraveSELECT quatypeAv pilbrevet pilnom FROM Qualifs qua

TYPE BREVET NOM---- ------ --------------------A320 PL-4 Henri AlquieacuteA320 PL-2 Didier LinxeA330 PL-3 Christian Soutou

WebFULL OUTER JOIN Compagnie ON comp = compa

FULL OUTER JOIN Pilote ON comp = compa

Castanet AL PL-5 Michel Castaings

FULL OUTER JOIN Qualifs quaON pilbrevet = quabrevet

FULL OUTER JOIN Pilote pilON pilbrevet = quabrevet

A380 PL-1 Pierre Lamothe PL-5 Michel Castaings

4055_04_C04 Page 132 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 133

chapitre ndeg 4 Interrogation des donneacutees

Cette forme drsquoeacutecriture nrsquoest pas la plus utiliseacutee mais elle permet de mieux visualiser certainesjointures Elle est plus complexe agrave eacutecrire car lrsquoordre drsquoapparition des tables dans les clausesFROM a son importance

Seules les colonnes de la table qui se trouve au niveau du premier SELECT peuvent ecirctreextraites

La sous-interrogation doit ecirctre placeacutee entre parenthegraveses Elle ne doit pas comporter de clauseORDER BY mais peut inclure GROUP BY et HAVING

Le reacutesultat drsquoune sous-interrogation est utiliseacute par la requecircte de niveau supeacuterieur Une sous-interrogation est exeacutecuteacutee avant la requecircte de niveau supeacuterieur

Une sous-interrogation peut ramener une ou plusieurs lignes Les opeacuterateurs = gt lt gt= lt=permettent drsquoen extraire une les opeacuterateurs IN ANY et ALL permettent drsquoen ramenerplusieurs

Sous-interrogations monolignes

Le tableau suivant deacutetaille quelques sous-interrogations monolignes Nous nous basons surcertaines requecirctes deacutejagrave eacutetudieacutees (forme relationnelle et SQL2)

Tableau 4-40 Sous-interrogations monolignes

Opeacuterateur Besoin Requecircte

= pour les eacutequi-jointures ou auto-jointures (= teste une ligne)

R1 (Pilotes de la compagnie de nom Air France ayant plus de 500 heures de vol)

SELECT brevet nom FROM Pilote WHERE compa AND nbHVolgt500

R3 (Pilotes sous la respon-sabiliteacute du pilote de nom Alquieacute)

SELECT brevet nom FROM Pilote WHERE chefPil =

gt pour les ineacutequi-jointures

R5 (Pilotes ayant plus drsquoexpeacuterience que le pilote de brevet PL-2)

SELECT brevet nom nbHVol FROM Pilote WHERE nbHVol gt

Web=

(SELECT compFROM CompagnieWHERE nomComp = Air France)

(SELECT brevet FROM PiloteWHERE nom LIKE Alquieacute)

(SELECT nbHVol FROM PiloteWHERE brevet = PL-2)

4055_04_C04 Page 133 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

134 copy Eacuteditions Eyrolles

Sous-interrogations multilignes (IN ALL et ANY)

Les opeacuterateurs multilignes sont les suivants

bull IN compare un eacuteleacutement agrave une donneacutee quelconque drsquoune liste rameneacutee par la sous-interro-gation Cet opeacuterateur est utiliseacute pour les eacutequijointures et les autojointures (et les intersec-tions) Lrsquoopeacuterateur NOT IN sera employeacute pour les jointures externes (et les diffeacuterences)

bull ANY compare lrsquoeacuteleacutement agrave chaque donneacutee rameneacutee par la sous-interrogation Lrsquoopeacuterateurlaquo =ANY raquo eacutequivaut agrave IN Lrsquoopeacuterateur laquo ltANY raquo signifie laquo infeacuterieur agrave au moins une desvaleurs raquo donc laquo infeacuterieur au maximum raquo Lrsquoopeacuterateur laquo gtANY raquo signifie laquo supeacuterieur agrave aumoins une des valeurs raquo donc laquo supeacuterieur au minimum raquo

bull ALL compare lrsquoeacuteleacutement agrave tous ceux rameneacutes par la sous-interrogation Lrsquoopeacuterateur laquo ltALL raquosignifie laquo infeacuterieur au minimum raquo et laquo gtALL raquo signifie laquo supeacuterieur au maximum raquo

Le tableau suivant deacutetaille quelques sous-interrogations multilignes Le dernier exempleprogramme une partie drsquoune jointure externe

La directive NOT IN doit ecirctre utiliseacutee avec prudence car elle retourne faux si un membrerameneacute par la sous-interrogation est NULL

Tableau 4-41 Sous-interrogations multilignes

Opeacuterateur Besoin Requecircte

IN R2 Coordonneacutees des compagnies qui embauchent des pilotes de moins de 500 heures de vol

SELECT nomComp nrue rue ville FROM Compagnie WHERE comp (

= et IN R4 Somme des heures de vol des pilotes placeacutes sous la responsabiliteacute des chefs pilotes de la compagnie de nom Air France

SELECT SUM(nbHVol) FROM Pilote WHERE chefPil ( )

NOT IN Compagnies nrsquoayant pas de pilote SELECT nomComp nrue rue ville FROM Compagnie WHERE comp

Web

INSELECT compa FROM Pilote

WHERE nbHVol lt 500)

INSELECT brevet FROM PiloteWHERE compa =

(SELECT comp FROM CompagnieWHERE nomComp = Air France)

NOT IN(SELECT compa FROM PiloteWHERE compa IS NOT NULL)

4055_04_C04 Page 134 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 135

chapitre ndeg 4 Interrogation des donneacutees

Afin drsquoillustrer les opeacuterateurs ANY et ALL consideacuterons la table suivante Nous avons indiqueacuteen gras les nombres drsquoheures minimal et maximal des A320 en griseacute les nombres drsquoheuresminimal et maximal des avions de la compagnie AF

Le tableau suivant deacutetaille quelques jointures proceacutedurales utilisant les opeacuterateurs ALL etANY

Figure 4-17 Table Avion

Avions

immat typeAv nbHVol compa

A1 A320 1000 AF A2 A330 1500 AF A3 A320 550 SING A4 A340 1800 SING A5 A340 200 AF A6 A330 100 AF

Tableau 4-42 Opeacuterateurs ALL et ANY

Opeacuterateur Besoin Requecircte et reacutesultat

ANY R11 Avions dont le nombre drsquoheures de vol est infeacuterieur agrave celui de nrsquoimporte quel A320

SELECT immat typeAv nbHVol FROM Avion WHERE nbHVol +-------+--------+--------+| immat | typeAv | nbHVol |+-------+--------+--------+| A3 | A320 | 55000 || A5 | A340 | 20000 || A6 | A330 | 10000 |+-------+--------+--------+

R12 Compagnies et leurs avions dont le nombre drsquoheures de vol est supeacute-rieur agrave celui de nrsquoimporte quel avion de la compagnie de code SING

SELECT immat typeAv nbHVol compa FROM Avion WHERE nbHVol +-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A1 | A320 | 100000 | AF || A2 | A330 | 150000 | AF || A4 | A340 | 180000 | SING |+-------+--------+---------+-------+

lt ANY(SELECT nbHVol FROM AvionWHERE typeAv=A320)

gt ANY(SELECT nbHVol FROM AvionWHERE compa = SING)

4055_04_C04 Page 135 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

136 copy Eacuteditions Eyrolles

Jointures mixtes

Une jointure mixte combine des clauses de jointures relationnelles proceacutedurales (avec dessous-interrogations) ou des clauses de jointures SQL2

Jointure relationnelle proceacutedurale

La jointure mixte suivante combine une clause de jointure relationnelle (en gras) avec unejointure proceacutedurale (en surligneacute) pour programmer la requecircte R4

SELECT SUM(p1nbHVol)

FROM Pilote p1 Pilote p2

WHERE p1chefPil = p2brevet

AND

Ce type drsquoeacutecriture peut ecirctre inteacuteressant srsquoil nrsquoest pas neacutecessaire drsquoafficher des colonnes destables preacutesentes dans les sous-interrogations ou si lrsquoon deacutesire appliquer des fonctions agrave desregroupements

ALL R13 Avions dont le nombre drsquoheures de vol est infeacuterieur agrave tous les A320

SELECT immat typeAv nbHVol FROM Avion WHERE nbHVol +-------+--------+--------+| immat | typeAv | nbHVol |+-------+--------+--------+| A5 | A340 | 20000 || A6 | A330 | 10000 |+-------+--------+--------+

R14 Compagnies et leurs avions dont le nombre drsquoheures de vol est supeacute-rieur agrave tous les avions de la compagnie de code AF

SELECT immat typeAv nbHVol compa FROM Avion WHERE nbHVol +-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A4 | A340 | 180000 | SING |+-------+--------+---------+-------+

Tableau 4-42 Opeacuterateurs ALL et ANY (suite)

Opeacuterateur Besoin Requecircte et reacutesultat

lt ALL(SELECT nbHVol FROM AvionWHERE typeAv=A320)

gt ALL(SELECT nbHVol FROM AvionWHERE compa = AF)

p2compa = (SELECT comp FROM Compagnie WHERE nomComp =

Air France)

4055_04_C04 Page 136 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 137

chapitre ndeg 4 Interrogation des donneacutees

Sous-interrogation dans la clause FROM

Introduite dans SQL2 la possibiliteacute de construire dynamiquement une table dans la clauseFROM drsquoune requecircte est opeacuterationnelle sous MySQL

SELECT listeColonnes

FROM table1 aliasTable1 (SELECThellip FROM table2 WHEREhellip) aliasTable2

[ WHERE (conditionsTable1etTable2) ]

Consideacuterons la table suivante Le but est drsquoextraire le pourcentage partiel de pilotes parcompagnie Dans notre exemple il y a 5 pilotes dont 3 deacutependent de AF Pour cette compa-gnie le pourcentage partiel de pilotes est de 35 soit 60

La requecircte suivante construit dynamiquement deux tables (alias a et b) dans la clause FROMpour reacutepondre agrave cette question

Sous-interrogations synchroniseacutees

Une sous-interrogation est synchroniseacutee si elle manipule des colonnes drsquoune table du niveausupeacuterieur Une sous-interrogation synchroniseacutee est exeacutecuteacutee une fois pour chaque enregistre-

Figure 4-18 Table Pilote

Pilote

brevet nom nbHVol compa

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings

Tableau 4-43 SELECT dans un FROM

Requecircte et tables eacutevalueacutees dans le FROM Reacutesultat

SELECT acompa Comp anbpilbtotal100 Pilote FROM a b +------+---------+

| Comp | Pilote |+------+---------+| NULL | 200000 || AF | 600000 || SING | 200000 |+------+---------+

(SELECT compa COUNT() nbpilFROM Pilote GROUP BY compa)

(SELECT COUNT() total FROM Pilote)

a

compa nbpil

AF 3

SING 1

1

b

total

5

4055_04_C04 Page 137 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

138 copy Eacuteditions Eyrolles

ment extrait par la requecircte de niveau supeacuterieur Cette technique peut ecirctre aussi utiliseacutee dans lesordres UPDATE et DELETE La forme geacuteneacuterale drsquoune sous-interrogation synchroniseacutee est lasuivante Les alias des tables sont utiles pour pouvoir manipuler des colonnes de tables dediffeacuterents niveaux

Une sous-interrogation synchroniseacutee peut ramener une ou plusieurs lignes Diffeacuterents opeacutera-teurs peuvent ecirctre employeacutes (= gt lt gt= lt= EXISTS)

Opeacuterateur matheacutematique

Le tableau suivant deacutetaille un exemple drsquoopeacuterateur matheacutematique appliqueacute agrave une sous-interro-gation synchroniseacutee

Opeacuterateur EXISTS

Lrsquoopeacuterateur EXISTS permet drsquointerrompre la sous-interrogation degraves le premier enregistrementtrouveacute La valeur FALSE est retourneacutee si aucun enregistrement nrsquoest extrait par la sous-interro-gation

SELECT alias1c

FROM nomTable1 alias1

WHERE colonne(s) opeacuterateur (SELECT alias2zhellip

FROM nomTable2 alias2

WHERE alias1x opeacuterateur alias2y )

[AND ( conditionsTable1 )]

Tableau 4-44 Sous-interrogation synchroniseacutee

Besoin Requecircte et reacutesultat

R15 Avions dont le nombre drsquoheures de vol est supeacuterieur au nombre drsquoheures de vol moyen des avions de leur compagnie (ici 700 heures pour AF et 1115 heures pour SING)

SELECT avi1 FROM Avion avi1 WHERE avi1nbHVol

+-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A1 | A320 | 100000 | AF || A2 | A330 | 150000 | AF || A4 | A340 | 180000 | SING |+-------+--------+---------+-------+

gt(SELECT AVG(avi2nbHVol) FROM Avion avi2WHERE avi2compa = avi1compa)

4055_04_C04 Page 138 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 139

chapitre ndeg 4 Interrogation des donneacutees

Utilisons la table suivante pour deacutecrire lrsquoutilisation de lrsquoopeacuterateur EXISTS

La sous-interrogation synchroniseacutee est surligneacutee dans le script suivant

Opeacuterateur NOT EXISTS

Lrsquoopeacuterateur NOT EXISTS retourne la valeur TRUE si aucun enregistrement nrsquoest extrait par lasous-interrogation Cet opeacuterateur peut ecirctre utiliseacute pour eacutecrire des jointures externes

Figure 4-19 Utilisation de EXISTS

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings

Tableau 4-45 Opeacuterateur EXISTS

Besoin Requecircte et reacutesultat

R15 Pilotes ayant au moins un pilote sous leur responsabiliteacute

SELECT pil1brevet pil1nom pil1compa FROM Pilote pil1 WHERE

+--------+--------------+-------+| brevet | nom | compa |+--------+--------------+-------+| PL-4 | Henri Alquieacute | AF |+--------+--------------+-------+

WebEXISTS

(SELECT pil2 FROM Pilote pil2WHERE pil2chefPil = pil1brevet)

Tableau 4-46 Opeacuterateur NOT EXISTS

Besoin Requecircte et reacutesultat

Liste des compagnies nrsquoayant pas de pilote

SELECT cpg FROM Compagnie cpg WHERE NOT EXISTS

+------+------+-------------+---------+-------------+| comp | nrue | rue | ville | nomComp |+------+------+-------------+---------+-------------+| CAST | 1 | G Brassens | Blagnac | Castanet AL |+------+------+-------------+---------+-------------+

(SELECT compa FROM PiloteWHERE compa = cpgcomp)

4055_04_C04 Page 139 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

140 copy Eacuteditions Eyrolles

Autres directives SQL2

Eacutetudions enfin les autres options des jointures SQL2 (NATURAL JOIN USING et CROSSJOIN)

Consideacuterons le scheacutema suivant (des colonnes portent le mecircme nom) La colonne typeAvdans la table Navigant deacutesigne le type drsquoappareil sur lequel le pilote est instructeur

Opeacuterateur NATURAL JOIN

La jointure naturelle est programmeacutee par la clause NATURAL JOIN La clause de jointure estautomatiquement construite sur la base de toutes les colonnes portant le mecircme nom entre lesdeux tables

Les concepteurs devraient ainsi penser agrave nommer drsquoune maniegravere semblable cleacutes primaires etcleacutes eacutetrangegraveres Ce principe nrsquoest pas souvent appliqueacute aux bases volumineuses

Le tableau suivant deacutetaille deux eacutecritures possibles drsquoune jointure naturelle La clause de join-ture est baseacutee sur les colonnes (brevet typeAv) Une clause WHERE aurait pu aussi ecirctreprogammeacutee

Figure 4-20 Deux tables agrave mettre en jointure naturelle

Navigant

brevet nom nbHVol typeAv

PL-1 Pierre Lamothe 450 PL-2 Didier Linxe 900 A320 PL-3 Henri Alquieacute 3400 A380

VolsControle

brevet typeAv validite

PL-1 A320 2005-06-24 PL-2 A320 2006-04-04 PL-2 A330 2006-05-13 PL-3 A380 2007-07-20 PL-3 A320 2005-03-12

Tableau 4-47 Jointures naturelles

Besoin Jointures SQL2 et reacutesultat

Navigants qualifieacutes sur un type drsquoappareil et instructeurs sur ce mecircme type

SELECT brevet nom typeAv validite FROM Naviguant --eacutequivalent agraveSELECT brevet nom typeAv validite FROM VolsControle

NATURAL JOIN VolsControle

NATURAL JOIN Naviguant

4055_04_C04 Page 140 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 141

chapitre ndeg 4 Interrogation des donneacutees

Opeacuterateur USING

La directive USING(col1 col2hellip) de la clause JOIN programme une jointure naturelle res-treinte agrave un ensemble de colonnes Il ne faut pas utiliser drsquoalias de tables dans la liste descolonnes

Dans notre exemple on peut restreindre la jointure naturelle aux colonnes brevet outypeAv Si on les positionnait (brevet typeAv) dans la directive USING cela reviendraitagrave construire un NATURAL JOIN Le tableau suivant deacutetaille deux eacutecritures drsquoune jointurenaturelle restreinte

Opeacuterateur CROSS JOIN

La directive CROSS JOIN programme un produit carteacutesien qursquoon peut restreindre dans laclause WHERE

+--------+--------------+--------+------------+| brevet | nom | typeAv | validite |+--------+--------------+--------+------------+| PL-2 | Didier Linxe | A320 | 2006-04-04 || PL-3 | Henri Alquieacute | A380 | 2007-07-20 |+--------+--------------+--------+------------+

Tableau 4-47 Jointures naturelles (suite)

Besoin Jointures SQL2 et reacutesultat

Tableau 4-48 Jointures naturelles restreintes

Besoin Jointures SQL2 et reacutesultat

Nom des navigants avec leurs qualifications et dates de validiteacute

SELECT nom vtypeAv vvalidite FROM Naviguant

SELECT nom vtypeAv vvalidite FROM VolsControle v

+----------------+--------+------------+| nom | typeAv | validite |+----------------+--------+------------+| Pierre Lamothe | A320 | 2005-06-24 || Didier Linxe | A320 | 2006-04-04 || Didier Linxe | A330 | 2006-05-13 || Henri Alquieacute | A380 | 2007-07-20 || Henri Alquieacute | A320 | 2005-03-12 |+----------------+--------+------------+

WebJOIN VolsControle v USING(brevet)

JOIN Naviguant USING(brevet)

4055_04_C04 Page 141 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

142 copy Eacuteditions Eyrolles

Le tableau suivant preacutesente deux eacutecritures drsquoun produit carteacutesien (seul lrsquoordre drsquoaffichage descolonnes change)

Division

La division est un opeacuterateur algeacutebrique et non ensembliste Cet opeacuterateur est semblable sur leprincipe agrave lrsquoopeacuteration qursquoon apprend au CM2 (oublieacutee plus tard en terminale agrave cause descalculettes) La division est un opeacuterateur binaire comme la jointure car il srsquoagit de diviser unetable (ou partie de) par une autre table (ou partie de) Il est possible drsquoopeacuterer une division agravepartir drsquoune seule table en ce cas on divise deux parties de cette table (analogue aux autojoin-tures)

Lrsquoopeacuterateur de division nrsquoest pas fourni par MySQL (ni par aucun de ses concurrents drsquoailleurs)Il nrsquoexiste donc malheureusement pas drsquoinstruction DIVIDE

Est-ce la complexiteacute ou le manque drsquointeacuterecirct qui freinent les eacutediteurs de logiciels agrave programmerce concept La question reste en suspens alors si vous avez un avis agrave ce sujet faites-moi signe

Cet opeacuterateur permet de traduire le terme laquo pour tous les raquo des requecirctes qursquoon deacutesire pro-grammer en SQL

On peut aussi dire que lorsque vous voulez comparer un ensemble avec un groupe de reacutefeacute-rence il faut programmer une division

La division peut se programmer sous MySQL agrave lrsquoaide drsquoune diffeacuterence (NOT IN) et la fonctionNOT EXISTS

Tableau 4-49 Produit carteacutesien

Besoin Jointures SQL2 et reacutesultat

Combinaison de toutes les lignes des deux tables

SELECT FROM Naviguant -- eacutequivalent agraveSELECT FROM VolsControle

+--------+----------------+---------+--------+--------+--------+------------+| brevet | nom | nbHVol | typeAv | brevet | typeAv | validite |+--------+----------------+---------+--------+--------+--------+------------+| PL-1 | Pierre Lamothe | 45000 | NULL | PL-1 | A320 | 2005-06-24 || PL-2 | Didier Linxe | 90000 | A320 | PL-1 | A320 | 2005-06-24 || PL-3 | Henri Alquieacute | 340000 | A380 | PL-1 | A320 | 2005-06-24 || PL-1 | Pierre Lamothe | 45000 | NULL | PL-2 | A320 | 2006-04-04 |15 rows in set

WebCROSS JOIN VolsControle

CROSS JOIN Naviguant

4055_04_C04 Page 142 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 143

chapitre ndeg 4 Interrogation des donneacutees

La figure suivante illustre lrsquoopeacuterateur de division dans sa plus simple expression (je ne parlepas du contenu des tables bien sucircrhellip) Le scheacutema fait plus apparaicirctre le deuxiegraveme aspect reacuteveacute-lateur eacutenonceacute ci-avant agrave savoir comparer un ensemble (la table T1) avec un ensemble de reacutefeacute-rence (la table T2)

Deacutefinition

La division de la table T1[a1anb1bn] par la table T2[b1bn] (la structure de T2 estincluse dans la structure de T1) donne la table T3[a1an] qui contient les enregistrements tiveacuterifiant ti isin T3 (de structure [a1an]) tj isin T2 (tj de structure [b1bn]) et titj isin T1 (titj destructure [a1anb1bn])

Classification

Consideacuterons lrsquoexemple suivant pour deacutecrire la requecircte agrave construire Il srsquoagit de reacutepondre agrave laquestion laquo Quels sont les avions affreacuteteacutes par toutes les compagnies franccedilaises raquo Lrsquoensem-ble de reacutefeacuterence (A) est constitueacute des codes des compagnies franccedilaises Lrsquoensemble agrave compa-rer (B) est formeacute des codes des compagnies pour chaque avion

Deux cas sont agrave envisager suivant la maniegravere de comparer les deux ensembles

Division inexacte (le reste nrsquoest pas nul) un ensemble est seulement inclus dans un autre(A isin B) La question agrave programmer serait laquo Quels sont les avions affreacuteteacutes par toutes lescompagnies franccedilaises raquo sans preacuteciser si les avions ne doivent pas ecirctre aussi affreacuteteacutes pardes compagnies eacutetrangegraveres Lrsquoavion (A3 Mercure) reacutepondrait agrave cette question que laderniegravere ligne de la table Affretements soit preacutesente ou pas

Division exacte (le reste est nul) les deux ensembles sont eacutegaux (B=A) La question agraveprogrammer serait laquo Quels sont les avions affreacuteteacutes exactement (ou uniquement) partoutes les compagnies franccedilaises raquo Lrsquoavion (A3 Mercure) reacutepondrait agrave cette questionsi la derniegravere ligne de la table Affretements eacutetait inexistante Les lignes concerneacuteesdans les deux tables sont griseacutees

Figure 4-21 Division

T1

Jospin Juppeacute Juppeacute Baudis Baudis Baudis Chirac Chirac Chirac

T2

Quotient

Chirac

Quels sont les enregistrements de T1 qui sont associeacutes agrave laquo tous les raquo enregistrements de T2 Reacuteponse Chirac

Quotient=(T1ndashReste)T2(ici Reste nrsquoest pas nul)

4055_04_C04 Page 143 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

144 copy Eacuteditions Eyrolles

Lrsquoopeacuterateur de diffeacuterence (programmeacute avec NOT IN) combineacute agrave la fonction EXISTS permetde programmer ces deux comparaisons (un ensemble inclus dans un autre et une eacutegaliteacutedrsquoensembles) Il existe drsquoautres solutions agrave base de regroupements et de sous-interrogations(synchroniseacutees ou pas) que nous nrsquoeacutetudierons pas parce qursquoelles me semblent plus compli-queacutees Eacutecrivons agrave preacutesent ces deux divisions agrave lrsquoaide de requecirctes SQL

Division inexacte

Pour programmer le fait qursquoun ensemble est seulement inclus dans un autre (ici A sub B) il fautqursquoil nrsquoexiste pas drsquoeacuteleacutement dans lrsquoensemble A-B La diffeacuterence se programme agrave lrsquoaide delrsquoopeacuterateur NOT IN lrsquoinexistence drsquoeacuteleacutement se programme agrave lrsquoaide de la fonction NOTEXISTS comme le montre la requecircte suivante

Division exacte

Pour programmer le fait qursquoun ensemble est strictement eacutegal agrave un autre (ici A=B) il faut qursquoilnrsquoexiste ni drsquoeacuteleacutement dans lrsquoensemble A-B ni dans lrsquoensemble B-A La traduction matheacute-matique est la suivante A=BhArr(A-B=empty et B-A=empty) Les opeacuterateurs se programment de lamecircme maniegravere que pour la requecircte preacuteceacutedente Le laquo et raquo se programme avec un AND

Figure 4-22 Divisions agrave programmer

Web

Affretements

immat typeAv compa dateAff

A1 A320 SING 1965-05-13 A2 A340 AF 1968-06-22 A3 Mercure AF 1965-02-05A4 A330 ALIB 1965-01-16

A3 Mercure ALIB 1942-03-05 A3 Mercure SING 1987-03-01

Compagnie

comp nomComp pays

AF Air France FALIB Air Lib F SING Singapore AL SG

Reacutesultat

immat typeAv

A3 Mercure

SELECT DISTINCT immat typeAv FROM Affretements aliasAff

WHERE NOT EXISTS

(SELECT DISTINCT comp FROM Compagnie WHERE pays = F

AND comp NOT IN

(SELECT compa FROM Affr etements WHERE immat = aliasAffimmat ))

Ensemble A de reacutefeacuterence

Ensemble B agrave comparer

Parcours de tous les avions

4055_04_C04 Page 144 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 145

chapitre ndeg 4 Interrogation des donneacutees

Reacutesulats en HTML ou XML

Les options laquo --html raquo et laquo --xml raquo (eacutetudieacutees dans lrsquointroduction) permettent de formater lereacutesultat des extractions au standard du Web Cela peut ecirctre inteacuteressant si vous voulez rapide-ment publier des pages (qui seront statiques bien sucircr) ou composer des fichiers destineacutes agravelrsquoeacutechange de donneacutees provenant de votre base Ainsi la requecircte preacuteceacutedente fournira les eacutetats desortie suivants Concernant XML la balise de plus haut niveau contient un attribut deacutecrivantla requecircte

SELECT DISTINCT immat typeAv FROM Affregravetements aliasAff WHERE NOT EXISTS (SELECT comp FROM Compagnie WHERE pays = F AND comp NOT IN (SELECT compa FROM Affretements WHERE immat = aliasAffimmat )) AND NOT EXISTS (SELECT compa FROM Affretements WHERE immat = aliasAffimmat AND compa NOT IN (SELECT comp FROM Compagnie WHERE pays = F ))

A-B

Parcours de tous les avions

B-A

Tableau 4-50 Reacutesultats formateacutes pour le Web

Connexion avec --hmtl Connexion avec --xml

ltTABLE BORDER=1gtltTRgtltTHgtimmatltTHgtltTHgttypeAvltTHgtltTRgtltTRgtltTDgtA3ltTDgtltTDgtMercureltTDgtltTRgtltTABLEgt

ltresultset statement=SELECT DISTINCT immat typeAv FROM Affretements alia-sAff WHERE NOT EXISTS (SELECT comp FROM Compagnie WHERE pays = F AND comp NOT IN (SELECT compa FROM Affre-tements WHERE immat = alia-sAffimmat)) AND NOT EXISTS (SELECT compa FROM Affretements WHERE immat = aliasAffimmat AND compa NOT IN (SELECT comp FROM Compagnie WHERE pays = F))gt ltrowgt ltfield name=immatgtA3ltfieldgt ltfield name=typeAvgtMercureltfieldgt ltrowgtltresultsetgt

Web

4055_04_C04 Page 145 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

146 copy Eacuteditions Eyrolles

Eacutecriture dans un fichier

Meacutecanisme inverse agrave LOAD DATA INFILE eacutetudieacute au chapitre 2 lrsquoexportation de donneacutees (auformat de fichiers) extraites agrave lrsquoaide drsquoune requecircte peut ecirctre programmeacutee agrave lrsquoaide de la direc-tive INTO OUTFILE de lrsquoinstruction SELECT Une telle requecircte eacutecrit dans un fichier dans unreacutepertoire du serveur Le privilegravege FILE est requis Le fichier cible doit ecirctre inexistant avantdrsquoexeacutecuter son chargement La syntaxe simplifieacutee de cette directive est la suivante

SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes

FROM nomTable1 [nomTable2] [ WHERE condition ]

FIELDS deacutecrit comment seront formateacutees dans le fichier les colonnes extraites de(s)table(s) En lrsquoabsence de cette clause TERMINATED BY vaut t ENCLOSED BY vaut et ESCAPED BY vaut ndash FIELDS TERMINATED BY deacutecrit le caractegravere qui seacutepare deux valeurs de colonnesndash FIELDS ENCLOSED BY permet de controcircler le caractegravere qui encadrera chaque valeur

de colonnendash FIELDS ESCAPED BY permet de controcircler les caractegraveres speacuteciaux

LINES deacutecrit comment seront eacutecrites dans le fichier les lignes extraites de(s) table(s) Enlrsquoabsence de cette clause TERMINATED BY vaut n et STARTING BY vaut

Creacuteons le fichier laquo pilotestxt raquo situeacute dans le reacutepertoire laquo Ddev raquo en exportant la tota-liteacute des enregistrements de la table Pilote (SELECT ) deacutecrite au deacutebut du chapitre Lefichier est ensuite ouvert agrave lrsquoaide du WordPad Notez lrsquoutilisation du double laquo raquo pour deacutesi-gner une arborescence Windows Le caractegravere NULL est exporteacute par le caractegravere laquo N raquo

Figure 4-23 Creacuteation drsquoun fichier

INTO OUTFILE cheminEtNomFichier

[FIELDS [TERMINATED BY string]

[[OPTIONALLY] ENCLOSED BY char]

[ESCAPED BY char ] ]

[LINES [STARTING BY string]

[TERMINATED BY string] ]

SELECT INTO OUTFILE Ddevpilotestxt FIELDS TERMINATED BY ENCLOSED BY

FROM Pilote LINES STARTING BY import-Pilote TERMINATED BY $n

4055_04_C04 Page 146 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 147

chapitre ndeg 4 Interrogation des donneacutees

Exercices

Les objectifs de ces exercices sont

de creacuteer dynamiquement des tables et leurs donneacutees

drsquoeacutecrire des requecirctes monotables et multitables

de reacutealiser des modifications synchroniseacutees

de composer des jointures et des divisions

41 Creacuteation dynamique de tables

Eacutecrire le script creacuteaDynamiquesql permettant de creacuteer les tables Softs et PCSeuls suivan-tes (en utilisant la directive AS SELECT de la commande CREATE TABLE) Vous ne poserezaucune contrainte sur ces tables Penser agrave modifier le nom des colonnes

La table Softs sera construite sur la base de tous les enregistrements de la table Logiciel quevous avez creacuteeacutee et alimenteacutee preacuteceacutedemment La table PCSeuls doit seulement contenir les enregis-trements de la table Poste qui sont de type PCWS ou PCNT Veacuterifier

SELECT FROM Softs

SELECT FROM PCSeuls

42 Requecirctes monotables

Eacutecrire le script requecirctessql permettant drsquoextraire agrave lrsquoaide drsquoinstructions SELECT les donneacuteessuivantes

1 Type du poste p8

2 Noms des logiciels UNIX

3 Noms adresses IP numeacuteros de salle des postes de type UNIX ou PCWS

4 Mecircme requecircte pour les postes du segment 13012080 trieacutes par numeacuteros de salles deacutecroissants

5 Numeacuteros des logiciels installeacutes sur le poste p6

6 Numeacuteros des postes qui heacutebergent le logiciel log1

7 Noms et adresses IP complegravetes (ex 1301208001) des postes de type TX (utiliser la fonctionde concateacutenation)

Figure 4-24 Structures des nouvelles tables

SoftsnomSoft version prix

PCSeulsnP nomP seg ad typeP salle

4055_04_C04 Page 147 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

148 copy Eacuteditions Eyrolles

43 Fonctions et groupements

8 Pour chaque poste le nombre de logiciels installeacutes (en utilisant la table Installer)

9 Pour chaque salle le nombre de postes (agrave partir de la table Poste)

10 Pour chaque logiciel le nombre drsquoinstallations sur des postes diffeacuterents

11 Moyenne des prix des logiciels UNIX

12 Plus reacutecente date drsquoachat drsquoun logiciel

13 Numeacuteros des postes heacutebergeant 2 logiciels

14 Nombre de postes heacutebergeant 2 logiciels (utiliser la requecircte preacuteceacutedente en faisant un SELECTdans la clause FROM)

44 Requecirctes multitables

Opeacuterateurs ensemblistes

15 Types de postes non recenseacutes dans le parc informatique (utiliser la table Types)

16 Types existant agrave la fois comme types de postes et de logiciels

17 Types de postes de travail nrsquoeacutetant pas des types de logiciels

Jointures proceacutedurales

18 Adresses IP complegravetes des postes qui heacutebergent le logiciel log6

19 Adresses IP complegravetes des postes qui heacutebergent le logiciel de nom Oracle 8

20 Noms des segments posseacutedant exactement trois postes de travail de type TX

21 Noms des salles ou lrsquoon peut trouver au moins un poste heacutebergeant le logiciel Oracle 6

22 Nom du logiciel acheteacute le plus reacutecent (utiliser la requecircte 12)

Jointures relationnelles

Eacutecrire les requecirctes 18 19 20 21 avec des jointures de la forme relationnelle Numeacuteroter ces nouvellesrequecirctes de 23 agrave 26

27 Installations (nom segment nom salle adresse IP complegravete nom logiciel date drsquoinstallation) trieacuteespar segment salle et adresse IP

Jointures SQL2

Eacutecrire les requecirctes 18 19 20 21 avec des jointures SQL2 (JOIN NATURAL JOIN JOIN USING)Numeacuteroter ces nouvelles requecirctes de 28 agrave 31

4055_04_C04 Page 148 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 149

chapitre ndeg 4 Interrogation des donneacutees

45 Modifications synchroniseacutees

Eacutecrire le script modifSynchroniseacuteessql pour ajouter les lignes suivantes dans la tableInstaller

Eacutecrire les requecirctes UPDATE synchroniseacutees de la forme suivante

UPDATE table1 alias1

SET colonne = (

Pour mettre agrave jour automatiquement les colonnes rajouteacutees

bull nbSalle dans la table Segment (nombre de salles traverseacutees par le segment)

bull nbPoste dans la table Segment (nombre de postes du segment)

bull nbInstall dans la table Logiciel (nombre drsquoinstallations du logiciel)

bull nbLog dans la table Poste (nombre de logiciels installeacutes par poste)

Veacuterifier le contenu des tables modifieacutees (Segment Logiciel et Poste)

46 Opeacuterateurs existentiels

Rajouter au script requecirctessql les instructions SELECT pour extraire les donneacutees suivantes

Sous-interrogation synchroniseacutee

32 Noms des postes ayant au moins un logiciel commun au poste p6 (on doit trouver les postes p2p8 et p10)

Divisions

33 Noms des postes ayant les mecircmes logiciels que le poste p6 (les postes peuvent avoir plus de logi-ciels que p6) On doit trouver les postes p2 et p8 (division inexacte)

34 Noms des postes ayant exactement les mecircmes logiciels que le poste p2 (division exacte) on doittrouver p8

Figure 4-25 Lignes agrave ajouter

Installer nPoste nLog numIns dateIns delai

p2 log6 SYSDATE() NULL p8 log1 SYSDATE () NULL p10 log1

seacutequence

SYSDATE () NULL

SELECT COUNT()

FROM table2 alias2

WHERE alias2colonneA = alias1colonneB)

4055_04_C04 Page 149 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

151

Chapitre 5

Controcircle des donneacutees

Comme dans tout systegraveme multi-utilisateur lrsquousager drsquoun SGBD doit ecirctre identifieacute avant depouvoir utiliser des ressources Les accegraves aux informations et agrave la base de donneacutees doivent ecirctrecontrocircleacutes agrave des fins de seacutecuriteacute et de coheacuterence La figure suivante illustre un groupe drsquoutilisa-teurs dans lequel existe une classification entre ceux qui peuvent consulter mettre agrave joursupprimer des enregistrements voire les tables

Nous verrons dans cette section les aspects du langage SQL qui concernent le controcircle desdonneacutees et des accegraves Nous eacutetudierons

la gestion des utilisateurs qui manipuleront des bases de donneacutees dans lequelles se trouventdes objets tels que des tables index seacutequences (pour lrsquoinstant impleacutementeacutees par des colon-nes

AUTO_INCREMENT

) vues proceacutedures etc

la gestion des privilegraveges qui permettent de donner des droits sur la base de donneacutees (privi-legraveges systegraveme) et sur les donneacutees de la base (privilegraveges objet)

la gestion des vues

lrsquoutilisation du dictionnaire des donneacutees (base de donneacutees

information_schema

)

Le chapitre 9 deacutetaille lrsquooutil graphique

MySQL Administrator

qui permet de srsquoaffranchirdrsquoeacutecrire des instructions SQL

Figure 5-1

Conseacutequences de lrsquoaspect multi-utilisateur

Peut creacuteer des pilotes

Peut consulter les vols

Peut supprimer un vol

Peut deacutetruire la base MySQLTCP-IP

4055_05_C05 Page 151 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

152

copy Eacuteditions Eyrolles

Gestion des utilisateurs

Preacutesenteacute rapidement agrave lrsquointroduction nous verrons qursquoun utilisateur (

user

) est identifieacute parMySQL par son nom et celui de la machine agrave partir de laquelle il se connecte Cela fait ilpourra acceacuteder agrave diffeacuterents objets (tables vues seacutequences index proceacutedures etc) drsquoune oude plusieurs bases sous reacuteserve drsquoavoir reccedilu un certain nombre de privilegraveges

Classification

Les types drsquoutilisateurs leurs fonctions et leur nombre peuvent varier drsquoune base agrave une autreNeacuteanmoins pour chaque base de donneacutees en activiteacute on peut classifier les utilisateurs de lamaniegravere suivante

Le DBA (

DataBase

Administrator

) Il en existe au moins un Une petite base peut nrsquoavoirqursquoun seul administrateur Une base importante peut en regrouper plusieurs qui se parta-gent les tacircches suivantes

ndash installation et mises agrave jour de la base et des outils eacuteventuels

ndash gestion de lrsquoespace disque et des espaces pour les donneacutees

ndash gestion des utilisateurs et de leurs objets (srsquoils ne les gegraverent pas eux-mecircmes)

ndash optimisation des performances

ndash sauvegardes restaurations et archivages

ndash contact avec le support technique

Lrsquoadministrateur reacuteseau (qui peut ecirctre le DBA) se charge de la configuration des couchesclient pour les accegraves distants

Les deacuteveloppeurs qui conccediloivent et mettent agrave jour la base Ils peuvent aussi agir sur leursobjets (creacuteation et modification des tables index seacutequences etc) Ils transmettent auDBA leurs demandes speacutecifiques (stockage optimisation seacutecuriteacute)

Les administrateurs drsquoapplication qui gegraverent les donneacutees manipuleacutees par la ou les applica-tions Pour les petites et les moyennes bases le DBA joue ce rocircle

Les utilisateurs qui se connectent et interagissent avec la base agrave travers les applications ouagrave lrsquoaide drsquooutils (interrogations pour la geacuteneacuteration de rapports ajouts modifications ousuppressions drsquoenregistrements)

Tous seront des utilisateurs (au sens MySQL) avec des privilegraveges diffeacuterents

Creacuteation drsquoun utilisateur (

CREATE USER

)

Pour pouvoir creacuteer un utilisateur vous devez posseacuteder le privilegravege

CREATE

USER

ou

INSERT

sur la base systegraveme

mysql

(car crsquoest la table

mysqluser

qui stockera lrsquoexistence de cenouvel arrivant)

4055_05_C05 Page 152 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

153

chapitre ndeg 5 Controcircle des donneacutees

La syntaxe de creacuteation drsquoun utilisateur est la suivante

CREATE USER

utilisateur

[IDENTIFIED BY [PASSWORD]

motdePasse

]

[

utilisateur2

[IDENTIFIED BY [PASSWORD]

motdePasse2

] ]

IDENTIFIED BY

motdePasse

permet drsquoaffecter un mot de passe (16 caractegraveres maximumsensibles agrave la casse) agrave un utilisateur (16 caractegraveres maximum sensibles aussi agrave la casse)

Le tableau suivant deacutecrit la creacuteation drsquoun utilisateur (agrave exeacutecuter en eacutetant connecteacute en local entant que

root

)

Par deacutefaut les utilisateurs une fois creacuteeacutes nrsquoont aucun droit sur aucune base de donneacutees (agrave parten lecture eacutecriture sur la base

test

et en lecture seule sur la base

information_schema

)La section

Privilegraveges

eacutetudie ces droits

Un utilisateur bien connu

Lors de lrsquoinstallation vous avez ducirc noter la preacutesence de lrsquoutilisateur

root

(mot de passe saisiagrave lrsquoinstallation) Cet utilisateur est le DBA que MySQL vous offre Il vous permettra drsquoeffec-tuer vos tacircches administratives en ligne de commande ou par une console graphique (creacuteer desutilisateurs par exemple)

Liste des utilisateurs

Agrave propos de

root

on le retrouve dans la table

user

de la base

mysql

(

mysqluser

)Lrsquoextraction des colonnes

User

et

Host

restitue la liste des utilisateurs connus du serveur Si

root

nrsquoavait pas seacutelectionneacute la base

mysql

la commande agrave exeacutecuter aurait eacuteteacute laquo

SELECTUserHost FROM mysqluser

raquo

(rootlocalhost) [mysql] mysqlgt SELECT UserHost FROM user

+--------+-----------+

| User | Host |

+--------+-----------+

| | |

| | localhost |

| root | localhost |

| soutou | localhost |

+--------+-----------+

Tableau 5-1 Creacuteation drsquoun utilisateur

Instruction SQL Reacutesultat

CREATE USER

soutoulocalhost IDENTIFIED BY iut

soutou

est deacuteclareacute laquo utilisateur agrave accegraves local raquo il devra se connecter agrave lrsquoaide de son mot de passe

4055_05_C05 Page 153 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

154

copy Eacuteditions Eyrolles

Vous devez posseacuteder une table similaire Il apparaicirct quatre accegraves potentiels Lrsquoutilisateur vide

correspond agrave une connexion anonyme La machine deacutesigneacutee par laquo

raquo indique que laconnexion est autoriseacutee agrave partir de tout site (en supposant qursquoun client MySQL est installeacute etqursquoil est relieacute au serveur par TCP-IP) La machine deacutesigneacutee par laquo

localhost

raquo speacutecifie quela connexion est autoriseacutee en local

Ici la table fait eacutetat que lrsquoaccegraves anonyme (restreint toutefois agrave la base

test

voir la section

Table

mysqldb

) est permis en local et agrave partir de tout site et que

soutou

comme

root

nepeuvent se connecter qursquoen local

Modification drsquoun utilisateur

Le mot de passe drsquoun utilisateur peut ecirctre modifieacute sans parler de privilegraveges Nous verrons plustard qursquoil est possible de restreindre le nombre de requecirctes (

SELECT

) de modifications(

UPDATE

) de connexions par heure et de connexions simultaneacutees agrave un serveur

Puisqursquoil nrsquoexiste pas de commande

ALTER USER

pour changer un mot de passe il faut doncmodifier la table

user

par la seule commande SQL capable de le faire

UPDATE

Lrsquoinstruction suivante modifie le mot de passe de lrsquoutilisateur

soutou

pour lrsquoaccegraves en localNotez lrsquoutilisation de la fonction

PASSWORD()

qui code le mot de passe agrave affecter agrave lacolonne

Password

de la table

user

Il est plus prudent drsquoutiliser ensuite

FLUSH PRIVI-LEGES

qui recharge les tables systegraveme de maniegravere agrave rendre la manipulation effective surlrsquoinstant (un peu comme un

COMMIT

sur des donneacutees)

UPDATE

mysqluser

WHERE User = soutou

AND Host = localhost

FLUSH

PRIVILEGES

Une fois cette modification reacutealiseacutee si soutou tente une connexion avec son ancien mot depasse il vient lrsquoerreur classique laquo ERROR 1045 (28000) Access denied for usersoutoulocalhost (using password xx) raquo (xx valant YES si soutou seconnecte avec son ancien mot de passe NO srsquoil nrsquoen donne pas)

Chaque utilisateur peut changer son propre mot de passe agrave lrsquoaide de cette instruction srsquoil en ale privilegravege Mais attention Le fait de lui donner ce droit (nous verrons plus loin comment lefaire) implique eacutegalement qursquoil puisse aussi modifier les mots de passe de ses copains ainsique celui du root

Renommer un utilisateur (RENAME USER)

Pour pouvoir renommer un utilisateur vous devez posseacuteder le privilegravege CREATE USER (ou leprivilegravege UPDATE sur la base de donneacutees mysql) La syntaxe SQL est la suivante

RENAME USER utilisateur TO nouveauNom

SET Password = PASSWORD(eyrolles)

4055_05_C05 Page 154 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 155

chapitre ndeg 5 Controcircle des donneacutees

Penser agrave speacutecifier lrsquoaccegraves complet agrave renommer (usermachine) Les privilegraveges et le mot depasse ne changent pas Le tableau suivant deacutecrit trois opeacuterations de renommage drsquoutilisateurs(qui reviennent drsquoailleurs agrave lrsquoeacutetat initial)

Suppression drsquoun utilisateur (DROP USER)

Pour pouvoir supprimer un utilisateur vous devez posseacuteder le privilegravege CREATE USER (ou leprivilegravege DELETE sur la base de donneacutees mysql) La syntaxe SQL est la suivante

DROP USER utilisateur [utilisateur2 ]

Il faut speacutecifier lrsquoaccegraves agrave eacuteliminer (usermachine) Tous les privilegraveges relatifs agrave cet accegravessont deacutetruits Si lrsquoutilisateur est connecteacute dans le mecircme temps sa suppression ne sera effectiveqursquoagrave la fin de sa (derniegravere) session

Aucune donneacutee drsquoaucune table que lrsquoutilisateur aura mis agrave jour durant toutes ses connexionsne sera supprimeacutee Il nrsquoy a pas de notion drsquoappartenance drsquoobjets (tables index proceacutedureetc) agrave un utilisateur Tout ceci est relatif agrave la base de donneacutees (database)

Pour supprimer le compte soutou en local la commande agrave lancer est

DROP USER

Gestion des bases de donneacutees

Abordeacutee briegravevement agrave lrsquointroduction une base de donneacutees (database) regroupe essentielle-ment des tables sur lesquelles lrsquoadministrateur affectera des autorisations agrave des utilisateursCette notion de database srsquoapparente plutocirct agrave celle de scheacutema (connu des utilisateursdrsquoOracle) Drsquoailleurs dans lrsquoinstruction de creacuteation les deux mots peuvent ecirctre utiliseacutes

Tableau 5-2 Renommer un utilisateur

Instruction SQL Commentaire

RENAME USER localhost TO localhost

Lrsquoaccegraves soutou en local est renommeacute christiansoutou en local

RENAME USER christiansoutoulocalhost TO christiansoutou

Lrsquoaccegraves christiansoutou en local est renommeacute christiansoutou en accegraves distant

RENAME USER TO

Lrsquoaccegraves est renommeacute complegravetement

soutouchristiansoutou

1945322712

christiansoutou1945322712soutoulocalhost

soutoulocalhost

4055_05_C05 Page 155 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

156 copy Eacuteditions Eyrolles

Creacuteation drsquoune base (CREATE DATABASE)

Pour pouvoir creacuteer une base de donneacutees vous devez posseacuteder le privilegravege CREATE sur lanouvelle base (ou au niveau global pour creacuteer toute table)CREATE DATABASE | SCHEMA [IF NOT EXISTS] nomBase

[ [DEFAULT] CHARACTER SET nomJeu ]

[ [DEFAULT] COLLATE nomCollation ]

IF NOT EXISTS eacutevite une erreur dans le cas ougrave la base de donneacutees existe deacutejagrave (auquelcas elle ne sera pas remplaceacutee)

nomBase deacutesigne le nom de la base (64 caractegraveres maximum caractegraveres compris par lesystegraveme de gestion de fichier du systegraveme drsquoexploitation notamment respectant les regraveglesde nommage des reacutepertoires) Les caractegraveres laquo raquo laquo raquo ou laquo raquo sont proscrits

CHARACTER SET indique le jeu de caractegraveres associeacute aux donneacutees qui reacutesideront dans lestables de la base

COLLATE deacutefinit la collation1 du jeu de caractegraveres en question La collation dans le jargoninformatique permet de deacutefinir la position des caractegraveres dans le jeu Par exemple il serapossible de diffeacuterencier laquo agrave raquo de laquo a raquo ou pas (sensibiliteacute diacritique) Le but eacutetant desrsquoadapter aux diffeacuterentes regravegles et langues de notre petite planegravete

Une fois creacuteeacutee vous constaterez lrsquoexistence drsquoun reacutepertoire portant le nom de votre nouvellebase (par deacutefaut sous CProgram FilesMySQLMySQL Server 5ndatanouvel-leBase dans le cas de Windows) Ce reacutepertoire contiendra les donneacutees des tables qui serontconstitueacutees dans la nouvelle base Si vous concevez manuellement un reacutepertoire (mkdir rep1par exemple) dans le reacutepertoire de data de MySQL rep1 sera consideacutereacute comme une base dedonneacutees avec le jeu de caractegraveres par deacutefaut (visible avec laquo SHOW DATABASES raquo)

Nrsquoeffacez pas le fichier dbopt qui stocke les caracteacuteristiques de la base Vous pouvezlrsquoouvrir avec un eacutediteur de texte pour connaicirctre le jeu de caractegraveres par deacutefaut que MySQLaffectera agrave vos bases en lrsquoabsence de clause CHARACTER SET Souhaitons que ce ne soit pasgb2312 associeacute par deacutefaut agrave la collation gb2312_chinese_ci qui vous ferait dire que jevous parle chinois Crsquoest pourtant quelquefois ce que je ressens quand mes eacutetudiants meregardent avec des yeux de poisson en utilisant le langage des carpeshellip

Le tableau suivant deacutecrit la creacuteation de deux bases de donneacutees

1 Action de comparer entre eux des textes des documents Petit Larousse

Tableau 5-3 Creacuteation de bases

Instruction SQL Reacutesultat

CREATE DATABASE bdnouvelle DEFAULT CHARACTER SET ascii COLLATE ascii_general_ci

La base bdnouvelle est creacuteeacutee le jeu de caractegraveres par deacutefaut est ASCII

CREATE DATABASE bdnouvelle2 DEFAULT CHARACTER SET gb2312

La base bdnouvelle2 est creacuteeacutee pour les Chinois

4055_05_C05 Page 156 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 157

chapitre ndeg 5 Controcircle des donneacutees

Le jeu de caractegraveres par deacutefaut est deacutefini dans myini agrave lrsquoaide de la variable default-character-set Il est donc possible de creacuteer des bases de donneacutees associeacutees agrave diffeacuterentsjeux de caractegraveres au sein drsquoun mecircme serveur Le jeu de caractegraveres drsquoune base deacutefinit celui destables qui seront constitueacutees dedans agrave moins que la table ne soit combineacutee agrave un autre jeu (creacuteeacuteavec la directive [DEFAULT] CHARACTER SET jeu [COLLATE nomCollation])

Notons enfin qursquoil est mecircme possible drsquoaffecter un jeu de caractegraveres agrave une colonne drsquounetable Lrsquoexemple suivant construit la table testChap5 dans la base bdnouvelle2 (pardeacutefaut chinoise) en speacutecifiant que la colonne col1 sera associeacutee au jeu cp850 DOS WestEuropean tandis que le reste de la table (pour lrsquoinstant de porteacutee col2) sera appliqueacute au jeulatin1 cp1252 West European Inseacuterons une ligne

CREATE TABLE bdnouvelle2testChap5

( col2 CHAR(4))

CHARACTER SET latin1

INSERT INTO bdnouvelle2testChap5 VALUES (GTRIUT)

Seacutelection drsquoune base de donneacutees (USE)

Ceux qui ont travailleacute sous Dbase se souviennent de lrsquoinstruction USE qui deacutesignait la tablecourante dans un programme Pour MySQL USE seacutelectionne une base de donneacutees qui devientactive dans une session

USE nomBase

Si vous deacutesirez travailler simultaneacutement dans diffeacuterentes bases de donneacutees faites toujourspreacutefixer le nom des tables par celui de la base par la notation pointeacutee (nomBasenomTable)

Lrsquoexemple suivant exeacutecute une jointure sur deux tables situeacutees dans deux bases distinctes

col CHAR(5) CHARACTER SET cp850

Tableau 5-4 Seacutelection de bases

Instruction SQL Reacutesultat

CREATE TABLE bdnouvelletestUSE (col3 CHAR(5) col4 CHAR(4)) CHARACTER SET latin1INSERT INTO bdnouvelletestUSE VALUES (ACTMPIUT)

Creacuteation drsquoune table dans la base

Insertion drsquoune ligne

USE bdnouvelle2 Seacutelection de la base bdnouvelle2

SELECT col col3 FROM testChap5 WHERE col2 = col4+------+-------+| col | col3 |+------+-------+| GTR | ACTMP |+------+-------+

Jointure de la table testChap5 situeacutee dans la base active (bdnouvelle2) avec testUSE situeacutee dans la base bdnouvelle

bdnouvelletestUSEbdnouvelletestUSEbdnouvelletestUSE

4055_05_C05 Page 157 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

158 copy Eacuteditions Eyrolles

Modification drsquoune base (ALTER DATABASE)

ALTER DATABASE vous permet de modifier le jeu de caractegraveres par deacutefaut drsquoune base dedonneacutees Pour pouvoir changer ainsi une base vous devez avoir le privilegravege ALTER sur la basede donneacutees en question

ALTER DATABASE nomBase

[ [DEFAULT] CHARACTER SET nomJeu ]

[ [DEFAULT] COLLATE nomCollation ]

Lrsquoinstruction suivante modifie la base laquo chinoise raquo en lui affectant le jeu de caractegraveres de typeDOS

ALTER DATABASE bdnouvelle2

Suppression drsquoune base (DROP DATABASE)

Pour pouvoir supprimer une base de donneacutees vous devez posseacuteder le privilegravege DROP sur labase (ou au niveau global pour effacer toute base) Cette commande deacutetruit tous les objets(tables index etc) et le reacutepertoire contenus dans la base

DROP DATABASE | SCHEMA [IF EXISTS] nomBase

IF EXISTS eacutevite une erreur dans le cas ougrave la base de donneacutees nrsquoexisterait pas

Cette instruction retourne le nombre de tables qui on eacuteteacute supprimeacutees (fichiers agrave lrsquoextensionlaquo frm raquo)

Disons agrave preacutesent adios agrave la base laquo chinoise raquo

DROP DATABASE bdnouvelle2

Privilegraveges

Depuis le deacutebut du livre nous avons parleacute de privilegraveges Il est temps agrave preacutesent de preacuteciser ceque recouvre ce terme Un privilegravege (sous-entendu utilisateur) est un droit drsquoexeacutecuter unecertaine instruction SQL (on parle de privilegravege systegraveme) ou un droit relatif aux donneacutees destables situeacutees dans diffeacuterentes bases (on parle de privilegravege objet) La connexion par exemplesera consideacutereacutee comme un privilegravege systegraveme bien que nrsquoeacutetant pas une commande SQL

Les privilegraveges systegraveme diffegraverent sensiblement drsquoun SGBD agrave un autre Chez Oracle il y en aplus drsquoune centaine MySQL est plus modeste en nrsquoen proposant qursquoune vingtaine En revan-che on retrouvera les mecircmes privilegraveges objet (exemple autorisation de modifier la colonnenomComp de la table Compagnie) qui sont attribueacutes ou retireacutes par les instructions GRANT etREVOKE

DEFAULT CHARACTER SET cp850

4055_05_C05 Page 158 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 159

chapitre ndeg 5 Controcircle des donneacutees

Niveaux de privilegraveges

La figure suivante illustre les diffeacuterents niveaux de privilegraveges que lrsquoon peut rencontrer

Global level privilegraveges srsquoappliquant agrave toutes les bases du serveur Ces privilegraveges sontstockeacutes dans la table mysqluser (exemple drsquoattribution drsquoun privilegravege global GRANTCREATE hellip)

Database level privilegraveges srsquoappliquant agrave tous les objets drsquoune base de donneacutees en particu-lier Ces privilegraveges sont stockeacutes dans les tables mysqldb et mysqlhost (exempledrsquoattribution drsquoun privilegravege database GRANT SELECT hellip)

Table level privilegraveges srsquoappliquant agrave la globaliteacute drsquoune table drsquoune base de donneacutees enparticulier Ces privilegraveges sont stockeacutes dans la table mysqltables_priv (exempledrsquoattribution drsquoun privilegravege table GRANT INSERT hellip)

Column level privilegraveges srsquoappliquant agrave une des colonnes drsquoune table drsquoune base dedonneacutees en particulier Ces privilegraveges sont stockeacutes dans la table mysqlcolumns_priv(exemple drsquoattribution drsquoun privilegravege column GRANT UPDATE( )ON

hellip)

Routine level privilegraveges globaux ou au niveau drsquoune base (CREATE ROUTINE ALTERROUTINE EXECUTE et GRANT) srsquoappliquant aux proceacutedures catalogueacutees (eacutetudieacutees auchapitre 7) Ces privilegraveges sont stockeacutes dans la table mysqlprocs_priv de la basemysql (exemple drsquoattribution drsquoun privilegravege routine GRANT EXECUTE ON

hellip)

Tables de la base mysqlCinq tables de la base de donneacutees mysql suffisent agrave MySQL pour stocker les privilegraveges(systegraveme et objet) de tous les utilisateurs La figure suivante illustre comment MySQL deacuteduittoutes ces preacuterogatives toujours en fonction des accegraves (couple utilisateur machine)

Figure 5-2 Niveaux de privilegraveges

Jules Paul

mysql test

information_schema

bdjules bdpaul

Routine level

Global level

Database level

Table level

Column level

ON

ON bdpaul

ON bdpaulAvion

nomCompbdpaulCompagnie

PROCEDUREbdpaulsp1

4055_05_C05 Page 159 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

160 copy Eacuteditions Eyrolles

La colonne Db est en plus dans les tables host tables_priv et columns_priv car elle estneacutecessaire pour deacutesigner la base de donneacutees sur laquelle portera le droit ou la famille de droits

Supposons pour nos exemples que lrsquoutilisateur Paul (accegraves en local) et la base de donneacuteesbdpaul soient creacuteeacutes

CREATE DATABASE bdpaul

CREATE USER Paullocalhost IDENTIFIED BY iut

Table mysqluserPreacutesenteacute briegravevement au deacutebut du chapitre Cette table est composeacutee de 37 colonnes qui deacutecriventles privilegraveges au niveau global du serveur Nous deacutetaillons ici la signification des principales

Privilegraveges objet (LMD) sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives de Paul (et des autres) Pour lrsquoinstant le caractegravereN eacutetant dans toutes les colonnes il ne peut ni interroger une table (Select_priv) ni inseacute-rer dans une table (Insert_priv) ni en modifier (Update_priv) ni en supprimer(Delete_priv) et ce quelle que soit la base de donneacutees (excepteacute les bases systegraveme test etinformation_schema) sur laquelle il voudra se connecterSELECT Host User FROM mysqluser+-----------+------+-------------+-------------+-------------+-------------+| Host | User | Select_priv | Insert_priv | Update_priv | Delete_priv |+-----------+------+-------------+-------------+-------------+-------------+| localhost | root | Y | Y | Y | Y || localhost | | Y | Y | Y | Y || | | N | N | N | N || |+-----------+------+-------------+-------------+-------------+-------------+

Figure 5-3 Stockage des preacuterogatives

Table user db host tables_priv columns_priv procs_priv+----------- +------+------------- +-------- +-------- +------------- +------

| Host | User | hellip | droit1 | droit2 | familledroit1 | hellip

+----------- +------+----------- --+-------- +-------- +---------- -----+----

| localhost | root | | Y | Y | Y | hellip

| hellip | | | | | |

| hellip | | | | | |

| localhost | Paul | | N | Y | N | hellip

+----------- +------+------------- +-------- +-------- +------------ ---+----

Paul possegravede le privilegravege droit2sur une base table objet Paul

root possegravede tous les privilegraveges sur une base table objet

root

Select_priv Insert_priv Update_priv Delete_priv

localhost | Paul | N | N | N | N

4055_05_C05 Page 160 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 161

chapitre ndeg 5 Controcircle des donneacutees

Vous pouvez par analogie pour cet exemple et pour les suivants deacutecouvrir les preacuterogativesdes autres accegraves (ici root et anonyme)

Privilegraveges objet (LDD) sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des instructions LDD Pour lrsquoinstant lecaractegravere N eacutetant dans toutes les colonnes Paul ne peut ni creacuteer une table ou une base(Create_priv) ni en supprimer (Drop_priv) ni creacuteer ou supprimer un index (Index_priv) ni modifier la structure drsquoune table la renommer ou modifier une base (Alter_priv) et ce quelle que soit la base de donneacutees (excepteacute les bases systegraveme test etinformation_schema)

SELECT Host User FROM mysqluser+-----------+------+-------------+-----------+------------+------------+| Host | User | Create_priv | Drop_priv | Index_priv | Alter_priv |+-----------+------+-------------+-----------+------------+------------+| localhost | root | Y | Y | Y | Y || localhost | | Y | Y | Y | Y || | | N | N | N | N || |+-----------+------+-------------+-----------+------------+------------+

Privilegraveges systegraveme (LCD) sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des instructions LCD Pour lrsquoinstant lecaractegravere N eacutetant dans toutes les colonnes Paul ne peut ni creacuteer un utilisateur (Create_user_priv) ni transmettre des droits qursquoil aura lui-mecircme reccedilus (Grant_priv) ni lister lesbases de donneacutees existantes (Show_db_priv) et ce quelle que soit la base de donneacutees

SELECT HostUser FROM mysqluser+-----------+------+------------------+------------+--------------+| Host | User | Create_user_priv | Grant_priv | Show_db_priv |+-----------+------+------------------+------------+--------------+| localhost | root | Y | Y | Y || localhost | | N | Y | Y || | | N | N | N || |+-----------+------+------------------+------------+--------------+

Privilegraveges agrave propos des vues sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des instructions relatives aux vues (viewsdeacutetailleacutees dans la section suivante) Pour lrsquoinstant le caractegravere N eacutetant dans toutes lescolonnes Paul ne peut ni creacuteer une vue (Create_view_priv) ni lister les vues existantes(Show_view_priv) et ce quelle que soit la base de donneacutees

Create_priv Drop_privIndex_priv Alter_priv

localhost | Paul | N | N | N | N

Create_user_priv Grant_priv Show_db_priv

localhost | Paul | N | N | N

4055_05_C05 Page 161 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

162 copy Eacuteditions Eyrolles

SELECT HostUser FROM mysqluser

+-----------+------+------------------+----------------+

| Host | User | Create_view_priv | Show_view_priv |

+-----------+------+------------------+----------------+

| localhost | root | Y | Y |

| localhost | | N | N |

| | | N | N |

| localhost | Paul | N | N |

+-----------+------+------------------+----------------+

Privilegraveges agrave propos des proceacutedures catalogueacutees sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des proceacutedures catalogueacutees (deacutetailleacuteesdans le chapitre 7) Pour lrsquoinstant le caractegravere N eacutetant dans toutes les colonnes Paul nepeut ni creacuteer une proceacutedure (Create_routine_priv) ni en modifier (Alter_routine_priv) ni en exeacutecuter (Execute_priv) et ce quelle que soit la base de donneacuteesSELECT HostUser FROM mysqluser+-----------+------+---------------------+--------------------+--------------+| Host | User | Create_routine_priv | Alter_routine_priv | Execute_priv |+-----------+------+---------------------+--------------------+--------------+| localhost | root | Y | Y | Y || localhost | | N | N | Y || | | N | N | N || localhost | Paul | N | N | N |+-----------+------+---------------------+--------------------+--------------+

Privilegraveges agrave propos des restrictions drsquoutilisateur

La requecircte suivante extrait les preacuterogatives agrave propos des restrictions qursquoon peut deacutefinir paraccegraves Pour lrsquoinstant le chiffre eacutetant agrave 0 dans toutes les colonnes aucun accegraves (utilisateur)nrsquoest limiteacute concernant le nombre de requecirctes (max_questions) de modifications (max_updates) de connexions par heure (max_connections) et de connexions simultaneacutees(max_user_connections) agrave un serveur

SELECT Host User Requetes Modifs

Connexions Cx simult FROM mysqluser+-----------+------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+------+----------+--------+------------+------------+| localhost | root | 0 | 0 | 0 | 0 || localhost | | 0 | 0 | 0 | 0 || | | 0 | 0 | 0 | 0 || localhost | Paul | 0 | 0 | 0 | 0 |+-----------+------+----------+--------+------------+------------+

Create_view_priv Show_view_priv

Create_routine_priv Alter_routine_priv Execute_priv

max_questions max_updates

max_connections max_user_connections

4055_05_C05 Page 162 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 163

chapitre ndeg 5 Controcircle des donneacutees

Privilegraveges non abordeacutes

Drsquoautres colonnes de la table mysqluser sont inteacuteressantes mais sortent un peu du cadrede ce livre Jrsquoai donc fait lrsquoimpasse sur Create_tmp_table_priv (sert agrave creacuteer des tablestemporaires) Lock_tables_priv (pose des verrous explicites) Shutdown_priv (arrecircteet redeacutemarre le serveur) Process_priv et Super_priv (gegraverent les processus) File_priv (accegravede aux fichiers du systegraveme drsquoexploitation) Repl_slave_priv et Repl_client_priv (utiliseacutes pour des aspects de reacuteplication de donneacutees)

Nul doute que vous saurez vous servir de ces privilegraveges en temps voulu par analogie avecceux que nous allons eacutetudier

Le privilegravege References_priv nrsquoest pas opeacuterationnel encore Il permettrait de beacuteneacuteficier delrsquointeacutegriteacute reacutefeacuterentielle entre deux tables appartenant agrave deux bases distinctes (par exemple latable Avion dans bd1 ferait reacutefeacuterence par cleacute eacutetrangegravere agrave la table Compagnie dans bd2)

Avant de preacutesenter les autres tables (db host tables_priv columns_priv et procs_priv) de la base mysql eacutetudions les intructions relatives agrave lrsquoattribution drsquoun privilegravege(GRANT) qursquoil soit systegraveme ou objet et celles relatives agrave la reacutevocation drsquoun privilegravege (REVOKE)

Attribution de privilegraveges (GRANT)

La figure suivante illustre le contexte qui va servir drsquoexemple agrave lrsquoattibution de preacuterogatives

Syntaxe

Lrsquoinstruction GRANT permet drsquoattribuer un (ou plusieurs) privilegravege(s) agrave propos drsquoun objet agrave un(ou plusieurs) beacuteneacuteficiaire(s) Lrsquoutilisateur qui exeacutecute cette commande doit avoir reccedilu lui-mecircme le droit de transmettre ces privilegraveges (reccedilu avec la directive GRANT OPTION) Dans lecas de root aucun problegraveme car il a implicitement tous les droits

Figure 5-4 Attribution de privilegraveges

mysql test

information_schema

bdjules bdpaul

sp1() sp2()

PaulJules

Livre

CREATE

Restrictions de connexion SELECT(titre) INSERT - UPDATE(ISBN)

DELETE - SELECTCREATEDROP

Execute sp1() sp2() Modif sp1()

4055_05_C05 Page 163 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

164 copy Eacuteditions Eyrolles

GRANT privilegravege [ (col1 [ col2])] [privilegravege2 ]

ON [ TABLE | FUNCTION | PROCEDURE ]

nomTable | | | nomBase

TO utilisateur [IDENTIFIED BY [PASSWORD] password]

[utilisateur2 ]

[ WITH [ GRANT OPTION ]

[ MAX_QUERIES_PER_HOUR nb ]

[ MAX_UPDATES_PER_HOUR nb2 ]

[ MAX_CONNECTIONS_PER_HOUR nb3 ]

[ MAX_USER_CONNECTIONS nb4 ] ]

privilegravege description du privilegravege (ex SELECT DELETE etc) voir le tableau suivant

col preacutecise la ou les colonnes sur lesquelles se portent les privilegraveges SELECT INSERT ouUPDATE (exemple UPDATE(typeAvion) pour nrsquoautoriser que la modification de lacolonne typeAvion)

GRANT OPTION permet de donner le droit de retransmettre les privilegraveges reccedilus agrave unetierce personne

Le tableau suivant reacutesume la signification des principaux privilegraveges agrave accorder ou agrave reacutevoquer

Tableau 5-5 Privilegraveges principaux pour GRANT et REVOKE

privilege Commentaire

ALL [PRIVILEGES] Tous les privilegraveges

ALTER Modification de basetable

ALTER ROUTINE Modification de proceacutedure

CREATE Creacuteation de basetable

CREATE ROUTINE Creacuteation de proceacutedure

CREATE USER Creacuteation drsquoutilisateur

CREATE VIEW Creacuteation de vue

DELETE Suppression de donneacutees de table

DROP Suppression de basetable

EXECUTE Exeacutecution de proceacutedure

INDEX CreacuteationSuppression drsquoindex

INSERT Insertion de donneacutees de table

SELECT Extraction de donneacutees de table

SHOW DATABASES Lister les bases

SHOW VIEW Lister les vues drsquoune base

SUPER Gestion des deacuteclencheurs

UPDATE Modification de donneacutees de table

USAGE Synonyme de laquo sans privilegravege raquo USAGE est utiliseacute pour conserver les privilegraveges preacuteceacutedemment deacutefinis tout en les restreignant avec des options

4055_05_C05 Page 164 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 165

chapitre ndeg 5 Controcircle des donneacutees

Exemples

Le tableau suivant deacutecrit lrsquoaffectation de quelques privilegraveges en donnant les explications asso-cieacutees

Tout ce que vous avez le droit de faire doit ecirctre explicitement autoriseacute par la commande GRANTCe qui nrsquoest pas dit par GRANT nrsquoest pas permis Par exemple Jules peut creacuteer des bases maispas en deacutetuire Paul peut modifier le numeacutero ISBN drsquoun livre mais pas son titre etc

Voir les privilegraveges

La commande SHOW GRANTS FOR liste les diffeacuterentes instructions GRANT eacutequivalentes agrave toutesles preacuterogatives drsquoun utilisateur donneacute Crsquoest bien utile quand vous avez attribueacute un certain nombrede privilegraveges agrave un utilisateur sans avoir penseacute agrave les consigner dans un fichier de commande

SHOW GRANTS FOR utilisateur

Tableau 5-6 Affectation de privilegraveges

Instruction faite par root Explication

GRANT CREATE DROP ON TO

Privilegravege systegraveme database level

Paul (en accegraves local) peut creacuteer ousupprimer des tables dans la base bdpaul

GRANT INSERT SELECT DELETE UPDATE(ISBN) ON TO

Privilegravege objet table level

Paul peut inseacuterer extraire supprimer etmodifier la colonne ISBN de la table Livrecontenue dans la base bdpaul

GRANT ALTER ON TO

Privilegravege systegraveme table level

Paul peut modifier la structure ou lescontraintes de la table Livre contenuedans la base bdpaul

GRANT SELECT(titre) ON TO WITH GRANT OPTION

Privilegravege objet column level

Jules peut extraire seulement la colonnetitre de la table Livre contenue dans labase bdpaul Il pourra par la suiteretransmettre eacuteventuellement ce droit

GRANT CREATE ON TO

Privilegravege systegraveme global level

Jules peut creacuteer des bases de donneacutees

GRANT USAGE ON TO WITH MAX_QUERIES_PER_HOUR 50 MAX_UPDATES_PER_HOUR 20 MAX_CONNECTIONS_PER_HOUR 6 MAX_USER_CONNECTIONS 3

Privilegravege systegraveme database level

Jules ne peut lancer chaque heure que50 SELECT 20 UPDATE se connecter 6 fois(dont 3 connexions simultaneacutees) sur la basede donneacutees bdpaul

bdpaulPaullocalhost

bdpaulLivrePaullocalhost

bdpaulLivrePaullocalhost

bdpaulLivreJuleslocalhost

Juleslocalhost

bdpaulJuleslocalhost

4055_05_C05 Page 165 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

166 copy Eacuteditions Eyrolles

Utilisons cette commande pour extraire les profils de Jules de Paul et de lrsquoadministrateuren chef (accegraves en local) Jrsquoavoue avoir un peu retravailleacute lrsquoeacutetat de sortie (sans en modifier uneligne quand mecircme)

SHOW GRANTS FOR Juleslocalhost+---------------------------------------------------------------------------+| Grants for Juleslocalhost |+---------------------------------------------------------------------------+| GRANT CREATE ON TO Juleslocalhost IDENTIFIED BY PASSWORD 6AE163FB9EE8BB011EB2E87316AA5BE563A6CDB7 WITH MAX_QUERIES_PER_HOUR 50 MAX_UPDATES_PER_HOUR 20 MAX_CONNECTIONS_PER_HOUR 6 MAX_USER_CONNECTIONS 3 || GRANT SELECT (titre) ON `bdpaul``Livre` TO Juleslocalhost WITH GRANT OPTION |+---------------------------------------------------------------------------+

On remarque que MySQL a regroupeacute deux privilegraveges en une instruction GRANT (CREATE etles restrictions de connexions) Par lagrave mecircme on se rend compte que les preacuterogatives deconnexion sont au niveau global bien qursquoon les ait speacutecifieacutees au niveau database

SHOW GRANTS FOR Paullocalhost+---------------------------------------------------------------------------+| Grants for Paullocalhost |+---------------------------------------------------------------------------+| GRANT USAGE ON TO Paullocalhost IDENTIFIED BY PASSWORD 6AE163FB9EE8BB011EB2E87316AA5BE563A6CDB7 || GRANT CREATE DROP ON `bdpaul` TO Paullocalhost || GRANT SELECT INSERT UPDATE (ISBN) DELETE ALTER ON `bdpaul``Livre` TO Paullocalhost |+---------------------------------------------------------------------------+

On remarque que MySQL a regroupeacute tous les privilegraveges sur la table Livre en une instructionGRANT La premiegravere exprime le fait que Paul peut se connecter agrave toutes les bases (par USEnomBase) mais qursquoil ne pourra travailler en reacutealiteacute que dans bdpaul

SHOW GRANTS FOR rootlocalhost+---------------------------------------------------------------------------+| Grants for rootlocalhost |+---------------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON TO rootlocalhost IDENTIFIED BY PASSWORD 387E25FE2CF7ED941E43A76AD9402825401698FC WITH GRANT OPTION |+---------------------------------------------------------------------------+

On remarque que MySQL nrsquoattribue qursquoun seul droit mais le plus fort Tous les droits (ALLPRIVILEGES) sur toutes les bases () avec en prime la clause GRANT OPTION quipermet de retransmettre nrsquoimporte quoi agrave nrsquoimporte qui ou de tout reacutevoquer

Interrogeons agrave nouveau la table user de la base mysql stockant les preacuterogatives au niveauglobal du moment Le droit de creacuteation en local de Jules apparaicirct sur toutes les bases

4055_05_C05 Page 166 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 167

chapitre ndeg 5 Controcircle des donneacutees

SELECT HostUser Create_privDrop_privIndex_privAlter_priv FROM mysqluser+-----------+-------+-------------+-----------+------------+------------+| Host | User | Create_priv | Drop_priv | Index_priv | Alter_priv |+-----------+-------+-------------+-----------+------------+------------+| hellip| localhost | Paul | N | N | N | N || | N | N | N |+-----------+-------+-------------+-----------+------------+------------+

Les colonnes suivantes permettent de stocker les restrictions sur les connexions

SELECT HostUser max_questions Requetes max_updates Modifs max_connections Connexions max_user_connections Cx simult FROM mysqluser+-----------+-------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+-------+----------+--------+------------+------------+| hellip| localhost | Paul | 0 | 0 | 0 | 0 || |+-----------+-------+----------+--------+------------+------------+

Analysons les autres tables de la base mysql pour deacutecouvrir les preacuterogatives des autresniveaux (database table column et routine)

Table mysqldbLa table mysqldb deacutecrit les preacuterogatives au niveau database Ainsi la colonne Db indique labase de donneacutees

SELECT Host User Db Create_priv Drop_priv Alter_priv FROM mysqldb+-----------+------+---------+-------------+-----------+------------+| Host | User | Db | Create_priv | Drop_priv | Alter_priv |+-----------+------+---------+-------------+-----------+------------+| | | test_ | Y | Y | Y || | | test | Y | Y | Y || |+-----------+------+---------+-------------+-----------+------------+

Notez la possibiliteacute de Paul avec lrsquoaccegraves local de creacuteeacuter et de supprimer des tables dans labase bdpaul Notez eacutegalement la possibiliteacute de creacuteer de supprimer de modifier des tablespar un accegraves distant anonyme sur la base test

Table mysqlhostCette table est eacutetudieacutee agrave la section Accegraves distants

localhost | Jules | Y

localhost | Jules | 50 | 20 | 6 | 3

localhost | Paul | bdpaul | Y | Y | N

4055_05_C05 Page 167 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

168 copy Eacuteditions Eyrolles

Table mysqltables_privLa table mysqltables_priv deacutecrit les preacuterogatives objet au niveau table Ainsi lacolonne Table_name indique la table concerneacutee la colonne Grantor preacutecise lrsquoutilisateurayant donneacute le droit La colonne Table_priv est un SET contenant la liste des droits delrsquoutilisateur sur la table

SELECT CONCAT(UserHost) Compte CONCAT(DbTable_name) Objet Grantor Table_priv FROM mysqltables_priv+-----------------+--------------+----------------+---------------------------+| Compte | Objet | Grantor | Table_priv |+-----------------+--------------+----------------+---------------------------+| Juleslocalhost | bdpaulLivre | rootlocalhost | Grant || Paullocalhost | bdpaulLivre | rootlocalhost | SelectInsertDeleteAlter|+-----------------+--------------+----------------+---------------------------+

On retrouve les quatre privilegraveges de Paul et celui de Jules (GRANT OPTION de SELECTsur la table)

Cette table possegravede aussi une colonne de nom Timestamp stockant lrsquoinstant au cours duquelsrsquoest deacuterouleacutee lrsquoattribution (ou la reacutevocation)

Table mysqlcolumns_privLa table mysqlcolumns_priv deacutecrit les preacuterogatives objet au niveau column Ainsi lacolonne Table_name indique la table concerneacutee la colonne Column_name preacutecise lacolonne concerneacutee par le droit La colonne Column_priv est un SET contenant la liste desdroits de lrsquoutilisateur sur la colonne de la table

SELECT CONCAT(UserHost) Compte CONCAT(DbTable_name) Objet Column_name Column_priv FROM mysqlcolumns_priv+-----------------+--------------+-------------+-------------+| Compte | Objet | Column_name | Column_priv |+-----------------+--------------+-------------+-------------+| Juleslocalhost | bdpaulLivre | titre | Select || Paullocalhost | bdpaulLivre | ISBN | Update |+-----------------+--------------+-------------+-------------+

On retrouve le privilegravege de Paul et celui de Jules (portant ici sur la mecircme table)

Table mysqlprocs_privLa table mysqlprocs_priv deacutecrit les preacuterogatives des proceacutedures et des fonctionscatalogueacutees au niveau routine

4055_05_C05 Page 168 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 169

chapitre ndeg 5 Controcircle des donneacutees

Les privilegraveges CREATE ROUTINE ALTER ROUTINE EXECUTE et GRANT srsquoappliquent surles sous-programmes catalogueacutes et peuvent ecirctre attribueacutes au niveau global et database ALTERROUTINE EXECUTE et GRANT peuvent ecirctre assigneacutes aussi au niveau routine

En supposant que la base bdpaul contient la proceacutedure catalogueacutee sp1() et la fonctionsp2() toutes deux eacutecrites par root le tableau suivant exprime lrsquoaffectation de quelquesprivilegraveges en donnant les explications associeacutees

La colonne Routine_name de la table mysqlprocs_priv deacutesigne le nom du sous-programme catalogueacute La colonne Routine_type preacutecise le type du sous-programme cata-logueacute (fonction ou proceacutedure) La colonne Grantor indique lrsquoutilisateur ayant compileacute lesous-programme La colonne Proc_priv est un SET contenant la liste des droits de lrsquoutilisa-teur sur le sous-programme de la base

Extrayons les privilegraveges relatifs aux sous-programmes au niveau database

SELECT CONCAT(UserHost) Compte Db Create_routine_priv create routine Alter_routine_priv alter routine Execute_priv exec routine FROM mysqldb+----------------+---------+----------------+---------------+---------------+| Compte | Db | create routine | alter routine | exec routine |+----------------+---------+----------------+---------------+---------------+| | test_ | N | N | N || | test | N | N | N || | N | N |+----------------+---------+----------------+---------------+---------------+

On retrouve le privilegravege de Paul Extrayons enfin les privilegraveges relatifs aux sous-programmesau niveau routine

Tableau 5-7 Affectation de privilegraveges

Instruction faite par root Explication

GRANT CREATE ROUTINE ON TO Paullocalhost

Privilegravege systegraveme database level

Paul (en accegraves local) peut creacuteer ou supprimerdes sous-programmes catalogueacutes dans la basebdpaul

GRANT ALTER ROUTINE ON TO Paullocalhost

Privilegravege systegraveme routine level

Paul peut modifier la proceacutedure sp1 contenuedans la base bdpaul

GRANT EXECUTE ON TO Juleslocalhost

GRANT EXECUTE ON TO Juleslocalhost

Privilegraveges systegraveme routine level

Jules peut exeacutecuter la proceacutedure sp1 et lafonction sp2 contenues dans la base bdpaul

bdpaul

PROCEDURE bdpaulsp1

PROCEDURE bdpaulsp1

FUNCTION bdpaulsp2

Paullocalhost | bdpaul | Y

4055_05_C05 Page 169 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

170 copy Eacuteditions Eyrolles

SELECT CONCAT(UserHost) Compte CONCAT(Routine_nameRoutine_type) Objet Grantor Proc_priv FROM mysqlprocs_priv+-----------------+----------------------+----------------+---------------+| Compte | Objet | Grantor | Proc_priv |+-----------------+----------------------+----------------+---------------+| Juleslocalhost | bdpaulsp1PROCEDURE | rootlocalhost | Execute || Juleslocalhost | bdpaulsp2FUNCTION | rootlocalhost | Execute || Paullocalhost | bdpaulsp1PROCEDURE | rootlocalhost | Alter Routine |+-----------------+----------------------+----------------+---------------+

On retrouve le privilegravege en modification de sp1 pour Paul et les deux privilegraveges drsquoexeacutecutionde Jules

Reacutevocation de privilegraveges (REVOKE)

La reacutevocation drsquoun ou de plusieurs privilegraveges est reacutealiseacutee par lrsquoinstruction REVOKE Pourpouvoir reacutevoquer un privilegravege vous devez deacutetenir (avoir reccedilu) au preacutealable ce mecircme privilegravegeavec lrsquooption WITH GRANT OPTION

Syntaxe

Dans la syntaxe suivante les options sont les mecircmes que pour la commande GRANT

REVOKE privilegravege [ (col1 [ col2])] [privilegravege2 ]

ON [ TABLE | FUNCTION | PROCEDURE ]

nomTable | | | nomBase

FROM utilisateur [utilisateur2 ]

Exemples

Le tableau suivant deacutecrit la reacutevocation de certains privilegraveges acquis des utilisateurs Paul et Jules

Tableau 5-8 Reacutevocation de privilegraveges

Instruction faite par root Explication

REVOKE CREATE ON FROM

Privilegravege systegraveme database level

Paul (en accegraves local) ne peut plus creacuteer de tables dansla base bdpaul

REVOKE ALTERINSERTUPDATE(ISBN) ON FROM

Privilegravege objet table level

Paul ne peut plus modifier la structure (ou lescontraintes) inseacuterer et modifier la colonne ISBN de latable Livre contenue dans la base bdpaul

GRANT USAGE ON bdpaul TO WITH MAX_QUERIES_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0

Privilegravege systegraveme database level

Jules nrsquoest plus limiteacute en requecirctes SELECT et UPDATEsur la base de donneacutees bdpaul Ici crsquoest un GRANT qursquoilfaut faire car il srsquoagit plus drsquoune restriction de connexionque drsquoune instruction SQL

bdpaulPaullocalhost

bdpaulLivrePaullocalhost

Juleslocalhost

4055_05_C05 Page 170 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 171

chapitre ndeg 5 Controcircle des donneacutees

Veacuterifications

Une fois ces actualisations reacutealiseacutees les cinq tables de la base mysql contiennent un peu plusle caractegravere N qursquoauparavant Les colonnes SET des tables mysqltables_privmysqlcolumns_priv et mysqlprocs_priv sont eacutegalement mises agrave jour Ainsilrsquoextraction du profil actuel de Paul au niveau table fait apparaicirctre les deux seuls droits qursquoillui reste

SELECT CONCAT(UserHost) CompteCONCAT(DbTable_name)

Objet

Grantor Table_priv FROM mysqltables_priv

WHERE User=Paul AND Host=localhost

+----------------+--------------+----------------+---------------+

| Compte | Objet | Grantor | Table_priv |

+----------------+--------------+----------------+---------------+

| Paullocalhost | bdpaulLivre | rootlocalhost | SelectDelete |

+----------------+--------------+----------------+---------------+

Lrsquoextraction du profil actuel de Jules au niveau database fait apparaicirctre que les deux limita-tions de connexion sur les SELECT et UPDATE ont disparu

SELECT HostUser max_questions Requetes max_updates Modifs max_connections Connexions max_user_connections Cx simult FROM mysqluser WHERE User=Jules AND Host=localhost+-----------+-------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+-------+----------+--------+------------+------------+| localhost | Jules | | 6 | 3 |+-----------+-------+----------+--------+------------+------------+

Tout en une fois

Il existe une instruction qui reacutevoque tous les droits en une fois Vous en avez assez drsquoun utili-sateur qui ne cesse de vous casser les pieds utilisez REVOKE ALL PRIVILEGES Pensezquand mecircme agrave sauvegarder au preacutealable le profil de Jules (SHOW GRANT FOR) pourpouvoir le faire travailler de nouveau quand vous serez calmeacute

Selon la documentation officielle la syntaxe suivante permet de supprimer toutes les preacuteroga-tives aux niveaux global database table et column Et les privilegraveges routine me direz-vous Ils ont ducirc lrsquooublier dans la documentation mais ils sont aussi effaceacutes ne vous inquieacutetez pas jelrsquoai testeacute

REVOKE ALL PRIVILEGES GRANT OPTION FROM utilisateur [ utilisateur2 ]

Pour pouvoir annihiler ainsi un utilisateur il faut deacutetenir le privilegravege CREATE USER au niveauglobal ou le privilegravege UPDATE au niveau database sur la base mysql

0 | 0

4055_05_C05 Page 171 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

172 copy Eacuteditions Eyrolles

Ne confondez pas suppression de tous les droits drsquoun accegraves et suppression de lrsquoutilisateur Paranalogie les politiciens qui se voient retirer le droit de vote ne sont pas encore guillotineacutes (queje sache) Eacutenervons-nous contre Jules

REVOKE ALL PRIVILEGES GRANT OPTION FROM Juleslocalhost

Attributions et reacutevocations laquo sauvages raquo

Le caractegravere open de MySQL fait des fois bien les choses mais dans ce cas preacutecis je netrouve pas Ici mon billet drsquohumeur conteste la possibiliteacute qui est donneacutee de modifier lescinq tables de la base mysql pour affecter tantocirct un N par-ci tantocirct un Y par-lagrave ou encorepour mettre agrave jour un SET contenant SELECT par exemple etc Bref un UPDATE rateacute unINSERT dans la mauvaise colonne un DELETE sans WHERE et vous mettez une panique noire(comme la couleur par deacutefaut de lrsquointerface de commande) dans vos bases Vous pouvez vous-mecircme empecirccher toute connexion (mecircme celle du root)

Sous Oracle les commandes GRANT et REVOKE mettent agrave jour des tables systegraveme que vouspouvez interroger mais que vous ne pouvez pas modifier Crsquoest heureux

En conclusion je ne deacutecrirai aucune de ces manipulations drsquoabord parce que je nrsquoai pas enviede me tromper en faisant des tests et bouleverser ainsi inutilement ma configuration Ensuiteparce si vous voulez laquo bidouiller raquo allez consulter des sites Web ou drsquoautres ouvrages quirecopient la documentation sans quelquefois changer ni tester les exemples vous mrsquoen direzdes nouvelles

Vous voulez donner des droits utilisez GRANT les reprendre utilisez REVOKE car

bull Ils sont programmeacutes preacuteciseacutement pour ccedila

bull Les deux instructions sont dans la norme SQL

Ne pas les employer crsquoest comme acheter une quatre cylindres chez BMW (le motoriste estspeacutecialiste des six en ligne) et verser en cachette du colza dans le reacuteservoir chez lrsquoagriculteurdu coin en croyant eacuteconomiser

La seule utilisation acceptable parce qursquoon nrsquoa pas le choix de faire autrement concerne lamise agrave jour de la table mysqlhost (deacutecrite dans la section suivante) Agrave configuration avan-ceacutee programmeur averti

Accegraves distants

La figure suivante illustre la configuration de mon test Un client est en 1921684173 surlequel sont installeacutees les couches MySQL (Complete Package ou Essentials Package) Unserveur est en 1921684118 eacutequipeacute de MySQL Complete Package Sur le serveur root creacutee

4055_05_C05 Page 172 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 173

chapitre ndeg 5 Controcircle des donneacutees

un accegraves agrave Paul en preacutecisant lrsquoadresse de la machine client et lui attribue un droit drsquoextrac-tion de la table Livre sur la base bdPaul

CREATE USER Paul1921684173 IDENTIFIED BY pauldistant

GRANT SELECT ON bdpaulLivre TO Paul1921684173

Connexion par lrsquointerface de commande

Sur le client Paul se connecte au serveur dans une fenecirctre de commande en preacutecisantlrsquoadresse de la machine serveur puis donne son mot de passe distant Pensez agrave enlever lespare-feu Windows sur le client et le serveur (bloquant le port 3306)

mysql -h 1921684118 -u Paul -p

Paul peut agrave preacutesent seulement interroger la table distante comme le montre la copie drsquoeacutecransuivante

Table mysqlhostLa table mysqlhost est utiliseacutee conjointement avec mysqldb et concerne les accegravesdistants (plusieurs machines) Cette table nrsquoest employeacutee que pour les preacuterogatives au niveau

Figure 5-5 Accegraves distant par lrsquointerface de commande MySQL

Paullocalhost

1921684118

1921684173root

Paul1921684173

TCP-IP

bdpaul

mysql

mysql

rootlocalhostPaul

Livre

Figure 5-6 Interrogation distante par lrsquointerface de commande MySQL

4055_05_C05 Page 173 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

174 copy Eacuteditions Eyrolles

database indeacutependamment des utilisateurs La structure est la mecircme que celle de mysqldbagrave lrsquoexception de la colonne User qui nrsquoest pas preacutesente Le couple de colonnes (Host Db)est unique

MySQL lit et trie les tables db (sur les colonnes Host Db et User) et host (sur les colonnesHost et Db) en mecircme temps qursquoil parcourt la table user Pour les opeacuterations relatives auxbases (INSERT UPDATE etc) MySQL interroge la table user Si lrsquoaccegraves nrsquoy est pas deacutecritla recherche se poursuit dans les tables db et host Si la colonne Host de la table db estrenseigneacutee en fonction de lrsquoaccegraves lrsquoutilisateur reccediloit ses privilegraveges

Si la colonne Host de la table db nrsquoest pas renseigneacutee ( ) cela signifie que la table hosteacutenumegravere les machines qui sont autoriseacutees agrave acceacuteder agrave une base de donneacutees en particulier Si lamachine ne correspond pas lrsquoaccegraves nrsquoest pas permis Dans le cas contraire les privilegraveges sontvalueacutes agrave Y agrave partir drsquoune intersection (et pas drsquoune union) entre les tables db et host sur lecouple (Host Db)

La table mysqlhost nrsquoest mise agrave jour ni par GRANT ni par REVOKE Il faudra directement inseacute-rer (par INSERT) modifier (par UPDATE) ou supprimer (par DELETE) les lignes de cette tableElle nrsquoest pas utiliseacutee par la plupart des serveur MySQL car elle est deacutedieacutee agrave des usages tregravesspeacutecifiques (pour geacuterer un ensemble de machines agrave accegraves seacutecuriseacute par exemple) Elle peutaussi ecirctre utiliseacutee pour deacutefinir un ensemble de machines agrave accegraves non seacutecuriseacute

En supposant que vous deacuteclariez une machine agrave accegraves non seacutecuriseacute camparolsgtrfr Ilest possible drsquoautoriser lrsquoaccegraves seacutecuriseacute agrave toutes les autres machines du reacuteseau local Ceci enajoutant des enregistrements par INSERT dans la table mysqlhost comme suit

+------------------+----+----------------------------

| Host | Db |

+------------------+----+-----------------------------

| camparolsgtrfr | | (tous les privilegraveges agrave N)

| gtrfr | | (tous les privilegraveges agrave Y)

+------------------+----+-----------------------------

Vous deacuteclareriez lrsquoinverse des conditions initiales en remplaccedilant les N par des Y et reacutecipro-quement Dans tous les cas il sera neacutecessaire de mettre agrave jour les autres tables pour affiner lesprivilegraveges

Tableau 5-9 Tables pour les accegraves distants

Caractegravere Signification pour mysqldb Signification pour mysqlhost

colonne Host colonne Db colonne Host colonne Db

toute machine toute base toute machine toute base

(chaicircne vide)

consultez la table mysqlhost

toute base toute machine toute base

4055_05_C05 Page 174 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 175

chapitre ndeg 5 Controcircle des donneacutees

Vues

Outre le controcircle de lrsquoaccegraves aux donneacutees (privilegraveges) la confidentialiteacute des informations est unaspect important qursquoun SGBD relationnel doit prendre en compte Depuis la version 5 de MySQLla confidentialiteacute est renforceacutee par lrsquoutilisation de vues (views) qui agissent comme des fenecirctres surla base de donneacutees Cette section deacutecrit les diffeacuterents types de vues qursquoon peut rencontrer

Les vues correspondent agrave ce qursquoon appelle laquo le niveau externe raquo qui reflegravete la partie visible dela base de donneacutees pour chaque utilisateur

Seules les tables contiennent des donneacutees et pourtant pour lrsquoutilisateur une vue apparaicirctcomme une table En theacuteorie les utilisateurs ne devraient acceacuteder aux informations qursquoenquestionnant des vues Ces derniegraveres masquant la structure des tables interrogeacutees En pratiquela plupart des applications se passent de ce concept en manipulant directement les tables

La figure suivante illustre ce qui a eacuteteacute dit en preacutesentant trois utilisateurs Ils travaillent chacunsur une base de donneacutees contenant des vues formeacutees agrave partir de diffeacuterentes tables

Une vue est consideacutereacutee comme une table virtuelle car elle nrsquoa pas drsquoexistence propre Seule sastructure est stockeacutee dans le dictionnaire Ses donneacutees seront extraites de la meacutemoire agrave partirdes tables source agrave la demande

Une vue est creacuteeacutee agrave lrsquoaide drsquoune instruction SELECT appeleacutee laquo requecircte de deacutefinition raquo Cetterequecircte interroge une (ou plusieurs) table(s) ou vue(s) Une vue se recharge chaque foisqursquoelle est interrogeacutee

Outre le fait drsquoassurer la confidentialiteacute des informations une vue est capable de reacutealiser descontrocircles de contraintes drsquointeacutegriteacute et de simplifier la formulation de requecirctes complexes

Figure 5-7 Les vues

Niveau externe

Table1 Table2

Vue1 Vue2

Vue3

Vue1Vue2

Vue3

Niveau physique

scheacutema1 scheacutema2

Jules

Louise

Paul

4055_05_C05 Page 175 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

176 copy Eacuteditions Eyrolles

Dans certains cas la deacutefinition drsquoune vue temporaire est neacutecessaire pour eacutecrire une requecircteqursquoil ne serait pas possible de construire agrave partir des tables seules Attribueacutees comme des privi-legraveges (GRANT) les vues ameacuteliorent la seacutecuriteacute des informations stockeacutees

Creacuteation drsquoune vue (CREATE VIEW)

Pour pouvoir creacuteer une vue dans une base vous devez posseacuteder le privilegravege CREATE VIEW etles privilegraveges en SELECT des tables preacutesentes dans la requecircte de deacutefinition de la vue Lasyntaxe SQL de creacuteation drsquoune vue est la suivante

CREATE [OR REPLACE] [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE]

VIEW [nomBase]nomVue [(listecolonnes)]

AS requecircteSELECT

[WITH [CASCADED | LOCAL] CHECK OPTION]

OR REPLACE remplace la vue par la nouvelle deacutefinition mecircme si elle existait deacutejagrave (eacutevitede deacutetruire la vue avant de la recreacuteer) Vous devez avoir le privilegravege DELETE sur la basepour beacuteneacuteficier de cette directive

ALGORITHM=MERGE la deacutefinition de la vue et sa requecircte sont fusionneacutees en interne

ALGORITHM=TEMPTABLE les reacutesultats sont extraits dans une table temporaire (TEMPO-RARY) qui est utiliseacutee par la suite Inteacuteressant si les tables source sont sujettes agrave de nombreuxverrous qui ne gecircnent plus la manipulation de la vue utilisant elle une table temporaire

Aucune option ou ALGORITHM=UNDEFINED MySQL choisit la politique agrave adoptersouvent en faveur de MERGE la seule qui convient aux vues modifiables

nomBase deacutesigne le nom de la base de donneacutees qui heacutebergera la vue En lrsquoabsence de ceparamegravetre la vue est creacuteeacutee dans la base en cours drsquoutilisation

requecircteSELECT requecircte de deacutefinition interrogeant une (ou des) table(s) ou vue(s) pourcharger les donneacutees dans la vue

bull La requecircte de deacutefinition ne peut interroger une table temporaire ni contenir de paramegravetresou de variables de session

bull Si la requecircte de deacutefinition seacutelectionne toutes les colonnes drsquoun objet source (SELECT FROMhellip) et si des colonnes sont ajouteacutees par la suite agrave cet objet la vue ne contiendra pasces colonnes deacutefinies ulteacuterieurement agrave elle Il faudra recreacuteer la vue pour prendre en comptelrsquoeacutevolution structurelle de lrsquoobjet source

WITH CHECK OPTION garantit que toute mise agrave jour de la vue par INSERT ou UPDATEsrsquoeffectuera conformeacutement au preacutedicat contenu dans la requecircte de deacutefinition

Les paramegravetres LOCAL et CASCADED (par deacutefaut) determinent la porteacutee de la veacuterificationquand une vue est deacutefinie agrave partir drsquoune autre vue LOCAL restreint la veacuterification du preacutedi-cat agrave la vue elle-mecircme CASCADED permet drsquoeacutetendre eacuteventuellement les veacuterifications auxautres vues source de la vue qui vient drsquoecirctre deacutefinie

4055_05_C05 Page 176 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 177

chapitre ndeg 5 Controcircle des donneacutees

Classification

On distingue les vues simples des vues complexes en fonction de la nature de la requecircte dedeacutefinition Le tableau suivant reacutesume ce que nous allons deacutetailler au cours de cette section

Une vue monotable est deacutefinie par une requecircte SELECT ne comportant qursquoune seule table danssa clause FROM

Vues monotables

Les meacutecanismes preacutesenteacutes ci-apregraves srsquoappliquent aussi pour la plupart aux vues multitables(eacutetudieacutees plus loin) Consideacuterons les deux vues illustreacutees par la figure suivante et deacuteriveacutees dela table Pilote La vue PilotesAF deacutecrit les pilotes drsquoAir France agrave lrsquoaide drsquoune restriction(eacuteleacutements du WHERE) La vue Etat_civil est constitueacutee par une projection de certainescolonnes (eacuteleacutements du SELECT)

Une fois creacuteeacutee une vue srsquointerroge comme une table par tout utilisateur sous reacuteserve qursquoil aitobtenu le privilegravege en lecture directement (GRANT SELECT ON nomVue TOhellip) Le tableausuivant preacutesente une interrogation des deux vues

Tableau 5-10 Classification des vues

Requecircte de deacutefinition Vue simple Vue complexe

Nombre de tables 1 1 ou plusieurs

Fonction non oui

Regroupement non oui

Mises agrave jour possibles oui pas toujours

Figure 5-8 Deux vues drsquoune table

Web

Pilote

brevet nom nbHVol adresse compa

PL-1 Soutou 890 Castanet CAST

PL-2 Laroche 500 Montauban CAST

PL-3 Lamothe 1200 Ramonville AF

PL-4 Albaric 500 Vieille-Toulouse AF

PL-5 Bidal 120 Paris ASO

PL-6 Labat 120 Pau ASO

PL-7 Tauzin 100 Bas-Mauco ASO

CREATE VIEW PilotesAF

AS SELECT FROM Pilote

WHERE compa = AF

CREATE VIEW Etat_civil AS SELECT nom nbHVol adresse compa FROM Pilote

4055_05_C05 Page 177 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

178 copy Eacuteditions Eyrolles

Agrave partir de cette table et de ces vues nous allons eacutetudier drsquoautres options de lrsquoinstructionCREATE VIEW

AliasLes alias srsquoils sont utiliseacutes deacutesignent le nom de chaque colonne de la vue Ce meacutecanismepermet de mieux controcircler les noms de colonnes Quand un alias nrsquoest pas preacutesent la colonneprend le nom de lrsquoexpression renvoyeacutee par la requecircte de deacutefinition Ce meacutecanisme sert agravemasquer les noms des colonnes de lrsquoobjet source

Les vues suivantes sont creacuteeacutees avec des qui masquent le nom des colonnes de la tablesource Les deux eacutecritures sont eacutequivalentes

Vue drsquoune vueLrsquoobjet source drsquoune vue est en geacuteneacuteral une table mais peut aussi ecirctre une vue La vuesuivante est deacutefinie agrave partir de la vue preacuteceacutedemment creacuteeacutee Notez qursquoilaurait eacuteteacute possible drsquoutiliser des alias pour renommer les colonnes de la nouvelle vue

Tableau 5-11 Interrogation drsquoune vue

Besoin et requecircte ReacutesultatSomme des heures de vol des pilotes dAir FranceSELECT SUM(nbHVol) FROM PilotesAF

+-------------+| SUM(nbHVol) |+-------------+| 170000 |+-------------+

Nombre de pilotesSELECT COUNT() FROM Etat_civil

+----------+| COUNT() |+----------+| 7 |+----------+

Web

alias

Tableau 5-12 Vue avec alias

Eacutecriture 1 Eacutecriture 2CREATE OR REPLACE VIEW PilotesPasAF ( ) AS SELECT FROM Pilote WHERE NOT (compa = AF)

CREATE OR REPLACE VIEW PilotesPasAF AS SELECT brevet nom nbHVol adresse compa FROM Pilote WHERE NOT (compa = AF)

Contenu de la vue +---------+---------+-----------+------------+---------+| |+---------+---------+-----------+------------+---------+| PL-1 | Soutou | 89000 | Castanet | CAST || PL-2 | Laroche | 50000 | Montauban | CAST || PL-5 | Bidal | 12000 | Paris | ASO || PL-6 | Labat | 12000 | Pau | ASO || PL-7 | Tauzin | 10000 | Bas-Mauco | ASO |+---------+---------+-----------+------------+---------+

Web

codepilnomPilheuresPiladressePil societe

codepil nomPilheuresPil adressePil

societe

codepil | nomPil | heuresPil | adressePil | societe

PilotesPasAF

4055_05_C05 Page 178 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 179

chapitre ndeg 5 Controcircle des donneacutees

Vues en lecture seuleLrsquooption ALGORITHM=TEMPTABLE deacuteclare la vue non modifiable par INSERT UPDATE ouDELETE

Redeacutefinissons une vue des pilotes nrsquoeacutetant pas drsquoAir France agrave lrsquoaide de cette option Les messa-ges drsquoerreur induits par la clause de lecture seule geacuteneacutereacutes par MySQL sont tregraves parlants

Vues modifiables

Lorsqursquoil est possible drsquoexeacutecuter des instructions INSERT UPDATE ou DELETE sur une vuecette derniegravere est dite laquo modifiable raquo (updatable view) Vous pouvez creacuteer une vue qui estmodifiable intrinsegravequement

Pour mettre agrave jour une vue il doit exister une correspondance biunivoque entre les lignes de lavue et celles de lrsquoobjet source De plus certaines conditions doivent ecirctre remplies

Si une vue nrsquoest pas modifiable en soi il nrsquoest pas encore possible de programmer un deacuteclen-cheur de type instead of qui prenne le pas sur lrsquoinstruction de modification de la vue en speacuteci-fiant un bloc drsquoinstructions agrave effectuer agrave la place Les mises agrave jour de la vue seraient ainsiautomatiquement reacutepercuteacutees au niveau drsquoune ou de plusieurs tables Notons que ce type dedeacuteclencheur nrsquoest arriveacute qursquoassez tardivement sous Oracle DB2 et SQL Server

Tableau 5-13 Vue drsquoune vue

Creacuteation Contenu de la vue

CREATE OR REPLACE VIEW EtatCivilPilotesPasAF AS SELECT nomPilheuresPiladressePil FROM

+---------+-----------+------------+| nomPil | heuresPil | adressePil |+---------+-----------+------------+| Soutou | 89000 | Castanet || Laroche | 50000 | Montauban || Bidal | 12000 | Paris || Labat | 12000 | Pau || Tauzin | 10000 | Bas-Mauco |+---------+-----------+------------+

Web

PilotesPasAF

Tableau 5-14 Vue en lecture seule

Creacuteation Opeacuterations impossibles

CREATE OR REPLACE VIEW PilotesPasAFRO AS SELECT FROM Pilote WHERE NOT (compa = AF)

INSERT INTO PilotesPasAFRO VALUES (PL-8Ferry5ParisASO)ERROR 1288 (HY000) The target table PilotesPasAFRO of the INSERT is not updatableUPDATE PilotesPasAFRO SET nbHvol=nbHvol+2ERROR 1288 (HY000) The target table PilotesPasAFRO of the UPDATE is not updatableDELETE FROM PilotesPasAFROERROR 1288 (HY000) The target table PilotesPasAFRO of the DELETE is not updatable

Web

ALGORITHM=TEMPTABLE

4055_05_C05 Page 179 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

180 copy Eacuteditions Eyrolles

Pour qursquoune vue simple soit modifiable sa requecircte de deacutefinition doit respecter les critegraveres suivants

bull pas de directive DISTINCT de fonction (AVG COUNT MAX MIN SUM ou VARIANCE)drsquoexpression dans le SELECT

bull pas de GROUP BY ORDER BY ou HAVING

Dans notre exemple nous constatons qursquoil sera quand mecircme possible drsquoajouter un pilote agrave la vueEtat_civil bien que la cleacute primaire de la table source ne soit pas renseigneacutee MySQL insegravere agravela place en lrsquoabsence de valeur par deacutefaut de la cleacute primaire la chaicircne vide ( ) si la cleacute avaiteacuteteacute une seacutequence les insertions se feraient normalement Cette opeacuteration ne pourra donc se faireqursquoune seule fois apregraves cela sera contradictoire avec la condition de correspondance biunivo-que

En revanche il sera possible de modifier les colonnes de cette vue On pourra aussi ajoutermodifier (sous reacuteserve de respecter les eacuteventuelles contraintes issues des colonnes de la tablesource) ou supprimer des pilotes en passant par la vue PilotesAF

La derniegravere instruction est paradoxale car elle permet drsquoajouter un pilote de la compagnieASO en passant par la vue des pilotes de la compagnie AF La directive WITH CHECKOPTION permet drsquoeacuteviter ces effets de bord indeacutesirables pour lrsquointeacutegriteacute de la base

Tableau 5-15 Mises agrave jour de vues

Opeacuterations possibles Opeacuterations non conseilleacutees et impossibles

Suppression des pilotes de ASO

DELETE FROM WHERE compa = ASOLe pilote Lamothe double ses heuresUPDATE SET nbHVol = nbHVol2 WHERE nom = Lamothe

Ajout drsquoun pilote (pas conseilleacute)INSERT INTO VALUES(Raffarin10PoitiersASO)

Ajout drsquoun autre pilote impossibleINSERT INTO Etat_civil VALUES (Lebur20BordeauxASO)ERROR 1062 (23000) Duplicate entry for key 1

Ajout drsquoun piloteINSERT INTO VALUES (PL-8Ferry5 ParisAF)ModificationUPDATE SET nbHVol = nbHVol2SuppressionDELETE FROM WHERE nom=FerryAjout drsquoun pilote qui nrsquoest pas de AF INSERT INTO VALUES (PL-9Caboche 600RennesASO)

Toute mise agrave jour qui ne respecterait pas les contraintes de la table Pilote

Web

Etat_civil

Etat_civil

Etat_civil

PilotesAF

PilotesAF

PilotesAF

PilotesAF

4055_05_C05 Page 180 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 181

chapitre ndeg 5 Controcircle des donneacutees

Directive CHECK OPTION

La directive WITH CHECK OPTION empecircche un ajout ou une modification non conformes agrave ladeacutefinition de la vue

Interdisons lrsquoajout (ou la modification de la colonne compa) drsquoun pilote au travers de la vuePilotesAF si le pilote nrsquoappartient pas agrave la compagnie de code AF Il est neacutecessaire deredeacutefinir la vue PilotesAF Le script suivant deacutecrit la redeacutefinition de la vue lrsquoajout drsquounpilote et les tentatives drsquoajout et de modification ne respectant pas les caracteacuteristiques de lavue Les messages sont tregraves clairs

Vues complexes

Une vue complexe est caracteacuteriseacutee par le fait qursquoelle contient dans sa deacutefinition plusieurstables (jointures) et une fonction appliqueacutee agrave des regroupements ou agrave des expressions La miseagrave jour de telles vues nrsquoest pas toujours possible

Pour pouvoir modifier une vue complexe les restrictions sont les suivantes

bull La requecircte de deacutefinition ne doit pas contenir de sous-interrogation (jointure proceacutedurale)

bull Il nrsquoest pas possible drsquoutiliser drsquoopeacuterateur ensembliste (sauf UNION [ALL])

La figure suivante preacutesente deux vues complexes qui ne sont pas modifiables La vue multita-ble Pilotes_multi_AF est creacuteeacutee agrave partir drsquoune jointure entre les tables Compagnie etPilote La vue Moyenne_Heures_Pil est creacuteeacutee agrave partir drsquoun regroupement de la tablePilote

Tableau 5-16 Vue avec CHECK OPTION

Opeacuterations possibles Opeacuterations impossibles

Recreacuteation de la vueCREATE OR REPLACE VIEW PilotesAF AS SELECT FROM pilote WITH CHECK OPTION

Nouveau piloteINSERT INTO PilotesAF VALUES(PL-11Teste900RevelAF)Query OK 1 row affected (003 sec)

Ajout drsquoun piloteINSERT INTO PilotesAF VALUES (PL-9Caboche600RennesASO)ERROR 1369 (HY000) CHECK OPTION failedbdsoutouPilotesAF

Modification de pilotesUPDATE PilotesAF SET compa=ASOERROR 1369 (HY000) CHECK OPTION failedbdsoutouPilotesAF

Web

WHERE compa = AF

Web

4055_05_C05 Page 181 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

182 copy Eacuteditions Eyrolles

Mises agrave jour

Il semblerait qursquoon ne puisse inseacuterer aucun enregistrement dans ces vues du fait de la coheacute-rence qursquoil faudrait eacutetablir du sens vue vers tables Les messages drsquoerreur geacuteneacutereacutes par MySQLsont diffeacuterents suivant la nature de la vue (monotable ou multitable) Nous verrons commentreacutesoudre lrsquoerreur du deuxiegraveme cas

On pourrait croire qursquoil en est de mecircme pour les modifications Ce nrsquoest pas le cas Alors quela vue monotable Moyenne_Heures_Pil nrsquoest pas modifiable ni par UPDATE ni parDELETE (message drsquoerreur 1288) la vue multitable Pilotes_multi_AF est transformabledans une certaine mesure car la table Pilote (qui entre dans sa composition) est ditelaquo proteacutegeacutee par cleacute raquo (key preserved) Nous verrons dans le prochain paragraphe la significa-tion de cette notion

Figure 5-9 Vues complexes

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

CREATE VIEW Pilotes_multi_AF

AS SELECT pbrevet pnom pnbHVol cville cnomComp FROM Pilote p Compagnie c WHERE pcompa = ccomp AND pcompa = AF

CREATE VIEW Moyenne_Heures_Pil AS SELECT compa

AVG(nbHVol) moyenne FROM Pilote GROUP BY compa

compa moyenne

AF 675 SING 1000

Tableau 5-17 Tentatives drsquoinsertions dans des vues complexes

Vue monotable Vue multitable

INSERT INTO Moyenne_Heures_Pil VALUES (TAT50)ERROR 1288 (HY000) The targettable Moyenne_Heures_Pil of theINSERT is not updatable

INSERT INTO Pilotes_multi_AF VALUES(PL-4Test400CastanetCastanet AL)ERROR 1394 (HY000) Can not insert into joinview bdsoutouPilotes_multi_AF without fields list

Web

4055_05_C05 Page 182 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 183

chapitre ndeg 5 Controcircle des donneacutees

Les colonnes de la vue correspondant agrave la table proteacutegeacutee par cleacute ne sont pas les seules agrave pou-voir ecirctre modifieacutees Ici nbHVol peut ecirctre mise agrave jour car elle appartient agrave la table proteacutegeacutee ville qui nrsquoappartient pas agrave une table proteacutegeacutee peut aussi ecirctre modifeacutee

Les suppressions ne se reacutepercutent pas sur les enregistrements de la table proteacutegeacutee par cleacute(Pilote)

Modifions et tentons de supprimer des enregistrements agrave travers la vue multitable Pilotes_multi_AF

Tableau 5-18 Mise agrave jour drsquoune vue multitable

Mise agrave jour Reacutesultats

-- Multiplie par 2 le nombre drsquoheuresUPDATE SET nbHVol = nbHVol 2

Query OK 2 rows affectedRows matched 2 Changed 2 Warnings 0

SELECT brevetnomnbHVol FROM Pilotes_multi_AF+--------+-------------+---------+| brevet | nom | nbHVol |+--------+-------------+---------+| PL-1 | Louise Ente | 90000 || PL-2 | Paul Ente | 180000 |+--------+-------------+---------+

-- Modif de la ville de la compagnieUPDATE SET ville = Orly

SELECT brevetnomville FROM Pilotes_multi_AF+--------+-------------+-------+| brevet | nom | ville |+--------+-------------+-------+| PL-1 | Louise Ente | Orly || PL-2 | Paul Ente | Orly |+--------+-------------+-------+

SELECT compvillenomComp FROM Compagnie+------+-----------+--------------+| comp | ville | nomComp |+------+-----------+--------------+| AF | Orly | Air France || SING | Singapour | Singapore AL |+------+-----------+--------------+

--Pas possible DELETE FROM ERROR 1395 (HY000) Can not delete

from join view bdsoutouPilotes_multi_AF

WebPilotes_multi_AF

Pilotes_multi_AF

Pilotes_multi_AF

4055_05_C05 Page 183 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

184 copy Eacuteditions Eyrolles

Tables proteacutegeacutees (key preserved tables)

Une table est dite proteacutegeacutee par sa cleacute (key preserved) si sa cleacute primaire est preacuteserveacutee dans laclause de jointure et se retrouve en tant que colonne de la vue multitable (elle peut jouer le rocirclede cleacute primaire de la vue)

En consideacuterant les donneacutees initiales pour la vue multitable Vue_Multi_Comp_Pil la tablepreacuteserveacutee est la table Pilote car la colonne brevet identifie chaque enregistrement extraitde la vue alors que la colonne comp ne le fait pas

Cela ne veut pas dire pour autant que cette vue est modifiable Eacutetudions agrave preacutesent les condi-tions qui reacutegissent ces limitations

Critegraveres

Une vue multitable modifiable (updatable join view ou modifiable join view) est une vue quinrsquoest pas deacutefinie avec lrsquooption ALGORITHM=TEMPTABLE et qui est telle que la requecircte dedeacutefinition contient plusieurs tables dans la clause FROM

Aucune suppression nrsquoest possible

Les insertions sont permises seulement en isolant toutes les colonnes drsquoune seule table source

Attention aux effets de bord quand vous modifiez une colonne provenant drsquoune table non pro-teacutegeacutee par cleacute Il est plus naturel de modifier directement la table en question

Modifions de diffeacuterentes maniegraveres la vue multitable Vue_Multi_Comp_Pil La premiegraveretente une suppression les deux suivantes modifient tantocirct une colonne de la table proteacutegeacuteetantocirct une colonne de la table non proteacutegeacutee Les deux derniegraveres instructions insegraverent danschacune des deux tables

Tableau 5-19 Vue multitable

Creacuteation de la vue Reacutesultats

CREATE VIEW

AS SELECT ccomp cnomComp pnom pnbHVol FROM Pilote p Compagnie c WHERE pcompa=ccomp

+------+--------------+--------+-------------+---------+| comp | nomComp | brevet | nom | nbHVol |+------+--------------+--------+-------------+---------+| AF | Air France | PL-1 | Louise Ente | 45000 || AF | Air France | PL-2 | Paul Ente | 90000 || SING | Singapore AL | PL-3 | Paul Soutou | 100000 |+------+--------------+--------+-------------+---------+

WebVue_Multi_Comp_Pil

pbrevet

4055_05_C05 Page 184 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 185

chapitre ndeg 5 Controcircle des donneacutees

Autres utilisations de vues

Les vues peuvent eacutegalement servir pour simplifier lrsquoeacutecriture de requecirctes complexes renforcerla confidentialiteacute et une certaine inteacutegriteacute

Tableau 5-20 Mises agrave jour

Mise agrave jour Reacutesultats

DELETE FROM Vue_Multi_Comp_Pil WHERE comp=AF

ERROR 1395 (HY000) Can not delete from join view bdsoutouVue_Multi_Comp_Pil

UPDATE Vue_Multi_Comp_Pil SET nbHVol = nbHVol 3Query OK 3 rows affected (010 sec)

Warnings 0

SELECT brevet nbHVol FROM Pilote+--------+---------+| brevet | nbHVol |+--------+---------+| PL-1 | 135000 || PL-2 | 270000 || PL-3 | 300000 |+--------+---------+

UPDATE Vue_Multi_Comp_Pil SET nomComp = Dupond Query OK 2 rows affected (038 sec)

Warnings 0

(SELECT compvillenomComp FROM Compagnie+------+-----------+---------+| comp | ville | nomComp |+------+-----------+---------+| AF | Paris | Dupond || SING | Singapour | Dupond |+------+-----------+---------+

INSERT INTO Vue_Multi_Comp_Pil VALUES (PL-5 Jean2500)

SELECT brevetnomnbHVol FROM Pilote+--------+-------------+---------+| brevet | nom | nbHVol |+--------+-------------+---------+| PL-1 | Louise Ente | 135000 || PL-2 | Paul Ente | 270000 || PL-3 | Paul Soutou | 300000 || |+--------+-------------+---------+

INSERT INTO Vue_Multi_Comp_Pil VALUES (TAT Test)

SELECT compvillenomComp FROM Compagnie+------+-----------+---------+| comp | ville | nomComp |+------+-----------+---------+| AF | Paris | Dupond || SING | Singapour | Dupond || |+------+-----------+---------+

Web

Rows matched 3 Changed 3

Rows matched 3 Changed 2

(brevetnomnbHVol)

PL-5 | Jean | 250000

(compnomComp)

TAT | Paris | Test

4055_05_C05 Page 185 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

186 copy Eacuteditions Eyrolles

Simplifier les noms

Une vue permet de simplifier la manipulation drsquoune table ayant un nom long ou des colonnesportant des noms compliqueacutes Consideacuterons par exemple la table COLLATION_CHARACTER_SET_APPLICABILITY[COLLATION_NAMECHARACTER_SET_NAME] qui deacutecrit les colla-tions des jeux de caractegraveres disponibles et qui est situeacutee dans la base de donneacutees stockant ledictionnaire des donneacutees (INFORMATION_SCHEMA) Nous eacutetudierons dans la prochainesection les diffeacuterentes tables de cette base systegraveme Supposons que lrsquoon deacutesire souvent acceacutederagrave cette table pour connaicirctre les diffeacuterentes collations possibles pour les jeux de caractegraveres latins

Creacuteons la vue CollationsLatines qui simplifie lrsquoaccegraves agrave cette table au niveau du nommais aussi au niveau des colonnes Interrogeons cette vue de maniegravere agrave connaicirctre les collationsspeacutecifiques agrave la langue de Moliegravere ou agrave celle de Goethe

On dira que MySQL est plus laquo brancheacute raquo par la nouveauteacute Goethe eacutetant neacute 76 ans apregraves ledeacutecegraves de Moliegravere Aucun french dans la base donc

Contraintes de veacuterification

Nous avons deacutecrit au chapitre 1 les contraintes de veacuterification (CHECK) qui ne sont pas encoretotalement prises en charge Il est possible de programmer ce type de contraintes par des vues

Consideacuterons la table Pilote illustreacutee ci-apregraves et programmons par lrsquointermeacutediaire de la vueVueGradePilotes la contrainte veacuterifiant qursquoun pilote

ne peut ecirctre commandant de bord qursquoagrave la condition qursquoil ait entre 1 000 et 4 000 heures de vol

ne peut ecirctre copilote qursquoagrave la condition qursquoil ait entre 100 et 1 000 heures de vol

ne peut ecirctre instructeur qursquoagrave partir de 3 000 heures de vol

Les regravegles conseilleacutees pour manipuler les enregistrements drsquoune vue v1 deacutecrivant des con-traintes de veacuterification sur une table t1 sont les suivantes

bull modification et insertion par la vue v1

bull suppression et lecture par la table t1

Tableau 5-21 Vue pour simplifier les noms

Creacuteation Interrogation

CREATE VIEW CollationsLatines (collationjeu) AS SELECT FROM INFORMATION_SCHEMAcrarr COLLATION_CHARACTER_SET_APPLICABILITY WHERE CHARACTER_SET_NAME LIKE Latin

SELECT FROM CollationsLatines WHERE collation LIKE french OR collation LIKE german+-------------------+--------+| collation | jeu |+-------------------+--------+| latin1_german1_ci | latin1 || latin1_german2_ci | latin1 |+-------------------+--------+

Web

4055_05_C05 Page 186 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 187

chapitre ndeg 5 Controcircle des donneacutees

Manipulons agrave preacutesent la vue de notre exemple

Confidentialiteacute

La confidentialiteacute est une des vocations premiegraveres des vues Outre lrsquoutilisation de variablesdrsquoenvironnement il est possible de restreindre lrsquoaccegraves agrave des tables en fonction de momentspreacutecis

Les vues suivantes limitent temporellement les accegraves en lecture et en eacutecriture agrave des tables

Notez qursquoil est possible en plus de limiter lrsquoaccegraves agrave un utilisateur particulier en utilisant unevariable drsquoenvironnement (exemple rajout de la condition AND CURRENT_USER() =Paullocalhost agrave une vue)

Figure 5-10 Vue simulant la contrainte CHECK

Web Pilote

brevet nom nbHVol grade

PL-1 Daniel Vielle 1000 CDB PL-2 Benoit Treilhou 450 COPI PL-3 Pierre Filoux 9000 INST PL-4 Philippe Minier 1000 COPI

CREATE VIEW VueGradePilotesAS SELECT brevetnomnbHVolgradeFROM PiloteWHERE (grade =CDB

AND nbHVol BETWEEN 1000 AND 4000) OR (grade = COPI

AND nbHVol BETWEEN 100 AND 1000) OR (gr ade = INST AND nb HVol gt 3000)

WITH CHECK OPTION

Tableau 5-22 Manipulations des vues pour lrsquointeacutegriteacute reacutefeacuterentielle

Mises agrave jour possibles Mises agrave jour non valides ERROR 1369 (HY000) CHECK OPTION failed bdsoutouVueGradePilotes

INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-1Daniel Vielle )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-2Benoit Treihlou )INSERT INTO VueGradePilotes(brevetnomnbHVolgrade) VALUES (PL-3Pierre Filoux )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-4Philippe Minier )

INSERT INTO VueGradePilotes (brevetnomnbHVolgrade)VALUES (PL-5Trop jeune )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-6Inexperimente )

UPDATE VueGradePilotes SET WHERE brevet = PL-2

UPDATE VueGradePilotes SET WHERE brevet = PL-4

UPDATE VueGradePilotes SET WHERE brevet = PL-3

Web

1000CDB

450COPI

9000INST

1000COPI

100CDB

2999INST

grade =INST

grade =CDB nbHVol= 50

4055_05_C05 Page 187 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

188 copy Eacuteditions Eyrolles

Transmission de droits

Les meacutecanismes de transmission et de reacutevocation de privilegraveges que nous avons eacutetudieacutes srsquoappli-quent eacutegalement aux vues Ainsi si un utilisateur deacutesire transmettre des droits sur une partiedrsquoune de ses tables il utilisera une vue Seules les donneacutees appartenant agrave la vue seront acces-sibles aux beacuteneacuteficiaires

Les privilegraveges objet qursquoil est possible drsquoattribuer sur une vue sont les mecircmes que ceux appli-cables sur les tables (SELECT INSERT UPDATE sur une ou plusieurs colonnes DELETE)

Modification drsquoune vue (ALTER VIEW)

Vous devez au moins posseacuteder les privilegraveges CREATE VIEW et DELETE au niveau drsquoune vuepour pouvoir la modifier La syntaxe SQL est la suivante

ALTER [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE]

VIEW [nomBase]nomVue [(listecolonnes)]

AS requecircteSELECT

[WITH [CASCADED | LOCAL] CHECK OPTION]

Tableau 5-23 Vues pour restreindre lrsquoaccegraves agrave des moments preacutecis

Deacutefinition de la vue Accegraves

CREATE VIEW VueDesCompagniesJoursFeries AS SELECT FROM Compagnie WHERE

Restriction en lecture de la table Compagnie lessamedis et dimanches Mises agrave jour possibles agravetout moment

CREATE VIEW VueDesPilotesJoursOuvrables AS SELECT FROM Pilote WHERE AND DATE_FORMAT(SYSDATE()W) NOT IN (Sunday Saturday) WITH CHECK OPTION

Restriction en lecture et en eacutecriture (agrave cause deWITH CHECK OPTION) de la table Pilote lesjours ouvrables de 8h30 agrave 17h30

Web

DATE_FORMAT(SYSDATE()W)IN (SundaySaturday)

CURTIME()+0BETWEEN 83000 AND 173000

Tableau 5-24 Privilegraveges sur les vues

Attribution du privilegravege Signification

GRANT SELECT ON VueDesCompagniesJoursFeries TO Paullocalhost

Accegraves en local de lrsquoutilisateur Paul en lec-ture sur la vue VueDesCompagniesJoursFeacuterieacutes

GRANT INSERT ON VueDesPilotesJoursOuvrables TO Juleslocalhost

Accegraves en local de lrsquoutilisateur Jules eneacutecriture sur la vue VueDesCompagniesJoursFeacuterieacutes

4055_05_C05 Page 188 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 189

chapitre ndeg 5 Controcircle des donneacutees

Les transformations peuvent concerner toutes les parties drsquoune vue existante la politique decreacuteation (ALGORITHM) la liste des colonnes la requecircte etc Voir la section Creacuteation drsquoune vue

Visualisation drsquoune vue (SHOW CREATE VIEW)

Pour pouvoir visualiser la requecircte de deacutefinition drsquoune vue lrsquoinstruction que MySQL proposeest la suivante

SHOW CREATE VIEW [nomBase]nomVue

En arrangeant lrsquoeacutetat de sortie vous pouvez deacutecouvrir comment MySQL stocke la deacutefinition dela vue preacuteceacutedemment creacuteeacutee

SHOW CREATE VIEW VueDesCompagniesJoursFeries+-----------------------------+-----------------------------------------------+| View | Create View |+-----------------------------+-----------------------------------------------+| VueDesCompagniesJoursFeries | CREATE ALGORITHM=UNDEFINED || | DEFINER=`root``localhost` SQL SECURITY || | DEFINER VIEW `VueDesCompagniesJoursFeries` AS || | select sql_no_cache `Compagnie``comp` AS || | `comp``Compagnie``nrue` AS || | `nrue``Compagnie``rue` AS || | `rue``Compagnie``ville` AS || | `ville``Compagnie``nomComp` AS `nomComp` || | from `Compagnie` where || | (date_format(sysdate()_latin1W) in || | (_latin1Sunday_latin1Saturday)) |+-----------------------------+-----------------------------------------------+

Suppression drsquoune vue (DROP VIEW)

Vous devez posseacuteder le privilegravege DROP sur une vue pour pouvoir la supprimer

La suppression drsquoune vue nrsquoentraicircne pas la destruction des donneacutees qui reacutesident toujours dansles tables

La syntaxe SQL est la suivante

DROP VIEW [IF EXISTS]

[nomBase]nomVue [nomBase2]nomVue2

[RESTRICT | CASCADE]

IF EXISTS eacutevite une erreur dans le cas ougrave la vue nrsquoexiste pas

RESTRICT et CASCADE ne sont pas encore opeacuterationnels il concerneront probablement lareacutepercussion de la suppression entre vues interdeacutependantes

4055_05_C05 Page 189 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

190 copy Eacuteditions Eyrolles

Dictionnaire des donneacutees

Le dictionnaire des donneacutees (metadata ou data dictionary) est une partie majeure drsquoune basede donneacutees MySQL qursquoon peut assimiler agrave une structure centraliseacutee

Pour MySQL 16 vues sont issues de tables systegraveme non visibles Ces vues qui sont appeleacuteestables par abus de langage (dans la documentation officielle dans les livres et sur les forums1)et qui sont situeacutees dans la base INFORMATION_SCHEMA suffisent agrave stocker toutes lesinformations deacutecrivant tous les objets contenus dans toutes les bases de donneacutees MySQL serapproche davantage de DB2 et de SQL Server que drsquoOracle (qui possegravede 600 vues) Lesnoms des vues sont similaires et se rapprochent de la speacutecification ANSIISO SQL2003standard Part 11 Schemata

Constitution

Le dictionnaire des donneacutees contient

la deacutefinition des tables vues index seacutequences proceacutedures fonctions et deacuteclencheurs

la description de lrsquoespace disque alloueacute et occupeacute par chaque objet

les valeurs par deacutefaut des colonnes (DEFAULT)

la description des contraintes drsquointeacutegriteacute reacutefeacuterentielle (de veacuterification agrave venir)

le nom des utilisateurs de la base

les privilegraveges pour chaque utilisateur

des informations drsquoaudit (accegraves aux objets) et drsquoautre nature (commentaires par exemple)

Toutes les tables du dictionnaire des donneacutees ne sont accessibles qursquoen lecture seulementElles appartiennent agrave la base de donneacutees INFORMATION_SCHEMA Lrsquointerrogation du diction-naire des donneacutees est permise agrave tout utilisateur (qui ne verra que les objets qui lui sont toute-fois accessibles avec ses propres privilegraveges) et peut se faire au travers de requecirctes SELECT oupar le biais de la commande SHOW

Toutes les informations contenues dans les tables du dictionnaire des donneacutees sont codeacutees enminuscules

Le dictionnaire des donneacutees est mis automatiquement agrave jour apregraves chaque instruction SQL duLMD (INSERT UPDATE DELETE LOCK TABLE)

Les avantages drsquointerroger le dictionnaire des donneacutees par des requecirctes sont les suivants

1 Je conserve le vocable de laquo vue raquo pour ecirctre plus pregraves de la reacutealiteacute Cependant parler de table ou de vue est eacutequiva-lent puisqursquoelles sont interrogeables de la mecircme maniegravere par SELECT

4055_05_C05 Page 190 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 191

chapitre ndeg 5 Controcircle des donneacutees

Conforme aux regravegles drsquoEF Codd (le pegravere du modegravele relationnel) toutes les manipula-tions sont reacutealiseacutees agrave lrsquoaide des opeacuterateurs relationnels sur des tables

Inutile drsquoapprendre de nouvelles instructions (SHOW paramegravetres) proprieacutetaires deMySQL La migration vers un autre SGBD est ainsi faciliteacutee

Les possibiliteacutes drsquoextraction sont quasiment illimiteacutees du fait du grand nombre de tables etde jointures (ou drsquoautres opeacuterateurs) possible

Vous avez tellement souffert au chapitre 4 que vous avez ici lrsquooccasion de mettre agravelrsquoeacutepreuve vos connaissances dans un contexte plus laquo systegraveme raquo

Modegravele graphique du dictionnaire des donneacutees

Le diagramme suivant ndash qui srsquoapparente plus au niveau logique car les cleacutes eacutetrangegraveresapparaissent ndash tireacute de httpmysqldevelopmentcom deacutecrit la structure des vues du diction-naire des donneacutees

Deacutemarche agrave suivre

La deacutemarche agrave suivre afin drsquointerroger correctement le dictionnaire des donneacutees agrave propos drsquounobjet est la suivante

trouver le nom de la vue (ou des vues) pertinente(s) agrave partir du scheacutema preacuteceacutedent

choisir les colonnes de la vue (ou des vues) agrave seacutelectionner (soit agrave partir du graphique soiten affichant la structure de la vue par la commande DESCRIBE)

interroger la vue (ou les vues) en exeacutecutant une instruction SELECT contenant les colonnesinteacuteressantes

Recherche du nom drsquoune vue

Il nrsquoy a pas de moyen automatique de trouver le nom de la vue pertinente Cela dit il nrsquoy en aque 16 et vous en aurez vite fait le tour

Choisir les colonnes

Le choix des colonnes drsquoune vue du dictionnaire des donneacutees srsquoeffectue apregraves avoir listeacute lastructure de cette vue (par DESCRIBE) Le nom de la colonne est en geacuteneacuteral assez parlantDans notre exemple la vue contient huit colonnes Il apparaicirct que la clause de deacutefinition dechaque vue est contenue dans la colonne VIEW_DEFINITION La colonne CHECK_OPTIONdoit indiquer en principe le fait que la vue est deacuteclareacutee avec une contrainte de veacuterificationMais quelle colonne renseigne donc le nom de ladite vue

4055_05_C05 Page 191 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

192 copy Eacuteditions Eyrolles

Figure 5-11 Modegravele graphique du dictionnaire des donneacutees

4055_05_C05 Page 192 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 193

chapitre ndeg 5 Controcircle des donneacutees

DESCRIBE INFORMATION_SCHEMAVIEWS

+-----------------+--------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-----------------+--------------+------+-----+---------+-------+

| TABLE_CATALOG | varchar(512) | YES | | NULL | |

| TABLE_SCHEMA | varchar(64) | NO | | | |

| TABLE_NAME | varchar(64) | NO | | | |

| VIEW_DEFINITION | longtext | NO | | | |

| CHECK_OPTION | varchar(8) | NO | | | |

| IS_UPDATABLE | varchar(3) | NO | | | |

| DEFINER | varchar(77) | NO | | | |

| SECURITY_TYPE | varchar(7) | NO | | | |

+-----------------+--------------+------+-----+---------+-------+

Interroger la vue

Lrsquointerrogation de la vue sur les colonnes choisies est lrsquoeacutetape finale de la recherche de donneacuteesdans le dictionnaire Il convient drsquoeacutecrire une requecircte monotable ou multitable (jointures) quiextrait des donneacutees contenues dans la vue Ces donneacutees sont en fait contenues dans des tablessystegraveme qui ne sont pas accessibles pour des raisons seacutecuritaires

Supposons que je sois root en local et que je deacutesire connaicirctre le nom lrsquoemplacement et lecaractegravere contraint de toutes les vues existantes

SELECT TABLE_SCHEMATABLE_NAMECHECK_OPTION FROM INFORMATION_SCHEMAVIEWS+--------------+-----------------------------+--------------+| TABLE_SCHEMA | TABLE_NAME | CHECK_OPTION |+--------------+-----------------------------+--------------+| bdnouvelle | VueDesSocietes | NONE || bdsoutou | VueDesPilotesJoursOuvrables | CASCADED |+--------------+-----------------------------+--------------+

Si jrsquoavais voulu connaicirctre les vues contenues seulement dans la base bdsoutou il suffisaitdrsquoajouter la condition (WHERE TABLE_SCHEMA=bdsoutou)

Vous pouvez noter que MySQL utilise

La colonne TABLE_SCHEMA pour deacutesigner une database

La colonne TABLE_NAME pour stocker le nom de chaque vue des diffeacuterents scheacutemas Ici lanorme SQL doit y ecirctre pour quelque chose (Oracle nomme la colonne VIEW_NAME)

La colonne CHECK_OPTION pour indiquer le caractegravere restreint de chaque vue (lapremiegravere nrsquoest pas restreinte la seconde lrsquoest)

Classification des vues

Le tableau suivant classifie les vues selon leur fonctionnaliteacute Notez qursquoaucune redondance nide synonyme nrsquoexistent (si vous voulez reacutealiser une extraction pour deacutecouvrir quelque choseil nrsquoy aura pas beaucoup de requecirctes diffeacuterentes possibles)

4055_05_C05 Page 193 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

194 copy Eacuteditions Eyrolles

Interrogeons agrave preacutesent quelques-unes de ces vues dans le cadre drsquoexemples concrets

Bases de donneacutees du serveur

La requecircte suivante interroge la vue SCHEMATA et permet de retrouver les caracteacuteristiques(jeux de caractegraveres) des bases de donneacutees heacutebergeacutees par le serveur

SELECT SCHEMA_NAME AS Base de donnees

AS Jeu caracteres

AS Collation

FROM INFORMATION_SCHEMASCHEMATA

+--------------------+----------------+-------------------+

| Base de donnees | Jeu caracteres | Collation |

+--------------------+----------------+-------------------+

| information_schema | utf8 | utf8_general_ci |

| bdnouvelle | ascii | ascii_general_ci |

| bdsoutou | latin1 | latin1_swedish_ci |

| mysql | latin1 | latin1_swedish_ci |

| test | latin1 | latin1_swedish_ci |

+--------------------+----------------+-------------------+

Tableau 5-25 Vues du dictionnaire des donneacutees

Nature de lrsquoobjet Vues

Serveur SCHEMATA caracteacuteristiques du serveur (jeux de caractegraveres utiliseacutes)CHARACTER_SETS informations sur les colonnes pour lesquelles lrsquoutilisa-teur a reccedilu une autorisationCOLLATIONS et COLLATION_CHARACTER_SET_APPLICABILITY rela-tifs aux jeux de caractegraveres

Privilegraveges SCHEMA_PRIVILEGES liste des preacuterogatives au niveau databaseTABLE_PRIVILEGES liste des preacuterogatives au niveau tableUSER_PRIVILEGES liste des preacuterogatives au niveau userCOLUMN_PRIVILEGES liste des preacuterogatives au niveau columns

Tables et seacutequences TABLES caracteacuteristiques des tables (et seacutequences) dans les bases

Colonnes COLUMNS colonnes des tables et vues

Index STATISTICS description des index

Contraintes TABLE_CONSTRAINTS deacutefinition des contraintes de tablesKEY_COLUMN_USAGE composition des contraintes (colonnes)

Vues VIEWS description des vues

Sous-programmes ROUTINES description des sous-programmes stockeacutesTRIGGERS description des deacuteclencheurs

DEFAULT_CHARACTER_SET_NAME

DEFAULT_COLLATION_NAME

4055_05_C05 Page 194 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 195

chapitre ndeg 5 Controcircle des donneacutees

Notez que MySQL utilise

la colonne DEFAULT_CHARACTER_SET_NAME pour deacutesigner le jeu de caractegraveres drsquounedatabase Le dictionnaire est lui-mecircme codeacute en utf8

la colonne DEFAULT_COLLATION_NAME pour deacutesigner la collation du jeu de caractegraveres

Les colonnes CATALOG_NAME et SQL_PATH ne sont pas encore renseigneacutees Elles proviennenttoutes deux de la speacutecification de la norme SQL La premiegravere est relative au concept descheacutema (qursquoon peut assimiler agrave une collection de bases) et la seconde concerne un nom sym-bolique qursquoon pourrait associer agrave une routine (sous-programme)

Composition drsquoune base

La requecircte suivante interroge la vue TABLES et deacutecrit la composition des bases de donneacuteesutilisateur (jrsquoai filtreacute volontairement les lignes qui correspondent aux bases de MySQL)

SELECT TABLE_SCHEMATABLE_NAME FROM INFORMATION_SCHEMATABLES WHERE TABLE_SCHEMA NOT IN (information_schematestmysql)+--------------+-----------------------------+------------+-------------------+| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | DATE(CREATE_TIME) |+--------------+-----------------------------+------------+-------------------+| bdnouvelle | VueDesSocietes | VIEW | NULL || bdsoutou | Installer | BASE TABLE | 2005-11-30 || bdsoutou | Logiciel | BASE TABLE | 2005-11-30 || bdsoutou | PCSeuls | BASE TABLE | 2005-11-30 || bdsoutou | Pilote | BASE TABLE | 2005-11-30 || bdsoutou | Poste | BASE TABLE | 2005-11-30 || bdsoutou | Salle | BASE TABLE | 2005-11-30 || bdsoutou | Segment | BASE TABLE | 2005-11-30 || bdsoutou | Softs | BASE TABLE | 2005-11-30 || bdsoutou | Types | BASE TABLE | 2005-11-30 || bdsoutou | VueDesPilotesJoursOuvrables | VIEW | NULL |+--------------+-----------------------------+------------+-------------------+

Vous pouvez remarquer que MySQL utilise

la colonne TABLE_TYPE pour deacutesigner le type de la structure de stockage (les tablestemporaires si elles existent nrsquoapparaissent pas)

la colonne CREATE_TIME pour deacutesigner la date de creacuteation de lrsquoobjet

Deacutetail de stockage drsquoune base

En utilisant la mecircme vue du dictionnaire inteacuteressons-nous agrave la table Installer dans la basebdsoutou qui fait partie du scheacutema des exercices de ce livre La requecircte suivante extrait desinformations inteacuteressantes

TABLE_TYPEDATE(CREATE_TIME)

4055_05_C05 Page 195 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

196 copy Eacuteditions Eyrolles

SELECT FROM INFORMATION_SCHEMATABLES WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+--------+----------------+------------+----------------+-------------+| ENGINE | AUTO_INCREMENT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |+--------+----------------+------------+----------------+-------------+| InnoDB | 15 | 14 | 1170 | 16384 |+--------+----------------+------------+----------------+-------------+

Notez que MySQL utilise

la colonne ENGINE pour deacutesigner le type de moteur de stockage de la table en question

la colonne AUTO_INCREMENT pour deacutesigner la prochaine valeur de la seacutequence

la colonne TABLE_ROWS pour donner le nombre drsquoenregistrements de la table (ici crsquoestbien coheacuterent avec la seacutequence qui fait office de cleacute primaire)

la colonne AVG_ROW_LENGTH pour deacutesigner la taille moyenne drsquoune ligne en octets

la colonne DATA_LENGTH pour deacutesigner la taille de la table en octets

Citons pour en terminer avec cette vue les colonnes

TABLE_COLLATION qui indique le jeu de caractegraveres de la table

TABLE_COMMENT qui renseigne notamment agrave propos des reacutefeacuterences entre tables par lescleacutes eacutetrangegraveres

Structure drsquoune table

Inteacuteressons-nous agrave preacutesent agrave la vue COLUMNS qui deacutecrit la structure des tables au niveaucolumn level

Structure au premier niveau

La requecircte suivante deacutecrit en partie la table Installer Notez que ccedila ressemble assez auDESCRIBE (normal car lrsquoinstruction a eacuteteacute programmeacutee agrave lrsquoaide drsquoune requecircte analogue)

SELECT FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+-------------+-----------+------------------+-------------------+------------+| COLUMN_NAME | DATA_TYPE | ORDINAL_POSITION | COLUMN_DEFAULT | COLUMN_KEY |+-------------+-----------+------------------+-------------------+------------+| nPoste | varchar | 1 | NULL | || nLog | varchar | 2 | NULL | || numIns | int | 3 | NULL | PRI || dateIns | timestamp | 4 | CURRENT_TIMESTAMP | || delai | time | 5 | NULL | |+-------------+-----------+------------------+-------------------+------------+

ENGINEAUTO_INCREMENTTABLE_ROWSAVG_ROW_LENGTHDATA_LENGTH

COLUMN_NAMEDATA_TYPEORDINAL_POSITIONCOLUMN_DEFAULTCOLUMN_KEY

4055_05_C05 Page 196 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 197

chapitre ndeg 5 Controcircle des donneacutees

Remarquez que MySQL utilise

COLUMN_NAME pour renseigner le nom de chaque colonne

DATA_TYPE pour donner le typeMySQL

ORDINAL_POSITION pour renseigner lrsquoordre des colonnes dans la table (utiliseacute en cas deSELECT )

COLUMN_DEFAULT pour preacuteciser la valeur par deacutefaut de chaque colonne

COLUMN_KEY pour donner la composition de la cleacute primaire

Extraction des colonnes caractegraveres

La requecircte suivante deacutecrit en deacutetail les colonnes chaicircnes de caractegraveres de la table Installer

SELECT AS Taille max FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer AND NUMERIC_PRECISION IS NULL AND DATA_TYPE NOT IN (timestamptimedate)+-------------+-----------+------------+-------------+| COLUMN_NAME | DATA_TYPE | Taille max | IS_NULLABLE |+-------------+-----------+------------+-------------+| nPoste | varchar | 7 | YES || nLog | varchar | 5 | YES |+-------------+-----------+------------+-------------+

Vous pouvez noter que MySQL utilise

IS_NULLABLE pour renseigner le fait qursquoune colonne puisse ecirctre nulle

CHARACTER_OCTET_LENGTH pour renseigner la taille des chaicircnes de caractegraveres pourchaque colonne

Extraction des colonnes numeacuteriques

La requecircte suivante deacutetaille les colonnes numeacuteriques de la table Installer

SELECT COLUMN_NAMEDATA_TYPE AS Taille max

AS Preacutecision

FROM INFORMATION_SCHEMACOLUMNS

WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer

AND CHARACTER_MAXIMUM_LENGTH IS NULL

AND DATA_TYPE NOT IN (timestamptimedate)

+-------------+-----------+------------+-----------+

| COLUMN_NAME | DATA_TYPE | Taille max | Preacutecision |

+-------------+-----------+------------+-----------+

| numIns | int | 10 | 0 |

+-------------+-----------+------------+-----------+

COLUMN_NAMEDATA_TYPECHARACTER_OCTET_LENGTH IS_NULLABLE

NUMERIC_PRECISION

NUMERIC_SCALE

4055_05_C05 Page 197 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

198 copy Eacuteditions Eyrolles

Vous pouvez notez que MySQL utilise

NUMERIC_PRECISION pour renseigner la taille des numeacuteriques pour chaque colonne

NUMERIC_SCALE pour renseigner la preacutecision des numeacuteriques

Extraction des colonnes date-heure

La requecircte suivante extrait toutes les colonnes de type date-heure de la table Installer

SELECT COLUMN_NAMEDATA_TYPECOLUMN_DEFAULT

FROM INFORMATION_SCHEMACOLUMNS

WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer

AND CHARACTER_MAXIMUM_LENGTH IS NULL

AND )

+-------------+-----------+-------------------+

| COLUMN_NAME | DATA_TYPE | COLUMN_DEFAULT |

+-------------+-----------+-------------------+

| dateIns | timestamp | CURRENT_TIMESTAMP |

| delai | time | NULL |

+-------------+-----------+-------------------+

Citons pour en terminer avec cette vue les colonnes

CHARACTER_SET_NAME et COLLATION_NAME qui renseignent sur le jeu de caractegraverespour chaque colonne de la table

COLUMN_COMMENT qui renseigne sur les eacuteventuels commentaires sur chaque colonne

Recherche des contraintes drsquoune table

La vue TABLE_CONSTRAINTS deacutecrit la nature des contraintes La requecircte suivante deacutetailleles contraintes contenues dans la table Installer de la base bdsoutou

SELECT FROM INFORMATION_SCHEMATABLE_CONSTRAINTS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+-------------------+----------------------------+-----------------+| CONSTRAINT_SCHEMA | CONSTRAINT_NAME | CONSTRAINT_TYPE |+-------------------+----------------------------+-----------------+| bdsoutou | PRIMARY | PRIMARY KEY || bdsoutou | un_installation | UNIQUE || bdsoutou | fk_Installer_nLog_Logiciel | FOREIGN KEY || bdsoutou | fk_Installer_nPoste_Poste | FOREIGN KEY |+-------------------+----------------------------+-----------------+

MySQL utilise

CONSTRAINT_SCHEMA pour indiquer la base de donneacutees qui contient la contrainte (quipeut ecirctre situeacutee dans une autre base de donneacutees que la table elle-mecircme)

DATA_TYPE IN (timestamptimedate

CONSTRAINT_SCHEMACONSTRAINT_NAMECONSTRAINT_TYPE

4055_05_C05 Page 198 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 199

chapitre ndeg 5 Controcircle des donneacutees

CONSTRAINT_NAME pour renseigner le nom de la contrainte Notez ici que MySQLnrsquoextrait pas le nom de ma contrainte (pk_Installer) sans doute est-ce le fait qursquoelleest deacuteclareacutee eacutegalement AUTO_INCREMENT

CONSTRAINT_TYPE pour renseigner le type de chaque contrainte

La valeur CHECK dans la colonne CONSTRAINT_TYPE nrsquoest pas encore prise en charge Vouspouvez toutefois creacuteer des tables avec des contraintes CHECK rien ne se passera si vousinseacuterez des donneacutees non valides et le dictionnaire restera coheacuterent en nrsquoextrayant pas cesinformations

Composition des contraintes drsquoune table

La vue KEY_COLUMN_USAGE deacutecrit la composition des contraintes

Positions

La requecircte suivante permet drsquoextraire la composition des contraintes de la table Installerdans la base bdsoutou et en particulier celle de lrsquouniciteacute du couple (nPostenLog)

SELECT CONSTRAINT_NAME COLUMN_NAME AS Position

AS Position index FROM INFORMATION_SCHEMAKEY_COLUMN_USAGE WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+----------------------------+-------------+----------+----------------+| CONSTRAINT_NAME | COLUMN_NAME | Position | Position index |+----------------------------+-------------+----------+----------------+| PRIMARY | numIns | 1 | NULL || un_installation | nPoste | 1 | NULL || un_installation | nLog | 2 | NULL || fk_Installer_nLog_Logiciel | nLog | 1 | 1 || fk_Installer_nPoste_Poste | nPoste | 1 | 1 |+----------------------------+-------------+----------+----------------+

MySQL utilise

ORDINAL_POSITION qui indique la position de la colonne dans la contrainte (deacutebutantagrave 1)

POSITION_IN_UNIQUE_CONSTRAINT est eacutevalueacutee agrave NULL pour les index (unique et cleacuteprimaire) Pour les cleacutes eacutetrangegraveres composites elle indique la position de la colonne dansla contrainte

Deacutetails des contraintes reacutefeacuterentielles

Cette mecircme vue permet eacutegalement de retrouver la nature de la reacutefeacuterence pour chaque cleacuteeacutetrangegravere

ORDINAL_POSITION

POSITION_IN_UNIQUE_CONSTRAINT

4055_05_C05 Page 199 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

200 copy Eacuteditions Eyrolles

SELECT CONSTRAINT_NAME COLUMN_NAME AS Cle AS Base cible

AS Table pere

AS Col pere FROM INFORMATION_SCHEMAKEY_COLUMN_USAGE WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer AND REFERENCED_TABLE_SCHEMA IS NOT NULL+----------------------------+--------+------------+------------+----------+| CONSTRAINT_NAME | Cle | Base cible | Table pere | Col pere |+----------------------------+--------+------------+------------+----------+| fk_Installer_nLog_Logiciel | nLog | bdsoutou | logiciel | nLog || fk_Installer_nPoste_Poste | nPoste | bdsoutou | poste | nPoste |+----------------------------+--------+------------+------------+----------+

MySQL utilise

REFERENCED_TABLE_SCHEMA qui indique la base de donneacutees heacutebergeant la tablelaquo pegravere raquo Ici la base donneacutees contient les tables laquo fils raquo et laquo pegraveres raquo mais il se peut que cestables soient dans deux bases distinctes

REFERENCED_TABLE_NAME qui indique le nom de la table laquo pegravere raquo

REFERENCED_COLUMN_NAME qui indique le nom de la colonne reacutefeacuterenceacutee dans la tablelaquo pegravere raquo Ici les noms des colonnes des tables laquo fils raquo et laquo pegravere raquo sont identiques mais il sepeut qursquoils diffegraverent

Recherche du code source drsquoun sous-programme

La vue ROUTINES deacutecrit la composition des sous-programmes (proceacutedures et fonctions cata-logueacutees) La requecircte suivante permet drsquoextraire le code source des sous-programmes stockeacutesdans la base test

SELECT FROM INFORMATION_SCHEMAROUTINES WHERE ROUTINE_SCHEMA = test+--------------+--------------+-----------------------------------------------+| ROUTINE_NAME | ROUTINE_TYPE | ROUTINE_DEFINITION |+--------------+--------------+-----------------------------------------------+| sp1 | PROCEDURE | BEGIN DECLARE v_brevet CHAR(6) SET v_brevet = PROC END || sp2 | FUNCTION | BEGIN DECLARE v_brevet CHAR(3) SET v_brevet = FCT RETURN v_brevet END |+--------------+--------------+-----------------------------------------------+

REFERENCED_TABLE_SCHEMA

REFERENCED_TABLE_NAME

REFERENCED_COLUMN_NAME

ROUTINE_NAMEROUTINE_TYPEROUTINE_DEFINITION

4055_05_C05 Page 200 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 201

chapitre ndeg 5 Controcircle des donneacutees

MySQL utilise

ROUTINE_SCHEMA qui indique le nom de la base heacutebergeant le sous-programme

ROUTINE_NAME qui indique le nom du sous-programme

ROUTINE_TYPE qui indique la nature du sous-programme

ROUTINE_DEFINITION qui liste le code MySQL du sous-programme

Citons pour en terminer avec cette vue les colonnes

SECURITY_TYPE qui renseigne sur les privilegraveges associeacutes agrave la vue lors de son exeacutecution(soit les privilegraveges de lrsquoutilisateur creacuteateur definer soit ceux de lrsquoutilisateur qui lancelrsquoexeacutecution invoker)

CREATED et LAST_ALTERED pour stocker la date de creacuteation du sous-programme etlrsquoinstant de la derniegravere compilation

DEFINER qui indique lrsquoidentiteacute de lrsquoutilisateur qui a creacuteeacute le sous-programme

ROUTINE_COMMENT qui stocke un eacuteventuel commentaire relatif au sous-programme(initialiseacute lors de la compilation)

Privilegraveges des utilisateurs drsquoune base de donneacutees

On retrouve les diffeacuterents niveaux de privilegraveges eacutetudieacutes en deacutebut de chapitre

Au niveau global

La vue USER_PRIVILEGES liste les privilegraveges des accegraves utilisateurs au niveau global (lesdonneacutees viennent de la table mysqluser) La requecircte suivante extrait les privilegraveges dePaul et de Jules (en accegraves distant ou en local) Non vous ne recircvez pas trois simples quotessont neacutecessaires pour tester la valeur de la colonne GRANTEE

SELECT

FROM INFORMATION_SCHEMAUSER_PRIVILEGES

WHERE GRANTEE LIKE Paul OR GRANTEE LIKE Jules

+------------------------+----------------+--------------+

| GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE |

+------------------------+----------------+--------------+

| Paullocalhost | USAGE | NO |

| Juleslocalhost | USAGE | NO |

| Paul1921684173 | SELECT | NO |

| Paul1921684173 | CREATE | NO |

+------------------------+----------------+--------------+

GRANTEEPRIVILEGE_TYPEIS_GRANTABLE

4055_05_C05 Page 201 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

202 copy Eacuteditions Eyrolles

MySQL utilise

GRANTEE qui indique le nom de lrsquoaccegraves utilisateur

PRIVILEGE_TYPE qui indique le type du privilegravege

IS_GRANTABLE qui renseigne sur la possibiliteacute que lrsquoaccegraves utilisateur puisse retransmet-tre le privilegravege acquis (reccedilu avec WITH GRANT OPTION)

Au niveau database

La vue SCHEMA_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne TABLE_SCHEMA Celle-ci donne le nom de la base de donneacutees concerneacutee par lesprivilegraveges des accegraves utilisateurs (les donneacutees viennent de la table dbuser) La requecirctesuivante extrait les privilegraveges au niveau database de Paul en accegraves distant ou local

SELECT GRANTEEPRIVILEGE_TYPEIS_GRANTABLE FROM INFORMATION_SCHEMASCHEMA_PRIVILEGES WHERE GRANTEE LIKE Paul+--------------+------------------------+----------------+--------------+| TABLE_SCHEMA | GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE |+--------------+------------------------+----------------+--------------+| bdpaul | Paul1921684173 | SELECT | NO || bdpaul | Paullocalhost | DROP | NO || bdpaul | Paullocalhost | CREATE ROUTINE | NO |+--------------+------------------------+----------------+--------------+

Au niveau table

La vue TABLE_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne TABLE_NAME Celle-ci donne le nom de la table concerneacutee par les privilegraveges desaccegraves utilisateurs (les donneacutees viennent de la table mysqltables_priv) La requecirctesuivante extrait les privilegraveges au niveau table de Paul en accegraves distant ou local

SELECT AS BaseTable GRANTEEPRIVILEGE_TYPE AS Privilege FROM INFORMATION_SCHEMATABLE_PRIVILEGES WHERE GRANTEE LIKE Paul+--------------------------------------+------------------------+-----------+| | GRANTEE | Privilege |+--------------------------------------+------------------------+-----------+| bdsoutouVueDesCompagniesJoursFeries | Paullocalhost | SELECT || bdpaulLivre | Paul1921684173 | SELECT || bdpaulLivre | Paullocalhost | SELECT || bdpaulLivre | Paullocalhost | DELETE |+--------------------------------------+------------------------+-----------+

TABLE_SCHEMA

CONCAT(TABLE_SCHEMATABLE_NAME)

BaseTable

4055_05_C05 Page 202 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 203

chapitre ndeg 5 Controcircle des donneacutees

Au niveau column

La vue COLUMN_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne COLUMN_NAME Celle-ci preacutecise le nom de la colonne concerneacutee par les privilegravegesdes accegraves utilisateurs (les donneacutees viennent de la table mysql columns_priv) La requecirctesuivante extrait les privilegraveges au niveau column de Paul en accegraves distant ou local sur la basebdpaul

SELECT CONCAT(TABLE_NAME ) AS Tablecolonne

GRANTEEPRIVILEGE_TYPE AS Privilege

FROM INFORMATION_SCHEMACOLUMN_PRIVILEGES

WHERE TABLE_SCHEMA=bdpaul

+---------------+--------------------+-----------+

| Tablecolonne | GRANTEE | Privilege |

+---------------+--------------------+-----------+

| LivreISBN | Paullocalhost | UPDATE |

+---------------+--------------------+-----------+

Au niveau routine

Se reporter au niveau database

Commande SHOWLa commande SHOW permet drsquoextraire facilement des informations provenant du dictionnairedes donneacutees Elle est bien sucircr agrave lrsquoinverse plus limiteacutee que lrsquoeacutecriture drsquoune requecircte SELECT ndashqui pourra toujours extraire les mecircmes informations mais en interrogeant les vues adeacutequatesLa copie drsquoeacutecran suivante illustre la commande SHOW TABLES qui restitue une reacuteponse agrave laquestion laquo Quelles sont les tables et les vues preacutesentes dans la base de donneacutees en coursdrsquoutilisation raquo

COLUMN_NAME

Figure 5-12 Exemple de SHOW pour lister les tables drsquoun scheacutema

4055_05_C05 Page 203 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

204 copy Eacuteditions Eyrolles

Le tableau suivant deacutecrit quelques exemples qui vous seront peut-ecirctre utiles

Tableau 5-26 Exemples de SHOW

Commande Reacutesultat

SHOW COLUMNS FROM Installer FROM bdsoutou LIKE n

Liste des colonnes dont le nom commence parn dans la table Installer de la basebdsoutou

SHOW CREATE DATABASE bdsoutou Options de creacuteation de la base bdsoutou

SHOW CREATE TABLE bdsoutouInstaller Description totale de lrsquoinstruction permettant decreacuteer la table Installer de la base bdsou-tou

SHOW DATABASES Liste des bases preacutesentes sur le serveur

SHOW ENGINES Liste des moteurs de stockage utilisables sur leserveur

SHOW ERRORS Libelleacute de lrsquoerreur SQL courante

SHOW GRANTS FOR Paullocalhost Pour un accegraves utilisateur liste de ses privilegravegesaux niveaux global database column et rou-tine

SHOW INDEX FROM Installer FROM bdsoutou Description des index de la table Installerde la base bdsoutou

SHOW PRIVILEGES Liste de tous les privilegraveges possibles

SHOW TABLE STATUS FROM bdsoutou LIKE S

Caracteacuteristiques physiques des tables dont lenom commence par S dans la base bdsoutou

SHOW TABLES FROM mysql Liste des tables de la base mysql

SHOW TRIGGERS Caracteacuteristiques des deacuteclencheurs preacutesentssur le serveur

4055_05_C05 Page 204 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 205

chapitre ndeg 5 Controcircle des donneacutees

Exercices

Les objectifs de ces exercices sont

de creacuteer des vues monotables et multitables

drsquoinseacuterer des enregistrements dans des vues

drsquoeffectuer une mise agrave jour conditionneacutee via une vue

51 Vues monotables

Vues sans contraintes

Eacutecrire le script vuessql permettant de creacuteer

bull La vue LogicielsUnix qui contient tous les logiciels de type UNIX (toutes les colonnes sontconserveacutees) Veacuterifier la structure et le contenu de la vue (DESCRIBE et SELECT)

bull La vue Poste_0 de structure (nPos0 nomPoste0 nSalle0 TypePoste0 indIP ad0) quicontient tous les postes du rez-de-chausseacutee (etage=0 au niveau de la table Segment) Faireune jointure proceacutedurale sinon la vue sera consideacutereacutee comme une vue multitable Veacuterifier la struc-ture et le contenu de la vue

Inseacuterer deux nouveaux postes dans la vue tels qursquoun poste soit connecteacute au segment du rez-de-chausseacutee et lrsquoautre agrave un segment drsquoun autre eacutetage Veacuterifier le contenu de la vue et celui de la tableConclusion

Supprimer ces deux enregistrements de la table Poste

Reacutesoudre une requecircte complexe

Creacuteer la vue SallePrix de structure (nSalle nomSalle nbPoste prixLocation) quicontient les salles et leur prix de location pour une journeacutee (en fonction du nombre de postes) Lemontant de la location drsquoune salle agrave la journeacutee sera drsquoabord calculeacute sur la base de 100 euro par posteServez-vous de lrsquoexpression 100nbPoste dans la requecircte de deacutefinition

Veacuterifier le contenu de la vue puis afficher les salles dont le prix de location deacutepasse 150 euro

Ajouter la colonne tarif de type SMALLINT(4) agrave la table Types Mettre agrave jour cette table demaniegravere agrave inseacuterer les valeurs suivantes

Tableau 5-27 Tarifs des postes

Type du poste Tarif en euro

TX 50

PCWS 100

PCNT 120

UNIX 200

NC 80

BeOS 400

4055_05_C05 Page 205 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

206 copy Eacuteditions Eyrolles

Creacuteer la vue SalleIntermediaire de structure (nSalle typePoste nombre tarif) detelle sorte que le contenu de la vue reflegravete le tarif ajusteacute des salles en fonction du nombre et du typedes postes de travail Il srsquoagit de grouper par salle type et tarif (tout en faisant une jointure avec la tableTypes pour les tarifs) et de compter le nombre de postes pour avoir le reacutesultat suivant

+--------+-----------+--------+-------+

| nSalle | typePoste | nombre | tarif |

+--------+-----------+--------+-------+

| s01 | TX | 2 | 50 |

| s01 | UNIX | 2 | 200 |

| s02 | PCWS | 2 | 100 |

| s03 | TX | 1 | 50 |

| |

Agrave partir de la vue SalleIntermediaire creacuteer la vue SallePrixTotal(nSalle PrixReel)qui reflegravete le prix reacuteel de chaque salle (par exemple la s01 sera factureacutee 250 + 1200 = 300 euro) Veacuteri-fier le contenu de cette vue

Afficher les salles les plus eacuteconomiques agrave la location

Vues avec contraintes

Remplacer la vue Poste0 en rajoutant lrsquooption de controcircle (CHECK OPTION) Tenter drsquoinseacuterer unposte appartenant agrave un eacutetage diffeacuterent du rez-de-chausseacutee

Creacuteer la vue Installer0 de structure (nPoste nLog dateIns) ne permettant de travaillerqursquoavec les postes du rez-de-chausseacutee tout en interdisant lrsquoinstallation drsquoun logiciel de type PCNTTenter drsquoinseacuterer deux postes dans cette vue ne correspondant pas agrave ces deux contraintes un postedrsquoun eacutetage puis un logiciel de type PCNT Inseacuterer lrsquoenregistrement p6 log2 qui doit passer agrave traversla vue

52 Vue multitable

Creacuteer la vue SallePoste de structure (nomSalle nomPoste adrIP nomTypePoste)permettant drsquoextraire toutes les installations sous la forme suivante

SELECT FROM SallePoste

+----------+----------+---------------+-------------------+

| nomSalle | nomPoste | adrIP | nomTypePoste |

+----------+----------+---------------+-------------------+

| Salle 1 | Poste 1 | 1301208001 | Terminal X-Window |

| Salle 1 | Poste 2 | 1301208002 | Systegraveme Unix |

| Salle 1 | Poste 3 | 1301208003 | Terminal X-Window |

| |

4055_05_C05 Page 206 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie II

Programmation proceacutedurale

4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

209

Chapitre 6

Bases du langage

de programmation

Ce chapitre deacutecrit les caracteacuteristiques geacuteneacuterales du langage proceacutedural de programmation deMySQL

structure drsquoun programme

deacuteclaration et affectation de variables

structures de controcircle (

si

tant que

reacutepeacuteter

pour

)

meacutecanismes drsquointeraction avec la base

programmation de transactions

Geacuteneacuteraliteacutes

Les structures de controcircle habituelles drsquoun langage (

IF

WHILE

hellip) ne font pas partie inteacute-grante de la norme SQL Elles apparaissent dans une sous-partie optionnelle de la norme(ISOIEC 9075-51996

Flow-control statements

) MySQL les prend en compte

Le langage proceacutedural de MySQL est une extension de SQL car il permet de faire cohabiterles habituelles structures de controcircle (

si

pour

et

tant que

pour les plus connues) avec desinstructions SQL (principalement

SELECT

INSERT

UPDATE

et

DELETE

)

Environnement client-serveur

Dans un environnement client-serveur chaque instruction SQL donne lieu agrave lrsquoenvoi drsquounmessage du client vers le serveur suivi de la reacuteponse du serveur vers le client Il est preacutefeacuterablede travailler avec un sous-programme (qui sera stockeacute en fait cocircteacute serveur) plutocirct qursquoavecune suite drsquoinstructions SQL susceptibles drsquoencombrer le trafic reacuteseau En effet un bloc donnelieu agrave un seul eacutechange sur le reacuteseau entre le client et le serveur Les reacutesultats intermeacutediairessont traiteacutes cocircteacute serveur et seul le reacutesultat final est retourneacute au client

4055_06_C06 Page 209 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

210

copy Eacuteditions Eyrolles

Avantages

Les principaux avantages drsquoutiliser des sous-programmes (proceacutedures ou fonctions catalo-gueacutees qui sont stockeacutees cocircteacute serveur) sont

La modulariteacute un sous-programme peut ecirctre composeacute drsquoautres blocs drsquoinstructions Unsous-programme peut aussi ecirctre reacuteutilisable car il peut ecirctre appeleacute par un autre

La portabiliteacute un sous-programme est indeacutependant du systegraveme drsquoexploitation qui heacutebergele serveur MySQL En changeant de systegraveme les applicatifs nrsquoont pas agrave ecirctre modifieacutes

Lrsquointeacutegration avec les donneacutees des tables on retrouvera avec ce langage proceacutedural tousles types de donneacutees et drsquoinstructions disponibles sous MySQL des meacutecanismes pourparcourir des reacutesultats de requecirctes (curseurs) pour traiter des erreurs (

handlers

) et pourprogrammer des transactions (

COMMIT

ROLLBACK

SAVEPOINT

)

La seacutecuriteacute car les sous-programmes srsquoexeacutecutent dans un environnement

a priori

seacutecuriseacute(SGBD) ougrave il est plus facile de garder la maicirctrise sur les ordres SQL exeacutecuteacutes et donc surles agissements des utilisateurs

Structure drsquoun bloc

Un bloc drsquoinstructions est composeacute de

BEGIN

(section obligatoire) contient le code incluant ou non des directives SQL se termi-nant par le symbole laquo raquo

DECLARE

(directive optionnelle) deacuteclare une variable un curseur une exception etc

END

ferme le bloc

Un bloc peut ecirctre imbriqueacute dans un autre bloc Pour tester un bloc nous verrons dans lasection

Tests des exemples

qursquoil faut lrsquoinclure dans une proceacutedure catalogueacutee MySQL neprend pas encore en charge les proceacutedures anonymes (sans nom)

Figure 6-1

Trafic sur le reacuteseau drsquoinstructions SQL

CALL Bloc

SGBDExeacutecution globale

SELECT hellip

UPDATE hellip

INSERT INTO helliphellip

SGBDExeacutecution requecircte par requecircte

Client

Bloc

Suitedrsquoinstructions Serveur

BEGINSELECT hellip

UPDATE hellip

INSERT INTOhelliphellipEND

4055_06_C06 Page 210 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

211

chapitre ndeg 6 Bases du langage de programmation

Porteacutee des objets

La porteacutee drsquoun objet (variable curseur ou exception) est la zone du programme qui peut yacceacuteder Un objet deacuteclareacute dans un bloc est accessible dans les sous-blocs En revanche unobjet deacuteclareacute dans un sous-bloc nrsquoest pas visible du bloc supeacuterieur (principe des accolades deslangages C et Java)

Casse et lisibiliteacute

Comme SQL les sous-programmes sont capables drsquointerpreacuteter les caractegraveres alphanumeacuteri-ques du jeu de caractegraveres seacutelectionneacute Aucun objet manipuleacute par programme nrsquoest sensible agrave lacasse (

not case sensitive

) Ainsi

numeroBrevet

et

NumeroBREVET

deacutesignent le mecircmeidentificateur (tout est traduit en minuscules au niveau du dictionnaire des donneacutees) Lesregravegles drsquoeacutecriture classiques concernant lrsquoindentation et les espaces entre variables mots-cleacuteset instructions doivent ecirctre respecteacutees dans un souci de lisibiliteacute

Figure 6-2

Structure drsquoun bloc drsquoinstructions MySQL

BEGIN[DECLARE deacuteclaration]hellip-- codehellip

hellipEND

BEGIN[DECLARE deacuteclaration ]-- codehellipEND

BEGIN[DECLARE deacuteclaration ]-- codehellipEND

Figure 6-3

Visibiliteacute des objets

BEGINDECLARE v_brevet CHAR(6)hellip-- v_brevet accessible

hellip

END

BEGINDECLARE v_nom VARCHAR (20)-- v_brevet et v_nom accessibleshellipEND

v_nom inaccessible

Tableau 6-1 Lisibiliteacute du code

Peu lisible Crsquoest mieux

IF xgty THEN SET max=xELSE SET max=yEND IF IF xgty THEN SET max=xELSE SET max=yEND IF

4055_06_C06 Page 211 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

212

copy Eacuteditions Eyrolles

Identificateurs

Avant de parler des diffeacuterents types de variables MySQL deacutecrivons comment il est possiblede nommer les objets des sous-programmes Un identificateur commence par une lettre (ou unchiffre) Un identificateur nrsquoest pas limiteacute en nombre de caractegraveres Les autres signes pourtantconnus du langage sont interdits comme le montre le tableau suivant

Commentaires

MySQL prend en charge deux types de commentaires monolignes commenccedilant au symbolelaquo

--

raquo et finissant agrave la fin de la ligne et multilignes commenccedilant par laquo

raquo

et finissant parlaquo

raquo

Le tableau suivant deacutecrit quelques exemples

Variables

Un sous-programme est capable de manipuler des variables qui sont deacuteclareacutees (et eacuteventuelle-ment initialiseacutees) par la directive

DECLARE

Ces variables permettent de transmettre desvaleurs agrave des sous-programmes via des paramegravetres ou drsquoafficher des eacutetats de sortie souslrsquointerface Deux types de variables sont disponibles sous MySQL

scalaires recevant une seule valeur drsquoun type SQL (ex colonne drsquoune table)

externes deacutefinies dans la session et qui peuvent servir de paramegravetres drsquoentreacutee ou de sortie

Tableau 6-2 Identificateurs

Autoriseacutes Interdits

t2code_brevet2nombresMysql_t

moiamptoi

(symbole laquo amp raquo)

debit-credit

(symbole laquo - raquo)

onoff

(symbole laquo raquo)

code brevet

(symbole espace)

Tableau 6-3 Commentaires

Sur une ligne Sur plusieurs lignes

SELECT nbHVol INTO v_nbHVol FROM Pilote WHERE nom = Gratien VielSET v_bonus = v_nbHVol015

SELECT salaire INTO v_salaire FROM Pilote

WHERE nom = Thierry Albaric

SET v_bonus = v_salaire015

-- Lecture de la table Pilote

ndash- Extraction heures de vol

-- Calcul

Lecture de la table Pilote

Extraction du salairepour calculer le bonus

Calcul

4055_06_C06 Page 212 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

213

chapitre ndeg 6 Bases du langage de programmation

Variables scalaires

La deacuteclaration drsquoune variable scalaire est de la forme suivante

DECLARE

nomVariable1

[

nomVariable2

]

typeMSQL

[DEFAULT

expression

]

DEFAULT

permet drsquoinitialiser la (ou les) variable(s) ndash pas forceacutement agrave lrsquoaide drsquoune cons-tante Le tableau suivant deacutecrit quelques exemples

Affectations

Il existe plusieurs possibiliteacutes pour affecter une valeur agrave une variable

lrsquoaffectation comme on la connaicirct dans les langages de programmation (

SET

variable

expression) Vous pouvez aussi utiliser le symbole laquo = raquo mais il est plus prudentde le reacuteserver agrave la programmation de conditions

la directive DEFAULT

la directive INTO drsquoune requecircte (SELECT hellip INTO variable FROM hellip)

Restrictions

Le type tableau (array) nrsquoest pas encore preacutesent dans le langage de MySQL Cela peut ecirctrepeacutenalisant quand on deacutesire travailler en interne avec des reacutesultats drsquoextractions de taillemoyenne

Il est impossible drsquoutiliser un identificateur dans une expression srsquoil nrsquoest pas deacuteclareacute au preacutea-lable Ici la deacuteclaration de la variable v_maxi est incorrecte

DECLARE v_maxi INT DEFAULT 2 v_mini

DECLARE v_mini INT DEFAULT 15

Tableau 6-4 Deacuteclarations

Deacuteclarations Commentaires

DECLARE v_dateNaissance DATE Deacuteclare la variable sans lrsquoinitialiser Eacutequivalent agrave SET v_dateNaissance = NULL

DECLARE v_capacite SMALLINT(4) DEFAULT 999 Initialise la variable agrave 999

DECLARE v_trouve BOOLEAN DEFAULT TRUE Initialise la variable agrave vrai (1)

DECLARE v_Dans2jours DATE DEFAULT ADDDATE(SYSDATE()2)

Initialise la variable agrave dans 2 jours

=

4055_06_C06 Page 213 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

214 copy Eacuteditions Eyrolles

Comme la plupart des langages reacutecents les deacuteclarations multiples sont permises Celle qui suitest juste

DECLARE INT

Reacutesolution de noms

Lors des conflits potentiels de noms (variables ou colonnes) dans des instructions SQL (prin-cipalement INSERT UPDATE DELETE et SELECT) le nom de la variable est prioritairementinterpreacuteteacute au deacutetriment de la colonne de la table (de mecircme nom)

Dans lrsquoexemple suivant lrsquoinstruction DELETE supprime tous les pilotes de la table (et non passeulement le pilote de nom Placide Fresnais) car MySQL considegravere les deux identificateurscomme eacutetant la mecircme variable et non pas comme colonne de la table et variable

DECLARE nom VARCHAR(16) DEFAULT Placide Fresnais

DELETE FROM Pilote WHERE

Pour se preacutemunir de tels effets de bord une seule solution existe elle consiste agrave nommertoutes les variables diffeacuteremment des colonnes (en utilisant un preacutefixe par exemple) Uneautre solution serait drsquoutiliser une eacutetiquette de bloc (block label) pour lever drsquoeacuteventuellesambiguiumlteacutes Bien qursquoil soit possible drsquoemployer des eacutetiquettes de blocs (aussi disponibles pourles structures de controcircle) on ne peut pas encore preacutefixer des variables pour en distinguer unede mecircme nom entre diffeacuterents blocs

Opeacuterateurs

Les opeacuterateurs SQL eacutetudieacutes au chapitre 4 (logiques arithmeacutetiques de concateacutenationhellip) sontdisponibles au sein drsquoun sous-programme Les regravegles de prioriteacute sont les mecircmes que dans lecas de SQL

Lrsquoopeacuterateur IS NULL permet de tester une formule avec la valeur NULL Toute expressionarithmeacutetique contenant une valeur nulle est eacutevalueacutee agrave NULL

Le tableau suivant illustre quelques utilisations possibles drsquoopeacuterateurs logiques

i j k

nom = nom

Tableau 6-5 Eacuteviter les ambiguiumlteacutes

Preacutefixer les variables Eacutetiquette de bloc (preacutefixe pas opeacuterationnel)

DECLARE v_nom VARCHAR(16) DEFAULT Placide FresnaishellipDELETE FROM Pilote WHERE --ouDELETE FROM Pilote WHERE

DECLARE nom VARCHAR(16) DEFAULT Placide Fresnais DELETE FROM Pilote WHERE principalnom = nom

nom = v_nom

v_nom = nom

principal BEGIN

END principal

4055_06_C06 Page 214 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 215

chapitre ndeg 6 Bases du langage de programmation

Variables de session

Il est possible de passer en paramegravetres drsquoentreacutee drsquoun bloc des variables externes Ces variablessont dites de session (user variables) Elles nrsquoexistent que durant la session On deacuteclare cesvariables en ligne de commande agrave lrsquoaide du symbole laquo raquo

SET [ var2 = expression2]

Le tableau suivant illustre un exemple de deux variables de session on extrait le nom et lenombre drsquoheures de vol drsquoun pilote (table deacutecrite au deacutebut du chapitre 4) augmenteacute drsquounnombre en paramegravetre Son numeacutero de brevet et la dureacutee du vol sont lus au clavier Ces varia-bles de session ne sont bien sucircr pas agrave deacuteclarer dans le bloc

Conventions recommandeacutees

Adoptez les conventions drsquoeacutecriture suivantes pour que vos programmes MySQL soient plusfacilement lisibles et maintenables

Tableau 6-6 Utilisation drsquoopeacuterateurs

Code MySQL Commentaires

DECLARE v_compteur INT(3) DEFAULT 0DECLARE v_boolean BOOLEANDECLARE v_nombre INT(3)

Trois deacuteclarations dont une avec initialisation

SET v_compteur = v_compteur+1 Increacutementation de v_compteur (opeacuterateur +)

SET v_boolean = (v_compteur=v_nombre) v_boolean reccediloit NULL car la condition est fausse

SET v_boolean = (v_nombre IS NULL) v_boolean reccediloit TRUE (1 en fait) car la condi-tion est vraie

var1 = expression1

Tableau 6-7 Variables de session

Code MySQL Reacutesultat

hellipBEGIN DECLARE v_nom CHAR(16) DECLARE v_nbHVol DECIMAL(72) SELECT nomnbHVol INTO v_nom v_nbHVol FROM Pilote WHERE brevet = SET v_nbHVol = v_nbHVol + SELECT v_nom v_nbHVolEND

+------------------+----------+| v_nom | v_nbHVol |+------------------+----------+| Placide Fresnais | 246500 |+------------------+----------+

WebSET vs_num = PL-4$SET vs_hvol = 15$

vs_numvs_hvol

4055_06_C06 Page 215 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

216 copy Eacuteditions Eyrolles

Test des exemples

Parce qursquoil nrsquoest pas encore possible drsquoexeacutecuter des blocs anonymes (sous-programme sansnom et qui nrsquoest pas stockeacute dans la base) vous devez les inclure dans une proceacutedure catalo-gueacutee que vous appellerez dans lrsquointerface de commande

Lrsquoexemple suivant extrait le nombre drsquoheures de vol du pilote de nom Placide FresnaisPensez agrave redeacutefinir le deacutelimiteur agrave laquo $ raquo (par exemple) pour pouvoir utiliser dans le bloc lesymbole laquo raquo pour terminer chaque instruction

Le reacutesultat dans lrsquointerface de commande est le suivant Allez-y tester vos exemples mainte-nant

Tableau 6-8 Conventions

Objet Convention Exemple

Variable v_nomVariable v_compteur

Constante c_nomConstante c_pi

Variable de session (globale) vs_nomVariable vs_brevet

Tableau 6-9 Tester un exemple de bloc

Preacutefixer les variables Commentaire

delimiter $SET vs_nom = Placide Fresnais$

Deacuteclaration du deacutelimiteur et drsquoune variable de session

DROP PROCEDURE sp1$ Suppression de la proceacutedure

CREATE PROCEDURE sp1() Creacuteation de la proceacutedure

BEGIN DECLARE v_nbHVol DECIMAL(72) SELECT nbHVol INTO v_nbHVol FROM Pilote WHERE nom = vs_nom SELECT v_nbHVolEND$

Bloc drsquoinstructions

Trace du reacutesultatFin du bloc

CALL sp1()$ Appel de la proceacutedure

Web

4055_06_C06 Page 216 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 217

chapitre ndeg 6 Bases du langage de programmation

Structures de controcircle

En tant que langage proceacutedural MySQL offre la possibiliteacute de programmer

les structures conditionnelles si et cas (IFhellip et CASE)

des structures reacutepeacutetitives tant que reacutepeacuteter et boucle sans fin (WHILE REPEAT et LOOP)

Pas de structure FOR pour lrsquoinstant Deux directives suppleacutementaires qui sont toutefois agrave utiliseravec modeacuteration LEAVE qui sort drsquoune boucle (ou drsquoun bloc eacutetiqueteacute) et ITERATE qui force leprogramme agrave refaire un tour de boucle depuis le deacutebut

Structures conditionnelles

MySQL propose deux structures pour programmer des actions conditionneacutees la structure IFet la structure CASE

Trois formes de IF

Suivant les tests agrave programmer on peut distinguer trois formes de structure IF IF-THEN (si-alors) IF-THEN-ELSE (avec le sinon agrave programmer) et IF-THEN-ELSEIF (imbricationsde conditions)

Le tableau suivant donne lrsquoeacutecriture des diffeacuterentes structures conditionnelles IF Notezlaquo END IF raquo en fin de structure et non pas laquo ENDIF raquo Lrsquoexemple affiche un message diffeacute-rent selon la nature du numeacutero de teacuteleacutephone contenu dans la variable v_telephone

Figure 6-4 Exeacutecution drsquoun bloc

4055_06_C06 Page 217 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

218 copy Eacuteditions Eyrolles

Conditions booleacuteennes

Les tableaux suivants preacutecisent le reacutesultat drsquoopeacuterateurs logiques qui mettent en jeu des varia-bles booleacuteennes pouvant prendre trois valeurs (TRUE FALSE NULL) Bien sucircr en lrsquoabsencedrsquoun vrai type booleacuteen MySQL repreacutesente TRUE avec 1 et FALSE avec 0 Il est agrave noter que laneacutegation de NULL (NOT NULL) renvoie une valeur nulle

Structure CASE

Comme lrsquoinstruction IF la structure CASE permet drsquoexeacutecuter une seacutequence drsquoinstructions enfonction de diffeacuterentes conditions La structure CASE est utile lorsqursquoil faut eacutevaluer une mecircmeexpression et proposer plusieurs traitements pour diverses conditions

Tableau 6-10 Structures IF

IF-THEN IF-THEN-ELSE IF-THEN-ELSEIF

IF condition THEN instructionsEND IF

IF condition THEN instructionsELSE instructionsEND IF

IF condition1 THEN instructionsELSEIF condition2 THEN instructions2 ELSE instructions3END IF

BEGIN DECLARE v_telephone CHAR(14) DEFAULT 06-76-85-14-89 SELECT Cest un portable ELSE SELECT Cest un fixe END IFEND

IF SUBSTR(v_telephone12)=06 THEN

Tableau 6-11 Opeacuterateur AND

AND TRUE FALSE NULL

TRUE TRUE FALSE NULL

FALSE FALSE FALSE FALSE

NULL NULL FALSE NULL

Tableau 6-12 Opeacuterateur OR

OR TRUE FALSE NULL

TRUE TRUE TRUE TRUE

FALSE TRUE FALSE NULL

NULL TRUE NULL NULL

4055_06_C06 Page 218 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 219

chapitre ndeg 6 Bases du langage de programmation

Selon la nature de lrsquoexpression et des conditions une des deux eacutecritures suivantes peut ecirctreutiliseacutee

Le tableau suivant nous livre lrsquoeacutecriture avec IF drsquoune programmation qursquoil est plus rationneldrsquoeffectuer avec une structure CASE (de type searched)

Structures reacutepeacutetitives

Eacutetudions agrave preacutesent les trois structures reacutepeacutetitives tant que reacutepeacuteter et boucle sans fin

Structure tant que

La structure tant que se programme agrave lrsquoaide de la syntaxe suivante Avant chaque iteacuteration (etnotamment avant la premiegravere) la condition est eacutevalueacutee Si elle est vraie la seacutequence drsquoinstruc-tions est exeacutecuteacutee puis la condition est reacuteeacutevalueacutee pour un eacuteventuel nouveau passage dans la

Tableau 6-13 Structures CASE

CASE searched CASE

CASE variable WHEN expr1 THEN instructions1 WHEN expr2 THEN instructions2 hellip WHEN exprN THEN instructionsN [ELSE instructionsN+1]END CASE

CASE WHEN condition1 THEN instructions1 WHEN condition2 THEN instructions2 hellip WHEN conditionN THEN instructionsN [ELSE instructionsN+1]END CASE

Tableau 6-14 Diffeacuterentes programmations

IF CASE

BEGINDECLARE v_mention CHAR(2)DECLARE v_note DECIMAL(42) DEFAULT 98

IF v_note gt= 16 THEN SET v_mention = TB ELSEIF v_note gt= 14 THEN SET v_mention = B ELSEIF v_note gt= 12 THEN SET v_mention = AB ELSEIF v_note gt= 10 THEN SET v_mention = P ELSE END IF

CASE WHEN v_note gt= 16 THEN SET v_mention = TB WHEN v_note gt= 14 THEN SET v_mention = B WHEN v_note gt= 12 THEN SET v_mention = AB WHEN v_note gt= 10 THEN SET v_mention = P ELSE SET v_mention = REND CASE

Web

SET v_mention = R

4055_06_C06 Page 219 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

220 copy Eacuteditions Eyrolles

boucle Ce processus continue jusqursquoagrave ce que la condition soit fausse pour passer en seacutequenceapregraves le END WHILE Quand la condition nrsquoest jamais fausse on dit que le programme bouclehellip

[etiquette] WHILE condition DO

instructions

END WHILE [etiquette]

Le tableau suivant deacutecrit la programmation de deux tant que Le premier calcule la somme des100 premiers entiers Le second recherche le premier numeacutero 4 dans une chaicircne de caractegraveres

Cette structure est la plus puissante car elle permet de programmer aussi un reacutepeacuteter uneboucle sans fin et mecircme un pour (qui nrsquoest pas encore opeacuterationnel) Elle doit ecirctre utiliseacuteequand il est neacutecessaire de tester une condition avant drsquoexeacutecuter les instructions contenues dansla boucle

Structure reacutepeacuteter

La structure reacutepeacuteter se programme agrave lrsquoaide de la syntaxe REPEAThellip UNTIL

Enfin un reacutepeacuteter qui se programme comme il faut (agrave savoir laquo reacutepeacuteterhellip jusqursquoagrave condition raquo) Leslangages C et Java nous avaient deacuteformeacute cette traduction par do hellip while(condition)qui neacutecessite drsquoeacutecrire lrsquoinverse de la condition du jusqursquoagrave de lrsquoalgorithmique Ouf MySQL(comme Oracle) a bien programmeacute la structure reacutepeacuteter en traduisant ce fameux jusqursquoagrave par ladirective until et non plus par ce facirccheux while

Tableau 6-15 Structures tant que

Condition simple Condition composeacutee

DECLARE v_somme INT DEFAULT 0DECLARE v_entier SMALLINT DEFAULT 1

SET v_somme = v_somme+v_entier SET v_entier = v_entier+1

SELECT v_somme

+---------+| v_somme |+---------+| 5050 |+---------+

DECLARE v_telephone CHAR(14) DEFAULT 06-76-85-14-89DECLARE v_trouve BOOLEAN DEFAULT FALSEDECLARE v_indice SMALLINT DEFAULT 1

IF SUBSTR(v_telephonev_indice1) = 4 THEN SET v_trouve = TRUE ELSE SET v_indice = v_indice + 1 END IF

IF v_trouve THEN SELECT CONCAT(Trouveacute 4 agrave lindice v_indice)END IF

Trouveacute 4 agrave lindice 11

Web

WHILE (v_entier lt= 100) DO

END WHILEWHILE (v_indice lt= 14 AND NOT v_trouve) DO

END WHILE

4055_06_C06 Page 220 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 221

chapitre ndeg 6 Bases du langage de programmation

[etiquette] REPEAT

instructions

UNTIL condition END REPEAT [etiquette]

La particulariteacute de cette structure est que la premiegravere iteacuteration est effectueacutee quelles que soientles conditions initiales La condition nrsquoest eacutevalueacutee qursquoen fin de boucle

Si la condition est fausse la seacutequence drsquoinstructions est de nouveau exeacutecuteacutee Ce processuscontinue jusqursquoagrave ce que la condition soit vraie pour passer en seacutequence apregraves le END REPEAT

Quand la condition nrsquoest jamais vraie on dit aussi que le programme bouclehellip

Le tableau suivant deacutecrit la programmation de la somme des 100 premiers entiers et de larecherche du premier numeacutero 4 dans une chaicircne de caractegraveres agrave lrsquoaide de la structure reacutepeacuteterLes variables sont les mecircmes qursquoau tableau preacuteceacutedent

Cette structure doit ecirctre utiliseacutee quand il nrsquoest pas neacutecessaire de tester la condition avec lesdonneacutees initiales avant drsquoexeacutecuter les instructions contenues dans la boucle

Structure boucle sans fin

La syntaxe geacuteneacuterale de cette structure est programmeacutee par la directive LOOP Elle devient sansfin si vous nrsquoutilisez pas lrsquoinstruction LEAVE qui passe en seacutequence du END LOOP

[etiquette] LOOP

instructions

END LOOP [etiquette]

Le tableau suivant donne lrsquoeacutecriture du calcul de la somme des 100 premiers entiers en utilisantdeux boucles sans fin (qui se terminent toutefois car tout a une fin mais celles-lagrave je lesprogramme avec LEAVE) Jrsquoen profite pour preacutesenter ITERATE qui force agrave reprendrelrsquoexeacutecution au deacutebut de la boucle

Tableau 6-16 Structures reacutepeacuteter

Condition simple Condition composeacutee

REPEATSET v_somme = v_somme + v_entierSET v_entier = v_entier + 1

UNTIL END REPEAT

REPEAT IF SUBSTR(v_telephonev_indice1) = 4 THEN SET v_trouve = TRUE ELSE SET v_indice = v_indice + 1 END IFUNTIL END REPEATIF v_trouve THEN SELECT CONCAT(Trouveacute 4 agrave lindice v_indice)END IF

Web

v_entier gt 100

(v_indice gt 14 OR v_trouve)

4055_06_C06 Page 221 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

222 copy Eacuteditions Eyrolles

Il est agrave noter que LEAVE peut ecirctre aussi utiliseacute pour sortir drsquoun bloc (srsquoil est eacutetiqueteacute) LEAVEet ITERATE peuvent aussi ecirctre employeacutes au sein de structures REPEAT ou WHILE

Redirection (GOTO)Ceacutelegravebre pour faire tendre un programme vers une configuration plutocirct de feu drsquoartifice que decours drsquoeau tranquille lrsquoinstruction GOTO est bien connue mais souvent mal utiliseacutee Elle peutecirctre pratique dans certains cas pour sortir drsquoune boucle ou drsquoun bloc Il nrsquoest pas souhaitableque vous utilisiez GOTO agrave moins que vous eacutecriviez vos algorithmes avec des organigrammes

Dans son livre blanc (httpdevmysqlcomtech-resourcesarticlesmysql-storedprocedu-reshtml) Peter Gulutzan parle de laquo GOTO etiquette raquo et de laquo LABEL etiquette raquo Cetarticle est sorti alors que la version becircta de MySQL 50 nrsquoen eacutetait qursquoagrave ses deacutebuts Cette fonc-tionnaliteacute semble avoir eacuteteacute supprimeacutee dans la version de production Agrave suivre donc

Structure pourRenommeacutee pour les parcours de vecteurs tableaux et matrices en tout genre la structure pourse caracteacuterise par la connaissance a priori du nombre drsquoiteacuterations que le programmeur souhaitefaire effectuer agrave son algorithme La syntaxe geacuteneacuterale de cette structure est programmeacutee danstous les langages par lrsquoinstruction for

Absente pour lrsquoinstant de MySQL elle peut se programmer par un reacutepeacuteter un tant que ouencore par une boucle sans fin Dans tous ces cas il faudra deacutefinir un indice allant drsquoune valeurinitiale agrave une valeur finale tout en increacutementant ce mecircme indice en fin de boucle

Interactions avec la base

Cette section deacutecrit les meacutecanismes que MySQL offre pour interfacer un sous-programmeavec une base de donneacutees

Tableau 6-17 TStructures boucle sans fin

Avec LEAVE Avec ITERATE

SET v_somme = v_somme + v_entier SET v_entier = v_entier + 1 IF v_entier gt 100 THEN END IF

SET v_somme = v_somme + v_entier SET v_entier = v_entier + 1 IF v_entier lt= 100 THEN END IF

Webboucle1 LOOP

LEAVE boucle1

END LOOP boucle1

boucle1 LOOP

ITERATE boucle1

LEAVE boucle1END LOOP boucle1

4055_06_C06 Page 222 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 223

chapitre ndeg 6 Bases du langage de programmation

Extraire des donneacutees

La principale instruction capable drsquoextraire des donneacutees contenues dans des tables estSELECT Eacutetudieacutee au chapitre 4 dans un contexte SQL la particulariteacute de cette instruction auniveau drsquoun sous-programme est la directive INTO qui permet de charger des variables agrave partirde valeurs de colonnes comme le montre la syntaxe suivante

SELECT col1 [col2 ]INTO variable1 [variable2 ]

FROM nomTable

Cette instruction peut aussi ecirctre utiliseacutee agrave lrsquoexteacuterieur drsquoun bloc pour charger une variable desession par exemple

Veillez agrave ne reacutecupeacuterer qursquoun seul enregistrement agrave lrsquoaide du WHERE de la requecircte Crsquoest logi-que puisque vous deacutesirez ne charger qursquoune valeur par variable

bull Si vous en extrayez plusieurs vous verrez lrsquoerreur laquo ERROR 1172 (42000) Resultconsisted of more than one row raquo

bull Si vous nrsquoen extrayez aucun (no data found) aucune erreur nrsquoest souleveacutee et la variable estinchangeacutee (elle reste initialiseacutee agrave la valeur preacutesente avant la requecircte)

Colonnes simples

Le tableau suivant deacutecrit lrsquoextraction de la colonne compa pour le pilote de code PL-2 dansdiffeacuterents contextes

Tableau 6-18 Extraction de donneacutees

Code MYSQL Commentaires

BEGIN DECLARE v_comp VARCHAR(15) SELECT FROM Pilote WHERE brevet=PL-2 END

Chargement drsquoune variable locale agrave un blocNeacutecessiteacute drsquoappeler par la suite cette proceacute-dure (CALL)

SET vs_compa=$SELECT compa FROM Pilote WHERE brevet=PL-2$

Chargement drsquoune variable de session horsdrsquoun sous-programme

SET vs_compa=$CREATE PROCEDURE sp1() BEGIN SELECT FROM Pilote WHERE brevet=PL-2 END

Chargement drsquoune variable de session dans unsous-programme

compa INTO v_comp

INTO vs_compa

compa INTO vs_compa

4055_06_C06 Page 223 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

224 copy Eacuteditions Eyrolles

Pour traiter des requecirctes renvoyant plusieurs enregistrements il faudra utiliser des curseurs(eacutetudieacutes au chapitre suivant)

Fonctions SQL

Il est naturel que les fonctions SQL (mono et multilignes) eacutetudieacutees au chapitre 4 soienteacutegalement disponibles dans un sous-programme agrave condition de les utiliser au sein drsquouneinstruction SELECT Deux exemples sont deacutecrits dans le tableau suivant le premier char-gera la variable avec le nom du pilote de code PL-1 en majuscules (table deacutecrite au deacutebutdu chapitre 4) le second affectera agrave la variable le maximum du nombre drsquoheures de voltous pilotes confondus

Manipuler des donneacutees

Les principales instructions disponibles pour manipuler par un sous-programme leseacuteleacutements drsquoune base de donneacutees sont les mecircmes que celles proposeacutees par SQL agrave savoirINSERT UPDATE et DELETE Pour libeacuterer les verrous au niveau drsquoun enregistrement (etdes tables) il faudra ajouter les instructions COMMIT ou ROLLBACK (aspects eacutetudieacutes en finde chapitre)

Insertions

Le tableau suivant deacutecrit lrsquoinsertion de diffeacuterents enregistrements sous plusieurs eacutecritures (ilest aussi possible drsquoutiliser des variables de session)

Comme sous SQL il faut respecter les noms types et domaines de valeurs des colonnes Demecircme les contraintes de veacuterification (CHECK qui nrsquoest pas encore opeacuterationel et NOT NULL)et drsquointeacutegriteacute (PRIMARY KEY et FOREIGN KEY) doivent ecirctre valides

Dans le cas inverse une exception qui preacutecise la nature du problegraveme est leveacutee et peut ecirctreintercepteacutee par la directive HANDLER (voir chapitre suivant) Si une telle directive nrsquoexiste pas

Tableau 6-19 Utilisation de fonctions

Monoligne Multiligne

BEGIN DECLARE v_nomEnMAJUSCULES CHAR(20) SELECT FROM Pilote WHERE brevet = PL-1SELECT v_nomEnMAJUSCULESEND

BEGIN DECLARE v_plusGrandHVol DECIMAL(72) SELECT FROM PiloteSELECT v_plusGrandHVol END

+-------------------+| v_nomEnMAJUSCULES |+-------------------+| GRATIEN VIEL |+-------------------+

+-----------------+| v_plusGrandHVol |+-----------------+| 245000 |+-----------------+

Web

UPPER(nom)INTO v_nomEnMAJUSCULES

MAX(nbHVol) INTO v_plusGrandHVol

4055_06_C06 Page 224 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 225

chapitre ndeg 6 Bases du langage de programmation

dans le bloc qui contient lrsquoinstruction INSERT la premiegravere exception fera srsquointerrompre leprogramme

Modifications

Concernant la mise agrave jour de colonnes par UPDATE la clause SET peut ecirctre ambigueuml dans lesens ougrave lrsquoidentificateur agrave gauche de lrsquoopeacuterateur drsquoaffectation est toujours une colonne de basede donneacutees alors que celui agrave droite de lrsquoopeacuterateur peut correspondre agrave une colonne ou agrave unevariable

UPDATE nomTable

SET col1 = variable1 | expression1 | autrecol | (requecircte)

[col2 = ]

[WHERE ]

Si aucun enregistrement nrsquoest modifieacute aucune erreur ne se produit et aucune exception nrsquoestleveacutee

Alors que les affectations dans le code MYSQL (SET hellip) peuvent srsquoeacutecrire par les symboleslaquo = raquo ou laquo = raquo les comparaisons ou affectations SQL neacutecessitent le symbole laquo = raquo

Le tableau suivant deacutecrit la modification de diffeacuterents enregistrements (il est aussi possibledrsquoemployer des variables de session)

Tableau 6-20 Insertion drsquoenregistrements

Code MySQL Commentaires

BEGIN DECLARE v_brevet VARCHAR(6) DEFAULT PL-7 DECLARE v_nom VARCHAR(6) DECLARE v_HVol DECIMAL(72) DEFAULT 0 DECLARE v_comp VARCHAR(6)

Deacuteclaration des variables locales aubloc

INSERT INTO Pilote VALUES

Insertion drsquoun enregistrement en rensei-gnant les colonnes par des constantes

SET v_nom = Fabrice Peyrard SET v_comp = SING INSERT INTO Pilote VALUES END

Insertion drsquoun enregistrement en rensei-gnant les colonnes par des variableslocales

Web

(PL-6 Jules Ente 3000 AF)

(v_brevetv_nomv_HVolv_comp)

4055_06_C06 Page 225 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

226 copy Eacuteditions Eyrolles

Suppressions

La suppression par DELETE peut ecirctre ambigueuml (mecircme raison que pour lrsquoinstruction UPDATE)au niveau de la clause WHERE

DELETE FROM nomTable

[WHERE col1 = variable1 | expression1 | autrecol | (requecircte)

[col2 = ] ]

Si aucun enregistrement nrsquoest modifieacute aucune erreur ne se produit et aucune exception nrsquoestleveacutee

Le tableau suivant deacutecrit la suppression de diffeacuterents enregistrements (il est aussi possibledrsquoutiliser des variables de session)

Tableau 6-21 Modifications drsquoenregistrements

Code MySQL Commentaires

BEGIN DECLARE v_dureeVol DECIMAL(31) DEFAULT 48

Deacuteclaration

UPDATE Pilote SET WHERE brevet= PL-6

Modification drsquoun enregistrement de la table Pilote en utilisant une variable

UPDATE Pilote SET WHERE compa = AFEND

Modification de plusieurs enregistrements de la table Pilote en utilisant une cons-tante

Web

nbHVol= nbHVol + v_dureeVol

nbHVol= nbHVol + 10

Tableau 6-22 Suppression drsquoenregistrements

Code MYSQL Commentaires

BEGIN DECLARE v_hVolMini DECIMAL(72) DEFAULT 100000

DELETE FROM Pilote WHERE nbHVol lt

DELETE FROM Pilote WHERE Supprime les enregistrements dela table Pilote dont le nombredrsquoheures de vol est infeacuterieur agrave1 000Supprime un pilote

DELETE FROM Pilote WHERE END

Ne supprime aucun pilote

Web

v_hVolMini

brevet = PL-3

brevet = NULL

4055_06_C06 Page 226 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 227

chapitre ndeg 6 Bases du langage de programmation

Transactions

Une transaction est un bloc drsquoinstructions LMD faisant passer la base de donneacutees drsquoun eacutetatcoheacuterent agrave un autre eacutetat coheacuterent Si un problegraveme logiciel ou mateacuteriel survient au cours drsquounetransaction aucune des instructions contenues dans la transaction nrsquoest effectueacutee quel quesoit lrsquoendroit de la transaction ougrave est intervenue lrsquoerreur

On peut supposer que la majoriteacute des transactions sous MySQL sont programmeacutees dans lelangage du serveur Les langages plus eacutevolueacutes permettent aussi de deacutevelopper des transactionsagrave travers des API (par exemple la meacutethode commit est comprise dans le paquetagejavasql)

Lrsquoexemple typique drsquoune transaction est celui du transfert drsquoun compte eacutepargne vers uncompte courant Imaginez qursquoapregraves une panne votre compte eacutepargne a eacuteteacute deacutebiteacute de la sommede 500 euro sans que votre compte courant soit creacutediteacute du mecircme montant Vous ne seriez pastregraves content des services de votre banque (agrave moins que lrsquoerreur ne soit intervenue dans lrsquoautresens) Le meacutecanisme transactionnel empecircche un tel sceacutenario en invalidant toutes les opeacutera-tions faites depuis le deacutebut de la transaction si une panne survient au cours de cette mecircmetransaction

Caracteacuteristiques

Une transaction assure

lrsquoatomiciteacute des instructions qui sont consideacutereacutees comme une seule opeacuteration (principe dutout ou rien)

la coheacuterence (passage drsquoun eacutetat coheacuterent de la base agrave un autre eacutetat coheacuterent)

lrsquoisolation des transactions entre elles (lecture consistante meacutecanisme deacutecrit plus loin)

la durabiliteacute des opeacuterations (les mises agrave jour perdurent mecircme si une panne se produit apregravesla transaction)

Figure 6-5 Transaction

TRANSFERT(500euro) Deacutebut Transaction hellip UPDATE Codevi( -500euro) UPDATE CompteCourant(+500euro) Fin Transaction

Eacutetat coheacuterent

TEMPS

PANNE

Eacutetat coheacuterent

4055_06_C06 Page 227 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

228 copy Eacuteditions Eyrolles

Deacutebut et fin drsquoune transaction

Deux instructions sont disponibles pour marquer le deacutebut drsquoune transaction START TRAN-SACTION ou BEGIN Ainsi entre BEGIN et END drsquoun programme MySQL il est possibledrsquoeacutecrire plusieurs transactions Le fait de commencer une transaction termine implicitementcelle qui preacuteceacutedait ladite transaction

Une transaction se termine explicitement par les instructions SQL COMMIT ou ROLLBACK Ellese termine implicitement

bull agrave la premiegravere commande SQL du LDD ou du LCD rencontreacutee (CREATE ALTER DROPhellip)

bull agrave la fin normale drsquoune session utilisateur avec deacuteconnexion

bull agrave la fin anormale drsquoune session utilisateur (sans deacuteconnexion)

Nous deacutetaillons ici les principes de base drsquoune transaction MySQL sans entrer dans des deacutetailsplus techniques (veacuterouillages accegraves concurrents et transactions reacuteparties) qui sortent du cadrede cet ouvrage

Mode de validation

Deux modes de fonctionnement sont possibles celui par deacutefaut (autocommit) qui validesysteacutematiquement toutes les instructions reccedilues par la base Dans ce mode point de salut car ilvous sera impossible de revenir en arriegravere afin drsquoannuler une instruction Le mode agrave utiliserpour programmer des transactions est celui inverse (autocommit off) qui se deacuteclare agrave lrsquoaide duparamegravetre 0 dans lrsquoinstruction suivante

SET AUTOCOMMIT = 0 | 1

Le tableau suivant preacutecise la validiteacute de la transaction en fonction des eacuteveacutenements possibles

Votre premiegravere transaction

Vous pouvez tester rapidement une transaction en eacutecrivant le bloc suivant qui insegravere une lignedans une de vos tables

Tableau 6-23 Validiteacute drsquoune transaction

Eacuteveacutenement Validiteacute

COMMIT Transaction valideacutee

ROLLBACKCommande SQL (LDD ou LCD)Fin anormale drsquoune session

Transaction non valideacutee

4055_06_C06 Page 228 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 229

chapitre ndeg 6 Bases du langage de programmation

delimiter $

DROP PROCEDURE sp1$

CREATE PROCEDURE sp1()

BEGIN

SET AUTOCOMMIT = 0

INSERT INTO TableaVous VALUES ()

END

$

--appel de la transaction

CALL sp1()$

SELECT FROM TableaVous$

Exeacutecutez ce bloc dans lrsquointerface puis deacuteconnectez-vous soit en cassant la fenecirctre (icocircne enhaut agrave droite) soit proprement avec exit Reconnectez-vous et constatez que lrsquoenregistre-ment nrsquoest pas preacutesent dans votre table Mecircme quand la fin du programme est normale la tran-saction nrsquoest pas valideacutee (car il manque COMMIT) Relancez le bloc en ajoutant cetteinstruction apregraves lrsquoinsertion Notez que lrsquoenregistrement est preacutesent deacutesormais dans votretable mecircme apregraves une deacuteconnexion douce ou dure

Controcircle des transactions

Il est inteacuteressant de pouvoir deacutecouper une transaction en inseacuterant des points de validation(savepoints) qui rendent possible lrsquoannulation de tout ou partie des opeacuterations composantladite transaction

La figure suivante illustre une transaction deacutecoupeacutee en trois parties Lrsquoinstruction ROLLBACKpeut srsquoeacutecrire sous diffeacuterentes formes Ainsi ROLLBACK TO SAVEPOINTPointvalidation1 invalidera les UPDATE et le DELETE tout en laissant la possibiliteacute deconfirmer lrsquoinstruction INSERT (en fonction des commandes se trouvant apregraves ce ROLLBACKrestreint et de la maniegravere dont la session se terminera)

Web

Figure 6-6 Points de validation

Deacutebut Transaction INSERThellipPoint validation 1 UPDATEhellip UPDATEhellipPoint validation 2 DELETE hellip hellip

Fin Transaction

ROLLBACK

ROLLBACK TO SAVEPOINTPoint validation1

ROLLBACK TO SAVEPOINTPoint validation2

4055_06_C06 Page 229 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

230 copy Eacuteditions Eyrolles

Le tableau suivant deacutecrit une transaction MySQL deacutecoupeacutee en trois parties Le programmeuraura le choix entre les instructions ROLLBACK TO SAVEPOINT indiqueacutees en commentairepour valider tout ou partie de la transaction Il faudra finalement se deacutecider entre COMMIT etROLLBACK

Lrsquoinstruction SAVEPOINT deacuteclare un point de validation

Transactions imbriqueacutees

Il nrsquoest pas possible drsquoimbriquer plusieurs transactions se deacuteroulant dans diffeacuterents blocs

Il nrsquoest pas possible drsquoinvalider par ROLLBACK une commande SQL du LDD ou du LCD rencon-treacutee (CREATE ALTER DROPhellip)

Tableau 6-24 Transaction deacutecoupeacutee

Code MYSQL Commentaires

BEGINSET AUTOCOMMIT = 0 INSERT INTO Compagnie VALUES(C22 Place Brassens Blagnac Easy Jet)

Premiegravere partie de la transaction

UPDATE Compagnie SET nrue = 125 WHERE comp = AF UPDATE Compagnie SET ville = Castanet WHERE comp = C1

Deuxiegraveme partie de la transaction

DELETE FROM Compagnie WHERE comp = C1

Troisiegraveme partie de la transaction

-- Premiegravere partie agrave valider

-- Deuxiegraveme partie agrave valider

-- Troisiegraveme partie agrave valider

Tout agrave invalider

END

Valide la ou les sous-parties

Web

SAVEPOINT P1

SAVEPOINT P2

ROLLBACK TO SAVEPOINT P1

ROLLBACK TO SAVEPOINT P2

ROLLBACK TO SAVEPOINT P3

ROLLBACK

COMMIT

4055_06_C06 Page 230 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 231

chapitre ndeg 6 Bases du langage de programmation

Exercices

Lrsquoobjectif de ces exercices est drsquoeacutecrire des blocs puis des transactions manipulant des tablesdu scheacutema Parc Informatique Vous utiliserez une proceacutedure pour tester vos blocs comme ilest indiqueacute dans la section Test des exemples

61 Extraction de donneacutees

Eacutecrire le bloc MySQL qui affiche les deacutetails de la derniegravere installation de logiciel sous la forme suivante(les champs en gras sont agrave extraire)

+------------------------------------------------+

| Resultat 1 exo 1 |

+------------------------------------------------+

| Derniere installation en salle numeacuterodeSalle |

+------------------------------------------------+

+--------------------------------------------------------------------+

| Resultat 2 exo 1 |

+--------------------------------------------------------------------+

| Poste numeacuteroPoste Logiciel nomLogiciel en date du dateInstallation |

+--------------------------------------------------------------------+

Vous utiliserez SELECT hellip INTO pour extraire ces valeurs Ne tenez pas compte pour le moment deserreurs qui pourraient eacuteventuellement se produire (aucune installation de logiciel poste ou logiciel nonreacutefeacuterenceacutes dans la base etc)

62 Variables de session

Eacutecrire le bloc MySQL qui affecte hors drsquoun bloc par des variables session un numeacutero de salle et untype de poste et qui retourne des variables session permettant de composer un message indiquantles nombres de postes et drsquoinstallations de logiciels correspondants

+--------------------------------------------------------------------+

| Resultat exo2 |

+--------------------------------------------------------------------+

| x poste(s) installe(s) en salle y z installation(s) de type t |

+--------------------------------------------------------------------+

Essayez pour la salle s01 et le type UNIX Vous devez extraire 1 poste et 3 installations Ne tenez pascompte pour le moment drsquoeacuteventuelles erreurs (aucun poste trouveacute ou aucune installation reacutealiseacutee etc)

63 Transaction

Eacutecrire une transaction permettant drsquoinseacuterer un nouveau logiciel dans la base apregraves avoir passeacute enparamegravetres par des variables de session toutes ses caracteacuteristiques (numeacutero nom version et type dulogiciel) La date drsquoachat doit ecirctre celle du jour Tracer lrsquoinsertion du logiciel (message Logicielinseacutereacute dans la base)

4055_06_C06 Page 231 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

232 copy Eacuteditions Eyrolles

Il faut ensuite proceacuteder agrave lrsquoinstallation de ce logiciel sur le poste de code p7 (utiliser une variable pourpouvoir plus facilement modifier ce paramegravetre) Lrsquoinstallation doit se faire aussi agrave la date du jour Penseragrave actualiser correctement la colonne delai qui mesure le deacutelai (TIME) entre lrsquoachat et lrsquoinstallationPour ne pas que ce deacutelai soit nul (les deux insertions se feraient dans la mecircme seconde dans cettetransaction) placer une attente de 5 secondes entre lrsquoajout dans la table Logiciel et celui dans latable Installer agrave lrsquoaide de lrsquoinstruction SELECT SLEEP(5) Utiliser la fonction TIMEDIFF pourcalculer ce deacutelai

Inseacuterer par exemple le logiciel log15 de nom MySQL Query version 14 typePCWS coucirctant 95 euroTracer la transaction comme suit

+------------------------------+

| message1 |

+------------------------------+

| Logiciel insere dans la base |

+------------------------------+

1 row in set (001 sec)

+----------------------------------+

| message2 |

+----------------------------------+

| Date achat 2005-11-23 191604 |

+----------------------------------+

+----------+

| SLEEP(5) |

+----------+

| 0 |

+----------+

+-----------------------------------------+

| message3 |

+-----------------------------------------+

| Date installation 2005-11-23 191610 |

+-----------------------------------------+

+--------------------------------+

| message4 |

+--------------------------------+

| Logiciel installe sur le poste |

+--------------------------------+

Veacuterifiez lrsquoeacutetat des tables mises agrave jour apregraves la transaction Ne tenez pas compte pour le momentdrsquoeacuteventuelles erreurs (numeacutero du logiciel deacutejagrave reacutefeacuterenceacute type du logiciel incorrect installation deacutejagravereacutealiseacutee etc)

Attente de 5 secondes agrave ce niveau

4055_06_C06 Page 232 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

233

Chapitre 7

Programmation avanceacutee

Ce chapitre est consacreacute agrave des caracteacuteristiques avanceacutees du langage proceacutedural de MySQL

eacutecriture et appel de sous-programmes

programmation des curseurs

gestion des exceptions

mise en place de deacuteclencheurs

utilisation du SQL dynamique

Sous-programmes

Les sous-programmes sont des blocs nommeacutes qui sont compileacutes et qui reacutesident dans la basede donneacutees Dans le vocabulaire des bases de donneacutees on appelle les sous-programmes

storedprocedures

ou

stored routines

Ce sont des fonctions ou proceacutedures laquo catalogueacutees raquo (oulaquo stockeacutees raquo) capables drsquoinclure des paramegravetres en entreacutee Comme dans tous les langages deprogrammation les fonctions retournent un unique reacutesultat alors que les proceacutedures reacutealisentdes actions sans en donner (sauf eacuteventuellement en paramegravetre de sortie)

Eacutetant un des plus laquo jeunes raquo des SGBD MySQL tend au plus pregraves (en ajoutant toutefois desextensions) de la syntaxe normative de SQL2003 (sections

Stored Modules

et

Computationalcompleteness

) Lrsquoautre SGBD se rapprochant le plus de la norme est DB2 drsquoIBM Oracle etSQL Server de Microsoft ont un grand nombre de caracteacuteristiques absentes de la norme

Pour lrsquoinstant seules les proceacutedures sont capables drsquoinclure des paramegravetres en sortie

Un sous-programme ne se recompile pas automatiquement suite agrave la modification drsquoun objet

de la base manipuleacute dans son code (ajout drsquoune colonne dans une table par exemple)

Geacuteneacuteraliteacutes

Il est possible de retrouver le code drsquoun sous-programme au niveau du dictionnaire desdonneacutees (voir la fin du chapitre 5) Le sous-programme peut ecirctre ainsi partageacute dans un

4055_07_C07 Page 233 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

234

copy Eacuteditions Eyrolles

contexte multi-utilisateur Les avantages drsquoutiliser des sous-programmes ont eacuteteacute souligneacutes auchapitre 6 (modulariteacute portabiliteacute extensibiliteacute reacuteutilisabiliteacute inteacutegriteacute et confidentialiteacute)

Comme les blocs nous verrons que les sous-programmes ont une partie de deacuteclaration desvariables une autre contenant les instructions et eacuteventuellement une partie pour geacuterer lesexceptions (erreurs produites durant lrsquoexeacutecution)

Une proceacutedure peut ecirctre appeleacutee agrave lrsquoaide de lrsquointerface de commande (par

CALL

) dans unprogramme externe (Java PHP Chellip) par drsquoautres proceacutedures ou fonctions ou dans le corpsdrsquoun deacuteclencheur Les fonctions peuvent ecirctre invoqueacutees dans une instruction SQL (

SELECT

INSERT

et

UPDATE

) ou dans une expression (affectation de variable ou calcul)

Le cycle de vie drsquoun sous-programme est le suivant creacuteation de la proceacutedure ou de la fonction(compilation et stockage dans la base) appel et eacuteventuellement suppression du sous-programme de la base

Proceacutedures catalogueacutees

La syntaxe de creacuteation drsquoune proceacutedure catalogueacutee est la suivante Le privilegravege

CREATEROUTINE

est requis sur la base de donneacutees (ou au niveau global) en question (

ALTERROUTINE

et

EXECUTE

sont affecteacutes par la suite automatiquement)

CREATE

PROCEDURE

[

nomBase

]

nomProceacutedure

(

[ [ IN | OUT | INOUT ]

param

typeMySQL

[[ IN | OUT | INOUT ]

param2

typeMySQL

] ] )

[ LANGUAGE SQL

| [NOT] DETERMINISTIC

| CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

| SQL SECURITY DEFINER | INVOKER

| COMMENT

commentaire

]

BEGIN

[DECLARE ]

bloc drsquoinstructions

SQL et MySQL

END

deacutelimiteur

Par deacutefaut la proceacutedure est creacuteeacutee dans la base de donneacutees courante (seacutelectionneacutee) Si unnom est speacutecifieacute (

nomBase

) la proceacutedure appartiendra agrave cette base de donneacutees

IN

deacutesigne un paramegravetre drsquoentreacutee (par deacutefaut)

OUT

un paramegravetre de sortie et

INOUT

unparamegravetre drsquoentreacutee et de sortie

LANGUAGE SQL

(par deacutefaut) deacutetermine le langage de programmation de la proceacutedureMySQL nrsquoest pas encore compatible avec drsquoautres langages que le sien

4055_07_C07 Page 234 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

235

chapitre ndeg 7 Programmation avanceacutee

DETERMINISTIC

est simplement informationnel (lrsquooptimiseur srsquoen servira dans desversions ulteacuterieures) et deacutecrit le caractegravere deacuteterministe de la proceacutedure Si vous interrogezla base il serait plus naturel drsquoutiliser

NOT DETERMINISTIC

car on ne sait pas a priorice que lrsquoon va extraire (comme dans la boicircte de chocolats de

Forrest Gump)

CONTAINS SQL

renseigne sur le fait que la proceacutedure interagit avec la base

NO SQL

indi-que lrsquoinverse

READS SQL DATA

preacutecise que les interactions sont en lecture seulement

MODIFIES SQL DATA

signifie que des mises agrave jour de la base sont possibles

SQL SECURITY

deacutetermine si la proceacutedure srsquoexeacutecute avec les privilegraveges du creacuteateur(option par deacutefaut

definer-rights procedure

) ou ceux de lrsquoutilisateur qui appelle la proceacute-dure (

invoker-rights procedure

)

COMMENT

permet de commenter la proceacutedure au niveau du dictionnaire des donneacutees (voirchapitre 5)

bloc drsquoinstructions

SQL et MySQL

contient les deacuteclarations et les instructions dela proceacutedure eacutecrite dans le langage de MySQL (voir le chapitre preacuteceacutedent)

deacutelimiteur

deacutelimiteur de commandes diffeacuterent de laquo raquo (symbole utiliseacute obligatoire-ment en fin de chaque deacuteclaration et instruction du langage proceacutedural de MySQL)

Fonctions catalogueacutees

La syntaxe de creacuteation drsquoune fonction catalogueacutee est

CREATE FUNCTION

Les preacuterogativeset les options sont les mecircmes que pour les proceacutedures Nrsquooubliez pas lrsquoinstruction laquo

RETURN

variable

raquo

qui termine la fonction et retourne le reacutesultat (de mecircme type que celui deacuteclareacutedans la clause

RETURNS

CREATE

FUNCTION

[

nomBase

]

nomFonction

(

[

param

typeMySQL

[

param2

typeMySQL

] ] )

RETURNS

typeMySQL

[ LANGUAGE SQL

| [NOT] DETERMINISTIC

| CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

| SQL SECURITY DEFINER | INVOKER

| COMMENT commentaire

]

BEGIN

[DECLARE ]

bloc drsquoinstructions SQL et MySQL

contenant un laquo RETURN variable raquo

END

deacutelimiteur

4055_07_C07 Page 235 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

236 copy Eacuteditions Eyrolles

Structure drsquoun sous-programme

Dans une proceacutedure comme dans une fonction les deacuteclarations des variables curseurs etexceptions suivent directement lrsquoen-tecircte du bloc (apregraves la directive BEGIN) La figure suivanteillustre la structure drsquoune speacutecification et drsquoun corps drsquoun sous-programme MySQL Le blocdrsquoinstructions doit contenir au moins une instruction MySQL

Exemples

Consideacuterons la table Pilote Nous allons eacutecrire (dans la base bdsoutou) une fonction etune proceacutedure

La fonction EffectifsHeure(compheures) devra renvoyer le nombre de pilotesdrsquoune compagnie donneacutee (premier paramegravetre) qui ont plus drsquoheures de vol que la valeur dudeuxiegraveme paramegravetre (si aucun pilote retourne 0) Si aucune compagnie nrsquoest passeacutee enparamegravetre (mettre NULL) le calcul inclut toutes les compagnies Les eacuteventuelles erreurs nesont pas encore traiteacutees (compagnie de code inexistant par exemple)

La proceacutedure PlusExperimente(compnomheures) doit retourner le nom et lenombre drsquoheures de vol du pilote (par lrsquointermeacutediaire des deuxiegraveme et troisiegraveme paramegrave-tres) le plus expeacuterimenteacute drsquoune compagnie donneacutee (premier paramegravetre) Si plusieurs pilo-tes ont la mecircme expeacuterience un message drsquoerreur est afficheacute Si aucune compagnie nrsquoestpasseacutee en paramegravetre (mettre NULL) la proceacutedure retourne le nom du plus expeacuterimenteacute et lecode de sa compagnie (par lrsquointermeacutediaire du premier paramegravetre)

Remarquez que la fonction aurait pu ecirctre programmeacutee par une proceacutedure ayant un troisiegravemeparamegravetre de sortie

Figure 7-1 Structure drsquoun sous-programme

CREATE PROCEDURE | FUNCTION nomSousProgramme [()] [RETURNS typeMSQL ]

BEGIN[DECLARE deacuteclaration ] instructions MySQL

BEGIN [DECLARE deacuteclaration ]

instructions MySQL END hellipEND

$

4055_07_C07 Page 236 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 237

chapitre ndeg 7 Programmation avanceacutee

Une fonction

La creacuteation de la fonction est reacutealiseacutee agrave lrsquoaide du script suivant (EffectifsHeuresql)Notez que les deux paramegravetres drsquoentreacutee ne sont pas deacutefinis par la directive IN et que la clauseRETURN doit ecirctre preacutesente en fin de codage

BEGIN

DECLARE resultat SMALLINT

IF (pcomp IS NULL) THEN

SELECT COUNT() INTO resultat FROM Pilote WHERE nbHVol gt pheuresVol

ELSE

SELECT COUNT() INTO resultat FROM Pilote WHERE nbHVol gt pheuresVol

AND comp = pcomp

END IF

END

Une proceacutedure

La creacuteation de la proceacutedure est reacutealiseacutee agrave lrsquoaide du script suivant (PlusExperimentesql)Notez les deux derniers paramegravetres de sortie deacutefinis par la directive OUT et le premier servantdrsquoentreacutee ou de sortie avec la directive INOUT On peut assimiler le passage drsquoun paramegravetre parreacutefeacuterence agrave lrsquoutilisation de la directive INOUT

Figure 7-2 Proceacutedures

Pilote

brevet nom nbHVol comp

PL-1 Gilles Laborde 2450 AF PL-2 Freacutedeacuteric DAlmeyda 900 AF PL-3 Florence Peacuterissel 1000 SING PL-4 Thierry Millan 2450 CAST PL-5 Christine Royo 200 AF PL-6 Aureacutelia Ente 2450 SING

EffectifsHeure(comp heures)

(lsquoAFrsquo 300) 2

PlusExperimente(comp nom heures )

(lsquoAFrsquo ) (lsquoAFrsquo lsquo Gilles Labordersquo 2450)

function procedure

WebCREATE FUNCTION bdsoutouEffectifsHeure(pcomp VARCHAR(4)

pheuresVol DECIMAL(72)) RETURNS SMALLINT

RETURN resultat

4055_07_C07 Page 237 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

238 copy Eacuteditions Eyrolles

BEGIN

DECLARE p1 SMALLINT

IF (pcomp IS NULL) THEN

SELECT COUNT() INTO p1 FROM Pilote

WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote)

ELSE

SELECT COUNT() INTO p1 FROM Pilote

WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote WHERE comp=pcomp)

AND comp = pcomp

END IF

IF (p1 = 0) THEN

SELECT (Aucun pilote nest le plus expeacuterimenteacute) AS resultat

ELSEIF p1 gt 1 THEN

SELECT(Plusieurs pilotes sont les plus expeacuterimenteacutes) AS resultat

ELSE

IF (pcomp IS NULL) THEN

SELECT nom nbHVol comp INTO pnomPil pheuresVol pcomp

FROM Pilote WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote)

ELSE

SELECT nom nbHVol INTO pnomPil pheuresVol FROM Pilote

WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote WHERE comp=pcomp)

AND comp = pcomp

END IF

END IF

END

Fonction nrsquointeragissant pas avec la base

La fonction EcritureComplexe renvoie une chaicircne de caractegraveres deacutesignant lrsquoeacutecriture drsquounnombre complexe sous la forme laquo a + bi raquo ou laquo a - bi raquo (EcritureComplexesql) enfonction du signe des deux paramegravetres a et b deacutefinissant la partie reacuteelle et la partie imaginairedu complexe

BEGIN

DECLARE result VARCHAR(80)

IF (imaginaire lt 0) THEN

SET result = CONCAT(Complexe reel--imaginairei)

WebCREATE PROCEDURE bdsoutouPlusExperimente

(INOUT pcomp VARCHAR(4) OUT pnomPil VARCHAR(20) OUT pheuresVol DECIMAL(72))

WebCREATE FUNCTION bdsoutouEcritureComplexe

(reel DECIMAL(72) imaginaire DECIMAL(72))

RETURNS VARCHAR(80)

4055_07_C07 Page 238 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 239

chapitre ndeg 7 Programmation avanceacutee

ELSE

SET result = CONCAT(Complexe reel+imaginairei)

END IF

RETURN result

END

Compilation

Pour compiler ces sous-programmes agrave partir de lrsquointerface de commande il faut ajouter undeacutelimiteur apregraves chaque dernier END comme suit

delimiter $

Sous programme

$

Si un message drsquoerreur apparaicirct il indique la ligne concerneacutee souvent lrsquoerreur peut ecirctre situeacuteejuste avant cette ligne Le mecircme reacutesultat peut ecirctre obtenu par la commande SHOW ERRORS

Une fois que le message laquo Query OK 0 rows affected (hellip sec) raquo apparaicirct le sous-programme est correctement compileacute

Appel drsquoun sous-programme

Le creacuteateur drsquoun sous-programme peut exeacutecuter ce dernier agrave la demande et sans aucune condi-tion preacutealable Pour exeacutecuter un sous-programme agrave partir drsquoun autre accegraves les conditionssuivantes doivent ecirctre respecteacutees

deacutetenir le privilegravege EXECUTE sur la proceacutedure en question ou sur la base qui contient lesous-programme ou au niveau global

mentionner le nom de la base (du scheacutema) contenant le sous-programme agrave lrsquoexeacutecution dece dernier (exemple drsquoappel sous lrsquointerface de commande de la proceacutedure AugmenteCa-pacite de la base bdjean pour lrsquoavion drsquoimmatriculation F-GLFS laquo CALLbdjeanAugmenteCapacite(F-GLFS) raquo)

Deacutecrivons lrsquoappel drsquoun sous-programme sous lrsquointerface de commande dans un sous-programme MySQL et dans une instruction SQL Le chapitre suivant deacutetaillera un tel appel agravepartir drsquoun programme externe (Java ou PHP)

Sous lrsquointerface de commande

En phase de tests il est inteacuteressant de pouvoir deacuteclencher un sous-programme directementdans lrsquointerface de commande La commande CALL permet drsquoappeler une proceacutedure Unefonction est exeacutecuteacutee par son nom dans une instruction SQL

Le tableau suivant deacutecrit lrsquoappel et le reacutesultat des trois sous-programmes La fonction estappeleacutee ici dans un SELECT et dans un INSERT de deux maniegraveres diffeacuterentes

4055_07_C07 Page 239 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

240 copy Eacuteditions Eyrolles

Dans un sous-programme

Invoquons les sous-programmes agrave preacutesent agrave partir drsquoun autre sous-programme Le mecircme prin-cipe peut ecirctre adopteacute pour lrsquoappel dans un deacuteclencheur La proceacutedure srsquoappelle toujours parCALL la fonction par son nom (ici elle est appeleacutee dans lrsquoaffectation drsquoune variable)

Tableau 7-1 Appels dans lrsquointerface de commande

Appel dun sous-programme Reacutesultat

delimiter

+-----------------------------------+| bdsoutouEffectifsHeure(AF300) |+-----------------------------------+| 2 |+-----------------------------------+

delimiter SET vs_compa = AFSET vs_nompil = SET vs_heures =

SELECT vs_compavs_nompilvs_heures+-----------+----------------+------------+| vs_compa | vs_nompil | vs_heures |+-----------+----------------+------------+| AF | Gilles Laborde | 245000 |+-----------+----------------+------------+

delimiter SELECT

+---------------------------------+| bdsoutouEcritureComplexe(2-5) |+---------------------------------+| Complexe 2-5i |+---------------------------------+

CREATE TABLE testTrace (col VARCHAR(80))INSERT INTO testTrace SELECT bdsoutouEcritureComplexe (-2-5)INSERT INTO testTrace VALUES )

SELECT FROM testTrace+------------------+| col |+------------------+| Complexe -2-5i || Complexe 3-7i |+------------------+

WebSELECT bdsoutouEffectifsHeure

(AF300)

CALL bdsoutouPlusExperimente(vs_compa vs_nompilvs_heures)

bdsoutouEcritureComplexe(2-5)

bdsoutouEcritureComplexe

bdsoutouEcritureComplexe(3-7)

4055_07_C07 Page 240 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 241

chapitre ndeg 7 Programmation avanceacutee

Reacutecursiviteacute

La reacutecursiviteacute nrsquoest pour lrsquoinstant pas permise dans MySQL au niveau des sous-programmes

Comme dans tout programme reacutecursif il ne faudrait pas oublier la condition de terminaison Lrsquoexemple suivant deacutecrit la programmation agrave lrsquoaide drsquoune fonction reacutecursive du calcul de lafactorielle drsquoun entier positif La compilation se deacuteroule sans erreur lrsquoappel lui nous ramegraveneagrave lrsquoordre

Tableau 7-2 Appels dans un sous-programme

Codage Appels

CREATE PROCEDURE testsp1()BEGIN DECLARE v_compa VARCHAR(4) DEFAULT AF DECLARE v_heures DECIMAL(72) DEFAULT 300 DECLARE v_nbpil SMALLINT SELECT v_nbpilEND

CALL testsp1()$+---------+| v_nbpil |+---------+| 2 |+---------+

SET vs_compa = NULL$SET vs_nompil = $SET vs_heures = $CREATE PROCEDURE testsp2()BEGIN END

CALL testsp2()$+---------------------------------+| resultat |+---------------------------------+| Plusieurs pilotes sont les plus expeacuterimenteacutes |+---------------------------------+-- Les variables de session sont -- toutes agrave NULL

SET vs_resultat = $CREATE PROCEDURE testsp3()BEGIN SET vs_resultat = END

CALL testsp3()$SELECT vs_resultat AS Reacutesultat$+-----------------+| Reacutesultat |+-----------------+| Complexe 7-2i |+-----------------+

Web

SET v_nbpil = bdsoutouEffectifsHeure(v_compav_heures)

CALL bdsoutouPlusExperimente(vs_compavs_nompilvs_heures)

bdsoutouEcritureComplexe(7-2)

4055_07_C07 Page 241 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

242 copy Eacuteditions Eyrolles

Sous-programmes imbriqueacutes

Il nrsquoest pas possible de creacuteer un sous-programme (nested subprogram) dans un autre sous-programme

Cela nrsquoest valable que pour les blocs drsquoinstructions qui peuvent eacuteventuellement en incluredrsquoautres (voir chapitre 6)

Le tableau suivant deacutecrit la deacuteclaration invalide du sous-programme Mouchard dans laproceacutedure imbriquee Ce sous-programme inseacutererait une ligne dans une table pour tracerlrsquoappel de la proceacutedure en fonction de lrsquoutilisateur et du moment de lrsquoexeacutecution

Tableau 7-3 Reacutecursiviteacute

Code MYSQL Commentaires

delimiter $CREATE FUNCTION factorielle(n INT) RETURNS INTBEGIN IF THEN RETURN (1) ELSE RETURN (n factorielle(n - 1)) END IFEND$

Condition de terminaison

Appel reacutecursif

SELECT AS Factorielle de 10$ERROR 1424 (HY000) Recursive stored routines are not allowed

Appel de la fonction

Web

n = 1

factorielle(10)

Tableau 7-4 Sous-programme imbriqueacute

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouimbriquee (INOUT p1 VARCHAR(2)) BEGIN

Deacuteclaration du sous-programme

CREATE PROCEDURE bdsoutouMouchard() BEGIN INSERT INTO testTrace VALUES (CONCAT(USER() a lanceacute imbriquee le SYSDATE())) END

Deacuteclaration du sous-programme imbriqueacute

SET p1 = OK Deacutebut du sous-programme CALL bdsoutouMouchard()END$

Appel du sous-programme imbriqueacute

Web

4055_07_C07 Page 242 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 243

chapitre ndeg 7 Programmation avanceacutee

La compilation renvoie un message drsquoerreur tregraves clair

ERROR 1303 (2F003) Cant create a PROCEDURE from within another

stored routine

La solution est de creacuteer les deux proceacutedures agrave part ou drsquoinclure un bloc BEGINhellip END dans laproceacutedure de plus haut niveau

Modification drsquoun sous-programme

La modification drsquoun sous-programme srsquoexeacutecute par la commande ALTER Pour pouvoirchanger un sous-programme si vous nrsquoecirctes pas son creacuteateur vous devez deacutetenir le privilegravegeALTER ROUTINE sur la base de donneacutees (ou au niveau global) Plusieurs caracteacuteristiquespeuvent ecirctre corrigeacutees en une seule instruction (mais ni le code ni les paramegravetres) La syntaxegeacuteneacuterale est la suivante

ALTER PROCEDURE | FUNCTION [nomBase]nomSousProg

[ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

| SQL SECURITY DEFINER | INVOKER

| COMMENT commentaire

]

Lrsquoinstruction suivante commente le sous-programme Mouchard preacutesent dans la basebdsoutou en indiquant qursquoil interagit avec la base en eacutecriture et qursquoil srsquoexeacutecutera avec lesprivilegraveges de lrsquoaccegraves utilisateur qui lrsquoa creacuteeacute

ALTER PROCEDURE bdsoutouMouchard

MODIFIES SQL DATA

SQL SECURITY DEFINER

COMMENT Traces de qui lance quoi

Destruction drsquoun sous-programme

Pour supprimer un sous-programme si vous nrsquoecirctes pas son creacuteateur le privilegravege ALTERROUTINE est requis sur la base de donneacutees (ou au niveau global) La syntaxe de suppressiondrsquoun sous-programme est la suivante

DROP PROCEDURE | FUNCTION [IF EXISTS] [nomBase]nomSousProg

IF EXISTS eacutevite un message de warning si le sous-programme nrsquoexiste pas

Les instructions suivantes suppriment la proceacutedure catalogueacutee Mouchard de la base bdsou-tou

delimiter

DROP PROCEDURE bdsoutouMouchard

4055_07_C07 Page 243 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

244 copy Eacuteditions Eyrolles

Restrictions

Les restrictions que nous mentionnons ici srsquoappliquent eacutegalement aux deacuteclencheurs (eacutetudieacutesen fin de ce chapitre) Bien qursquoil existe des restrictions qui srsquoappliquent seulement aux fonc-tions et aux deacuteclencheurs elles peuvent srsquoappliquer agrave une proceacutedure si cette derniegravere est appe-leacutee dans le code de la fonction ou du deacuteclencheur

bull Les instructions suivantes ne peuvent ecirctre preacutesentes dans un sous-programme CHECKTABLES LOCK TABLES UNLOCK TABLES LOAD DATA LOAD TABLE et OPTIMIZE TABLE

bull Il nrsquoest pas possible de programmer des instructions SQL en dynamique (PREPARE EXE-CUTE DEALLOCATE PREPARE) dans un deacuteclencheur (possible dans une fonction ou uneproceacutedure)

bull Il nrsquoy a pas encore drsquooutil de deacutebogage pour les sous-programmes

bull Les instructions CALL ne peuvent ecirctre preacutepareacutees agrave lrsquoavance (CALL variable)

bull MySQL ne prend pas encore en charge la notion de paquetage (package) qui est un moduleregroupant plusieurs objets (variables exceptions curseurs fonctions ou proceacutedures) four-nissant un ensemble de services (un peu comme une classe dans lrsquoapproche objet)

Curseurs

Les curseurs sont tregraves utiliseacutes pour ne pas dire qursquoils sont omnipreacutesents dans toute applicationimportante Le concept analogue au niveau de JDBC est programmeacute agrave lrsquoaide de la classeResultset et sous ASP de Microsoft agrave lrsquoaide de la classe RecordSet (appeleacutee DataSetavec Net)

MySQL nrsquoest compatible qursquoavec des curseurs en lecture seulement non navigables nonmodifiables et non dynamiques

Geacuteneacuteraliteacutes

Un curseur est une zone meacutemoire qui est geacuteneacutereacutee cocircteacute serveur (mise en cache) et qui permet detraiter individuellement chaque ligne renvoyeacutee par un SELECT Un sous-programme peuttravailler avec plusieurs curseurs en mecircme temps Un curseur durant son existence (delrsquoouverture agrave la fermeture) contient en permanence lrsquoadresse de la ligne courante

La figure suivante illustre la manipulation de base drsquoun curseur Le curseur est deacutecrit apregraves lesvariables Il est ouvert dans le code du programme il srsquoeacutevalue alors et va se charger enextrayant les donneacutees de la base Le programme peut parcourir tout le curseur en reacutecupeacuterantles lignes une par une dans une variable locale Le curseur est ensuite fermeacuteLes curseurs doivent ecirctre deacuteclareacutes apregraves les variables et avant les exceptions

4055_07_C07 Page 244 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 245

chapitre ndeg 7 Programmation avanceacutee

Il nrsquoexiste pour lrsquoinstant qursquoune seule maniegravere de parcourir un curseur du premier au dernierenregistrement

Instructions

Les instructions disponibles pour travailler avec des curseurs sont deacutefinies dans le tableausuivant

Figure 7-3 Principes drsquoun curseur

CREATE PROCEDURE nomSousProgramme [( )]

BEGIN

DECLARE v2 DECLARE v3

DECLARE CURSOR curs1 FOR SELECT brevetnbhVol comp

FROM Pilote WHERE comp = lsquoAFrsquo

OPEN curs1

FETCH curs1 INTO v1v2v3

END

$

curs1

PL -1 2450 AF PL -2 900 AF PL -5 200 AF

v1 v2 v3

PL -1 2450 AF

Curseur

DECLARE v1

Tableau 7-5 Instructions pour les curseurs

Instructions Commentaires et exemples

CURSOR FOR requecircte Deacuteclaration du curseur DECLARE curs1 CURSOR FOR SELECT brevetnbHVolcomp FROM bdsoutouPilote WHERE comp = AF

OPEN nomCurseur Ouverture du curseur (chargement des lignes) Aucune exception nrsquoestleveacutee si la requecircte ne ramegravene aucune ligne OPEN curs1

FETCH nomCurseur INTO listeVariables

Positionnement sur la ligne suivante et chargement de lrsquoenregistrementcourant dans une ou plusieurs variables FETCH curs1 INTO var1var2var3

CLOSE nomCurseur Ferme le curseur Lrsquoexception laquo ERROR 1326 (24000) Cursor isnot open raquo se deacuteclenche si des accegraves au curseur sont opeacutereacutes apregravessa fermeture CLOSE curs1

4055_07_C07 Page 245 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

246 copy Eacuteditions Eyrolles

Parcours drsquoun curseur

Vous pouvez choisir drsquoutiliser une structure reacutepeacutetitive tant que ou reacutepeacuteter Le tableau suivantpreacutesente le parcours drsquoun curseur agrave lrsquoaide de ces deux techniques Ici il srsquoagit de faire lasomme des heures de vol des pilotes de la compagnie de code AF

Notez lrsquoutilisation obligatoire drsquoune exception (handler dans le vocable de MySQL) qui forcele programme agrave continuer si on arrive en fin du curseur (au-delagrave du dernier enregistrement)tout en positionnant la variable curs1 agrave vrai (1) Je dis laquo obligatoire raquo car MySQL nepropose pas pour lrsquoheure de fonctions sur les curseurs (FOUND NOT_FOUND IS_CLOSEDetc) Nous eacutetudierons plus en deacutetail les exceptions dans la prochaine section

Personnellement je preacutefegravere la programmation avec un tant que Lrsquoappel de cette proceacutedure(avec lrsquoune ou lrsquoautre des techniques) sur la table de la figure 7-2 produira le reacutesultat suivant

+---------------------------------------+

| Total heures pour les pilotes de AF |

+---------------------------------------+

| 355000 |

+---------------------------------------+

Tableau 7-6 Parcours drsquoun curseur

Tant que Reacutepeacuteter

DECLARE fincurs1 BOOLEAN DEFAULT 0DECLARE v_nbHv DECIMAL(72)DECLARE v_tot DECIMAL(82) DEFAULT 0

DECLARE CONTINUE HANDLER FOR NOT FOUND SET fincurs1 = 1

REPEAT IF NOT fincurs1 THEN SET v_tot = v_tot+v_nbHv END IF UNTIL fincurs1 END REPEAT

WHILE (NOT fincurs1) DO SET v_tot = v_tot+v_nbHv END WHILE

SELECT v_tot AS Total heures pour les pilotes de AF

Web

DECLARE curs1 CURSOR FORSELECT nbHVol FROM bdsoutouPilote WHERE comp = AF

OPEN curs1

FETCH curs1 INTO v_nbHv FETCH curs1 INTO v_nbHv

FETCH curs1 INTO v_nbHv

CLOSE curs1

4055_07_C07 Page 246 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 247

chapitre ndeg 7 Programmation avanceacutee

Accegraves concurrents (FOR UPDATE)

Si vous voulez verrouiller les lignes drsquoune table interrogeacutee par un curseur dans le but de mettreagrave jour la table sans qursquoun autre utilisateur ne la modifie en mecircme temps il faut utiliser laclause FOR UPDATE Elle srsquoemploie lors de la deacuteclaration du curseur et verrouille les lignesconcerneacutees degraves lrsquoouverture du curseur Les verrous sont libeacutereacutes agrave la fin de la transaction

Il est souvent inteacuteressant de pouvoir modifier facilement la ligne courante drsquoun curseur(UPDATE ou DELETE) agrave reacutepercuter au niveau de la table Il est conseilleacute drsquoutiliser un curseurFOR UPDATE pour verrouiller les lignes agrave actualiser

Le tableau suivant deacutecrit un bloc qui se sert du curseur FOR UPDATE pour

augmenter le nombre drsquoheures de 100 pour les pilotes de la compagnie de code AF

diminuer ce nombre de 100 pour les pilotes de la compagnie de code SING

supprimer les pilotes des autres compagnies

Tableau 7-7 Curseur avec verrouillage explicite

Code MySQL Commentaires

BEGIN DECLARE fincurs BOOLEAN DEFAULT 0 DECLARE v_brevet VARCHAR(6) DECLARE v_nbHv DECIMAL(72) DECLARE v_comp VARCHAR(4) DECLARE CONTINUE HANDLER FOR NOT FOUND SET fincurs = 1SET AUTOCOMMIT = 0OPEN cursFETCH curs INTO v_brevetv_nbHvv_compWHILE (NOT fincurs) DO IF (v_comp=AF) THEN UPDATE bdsoutouPilote SET nbHVol = nbHVol + 100 WHERE brevet = v_brevet ELSEIF (v_comp=SING) THEN UPDATE bdsoutouPilote SET nbHVol = nbHVol - 100 WHERE brevet = v_brevet ELSE DELETE FROM bdsoutouPilote WHERE brevet = v_brevet END IF FETCH curs INTO v_brevetv_nbHvv_comp END WHILECLOSE cursCOMMIT

Deacuteclaration du curseur avec verrou

Chargement et parcours du curseur

Mise agrave jour de la table Pilote par lrsquointermeacutediaire du curseur

Validation de la transaction

Web

DECLARE curs CURSOR FORSELECT brevetnbHVolcompFROM bdsoutouPilote FOR UPDATE

4055_07_C07 Page 247 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

248 copy Eacuteditions Eyrolles

Restrictions

bull Une validation (COMMIT) avant la fermeture drsquoun curseur FOR UPDATE aura des effets debord facirccheux

bull Il nrsquoest pas possible de deacuteclarer un curseur FOR UPDATE en utilisant dans la requecircte lesdirectives DISTINCT ou GROUP BY un opeacuterateur ensembliste ou une fonction drsquoagreacutegat

bull Il nrsquoexiste pas encore de directive WHERE CURRENT OF pour modifier lrsquoenregistrement cou-rant drsquoun curseur avec verrou

bull Un curseur comme un tableau ne peut pas ecirctre passeacute en paramegravetre drsquoun sous-programmeni en entreacutee (IN) ni en sortie (OUT)

Exceptions

Afin drsquoeacuteviter qursquoun programme ne srsquoarrecircte degraves la premiegravere erreur suite agrave une instruction SQL(SELECT ne retournant aucune ligne INSERT ou UPDATE drsquoune valeur incorrecte DELETEdrsquoun enregistrement laquo pegravere raquo ayant des enregistrements laquo fils raquo associeacutes etc) il est indispen-sable de preacutevoir les cas potentiels drsquoerreurs et drsquoassocier agrave chacun de ces cas la programmationdrsquoune exception (handler dans le vocabulaire de MySQL)

Dans le langage des informaticiens on dit qursquoon garde la main pendant lrsquoexeacutecution duprogramme Le meacutecanisme des exceptions (handling errors) est largement utiliseacute par tous lesdeacuteveloppeurs car il est preacutepondeacuterant dans la mise en œuvre des transactions Les exceptionspeuvent se parameacutetrer dans un sous-programme (fonction ou proceacutedure catalogueacutee) ou undeacuteclencheur

Geacuteneacuteraliteacutes

Une exception MySQL correspond agrave une condition drsquoerreur et peut ecirctre associeacutee agrave un identifi-cateur (exception nommeacutee) Une exception est deacutetecteacutee (aussi dite laquo leveacutee raquo) si elle est preacutevuedans un handler au cours de lrsquoexeacutecution drsquoun bloc (entre BEGIN et END) Une fois leveacutee ellefait continuer (ou sortir du bloc) le programme apregraves avoir reacutealiseacute une ou plusieurs instructionsque le programmeur aura explicitement speacutecifieacutees

La figure suivante illustre les deux meacutecanismes qui peuvent ecirctre mis en œuvre pour geacuterer uneexception (seuls CONTINUE et EXIT sont actuellement pris en charge par MySQL) Suppo-sons que lrsquoextraction ne ramegravene aucune ligne on peut programmer la sortie du bloc courant oucontinuer dans le bloc Supposons que lrsquoinsertion deacuteclenche une erreur on peut eacutegalementdeacutecider de sortir ou de poursuivre le traitement

4055_07_C07 Page 248 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 249

chapitre ndeg 7 Programmation avanceacutee

Si aucune erreur ne se produit le traitement se termine ou retourne agrave son appelant srsquoil srsquoagitdrsquoun sous-programme lanceacute drsquoun programme principal La syntaxe geacuteneacuterale drsquoune exceptionest la suivante Les exceptions doivent ecirctre deacuteclareacutees de preacutefeacuterence apregraves les variables et avantles curseurs

DECLARE CONTINUE | EXIT | UNDO

HANDLER FOR

SQLSTATE [VALUE] lsquovaleur_sqlstatersquo | nomException | SQLWARNING

| NOT FOUND | SQLEXCEPTION | code_erreur_mysql

instructions MySQL

[ SQLSTATE ]

La directive CONTINUE (appeleacutee handler) force agrave poursuivre lrsquoexeacutecution de programmelorsqursquoil se passe un eacuteveacutenement preacutevu dans la clause FOR

Le handler EXIT fait sortir lrsquoexeacutecution du bloc courant (entre BEGIN et END)

Le handler UNDO nrsquoest pas encore reconnu Agrave son nom on se doute de son utiliteacute agrave savoirdeacutefaire les instructions SQL qui auront eacuteteacute exeacutecuteacutees (sans avoir eacuteteacute valideacutees par un COMMIT)avant que lrsquoexception ne se deacuteclenche

SQLSTATE permet de couvrir toutes les erreurs drsquoun eacutetat donneacute

nomException srsquoapplique agrave la gestion des exceptions nommeacutees (eacutetudieacutees plus loin)

SQLWARNING permet de couvrir toutes les erreurs drsquoeacutetat SQLSTATE deacutebutant par 01

NOT FOUND permet de couvrir toutes les erreurs drsquoeacutetat SQLSTATE deacutebutant par 02

Figure 7-4 Principe geacuteneacuteral des exceptions

BEGIN

DECLARE CONTINUE | EXIT | UNDO

HANDLER FOR

SQLSTATE v | SQLEXCEPTION | NOT FOUND | erreurMySQL hellip

BEGIN

SELECT INTO FROM

INSERT

END

END

NOT FOUND

EXIT

CONTINUE

CONTINUE

EXITSQLEXCEPTION

4055_07_C07 Page 249 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

250 copy Eacuteditions Eyrolles

SQLEXCEPTION gegravere toutes les erreurs qui ne sont ni geacutereacutees par SQLWARNING ni par NOTFOUND

instructions MySQL une ou plusieurs instructions du langage de MySQL (blocappel possibles par CALL drsquoune fonction ou drsquoune proceacutedure catalogueacutee)

Il est possible de grouper plusieurs deacuteclarations drsquoexceptions ainsi que de preacutevoir plusieursconditions pour une mecircme exception En plus de pouvoir tester des erreurs pour tel ou tel eacutetat(SQLSTATE) nous verrons que lrsquoon peut reacutecupeacuterer une erreur de code donneacute (paramegravetrecode_erreur_mysql) Par exemple ERROR 1046 deacutesigne la non seacutelection drsquoune base dedonneacutees (1046 devra ecirctre eacutecrit en lieu et place de code_erreur_mysql)

Restrictions

Il nrsquoest pas encore possible de deacuterouter volontairement lrsquoexeacutecution drsquoun sous-programme aveccertaines conditions par lrsquointermeacutediaire drsquoune instruction speacutecifique comme RAISE ou RESI-GNAL Lrsquoexception serait ainsi manuellement deacuteclencheacutee et pourrait ecirctre deacutefinie par le program-meur (par exemple la condition PILOTE_TROP_JEUNE si lrsquoacircge drsquoun pilote est infeacuterieur agrave20 ans)

Il nrsquoest pas non plus permis de deacuteclarer ses propres exceptions (par exemple pour pouvoirdeacuterouter le sous-programme si lrsquoacircge drsquoun pilote est infeacuterieur agrave une valeur donneacutee)

Eacutetudions agrave preacutesent les diffeacuterents types drsquoexceptions en programmant des proceacutedures simplesinterrogeant la table Pilote illustreacutee agrave la figure 7-2

Exceptions avec EXITExaminons la clause EXIT de lrsquoinstruction DECLARE HANDLER agrave travers un exemple

Gestion de NOT FOUND

Le tableau suivant deacutecrit une proceacutedure qui gegravere une erreur aucun pilote nrsquoest associeacute agrave lacompagnie de code passeacute en paramegravetre (NOT FOUND) La proceacutedure ne se termine pas correc-tement si plusieurs lignes sont retourneacutees (erreur Result consisted of more thanone row)

4055_07_C07 Page 250 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 251

chapitre ndeg 7 Programmation avanceacutee

La trace drsquoune exeacutecution correcte de cette proceacutedure (si la requecircte retourne une seule ligne laproceacutedure ne passe pas dans le si) est la suivante

CALL bdsoutouprocException1(CAST)$

+--------------------------------------------------------+

| Resultat procException1 |

+--------------------------------------------------------+

| Le seul pilote de la compagnie CAST est Sonia Dietrich |

+--------------------------------------------------------+

Une autre exeacutecution correcte de cette proceacutedure (qui se deacuteroute hors du bloc du fait de NOTFOUND) est la suivante

CALL bdsoutouprocException1(RIEN)$

+-----------------------------------------------+

| Resultat procException1 |

+-----------------------------------------------+

| Il ny a pas de pilote pour la compagnie RIEN |

+-----------------------------------------------+

Tableau 7-8 Exception NOT FOUND traiteacutee avec EXIT

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 END IFEND

Deacuteclaration de la proceacutedure et des variables

Bloc qui deacuteclare lrsquoexception

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Affichage du reacutesultat

Fin du blocGestion de lrsquoerreur

Fin de la proceacutedure

Web

BEGIN SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END

DECLARE EXIT HANDLER FOR NOT FOUNDSET flagNOTFOUND =1

4055_07_C07 Page 251 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

252 copy Eacuteditions Eyrolles

Gestion drsquoune erreur particuliegravere

Le tableau suivant deacutecrit une ameacutelioration de la preacuteceacutedente proceacutedure par le fait de geacutererlrsquoerreur particuliegravere permettant de savoir si la requecircte renvoie plusieurs lignes (ERROR 1172(42000) Result consisted of more than one row) La proceacutedure se terminemaintenant correctement si la requecircte retourne une seule ligne ou plusieurs (message person-naliseacute en sortie de bloc)

La trace drsquoune exeacutecution correcte de cette proceacutedure (qui se deacuteroute hors du bloc du fait deplusieurs lignes retourneacutees) est la suivante

Tableau 7-9 Exceptions 1172 et NOT FOUND traiteacutees avec EXIT

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagPlusDun BOOLEAN DEFAULT 0 DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 END IF IF flagPlusDun THEN SELECT CONCAT(Il y a plusieurs pilotes pour la compagnie p_comp) AS Resultat procException1 END IFEND

Deacuteclaration de la proceacutedure et des variables

Bloc qui deacuteclare les deux exceptions

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Affichage du reacutesultat

Fin du bloc

Gestion des erreurs

Fin de la proceacutedure

Web

BEGIN DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND =1

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END

DECLARE EXIT HANDLER FOR 1172SET flagPlusDun =1

4055_07_C07 Page 252 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 253

chapitre ndeg 7 Programmation avanceacutee

CALL bdsoutouprocException1(AF)$

+-----------------------------------------------+

| Resultat procException1 |

+-----------------------------------------------+

| Il y a plusieurs pilotes pour la compagnie AF |

+-----------------------------------------------+

Appel drsquoune proceacutedure dans lrsquoexception

Le tableau suivant deacutecrit lrsquoappel drsquoune proceacutedure dans le cas de lrsquoerreur NOT FOUND La proceacute-dure principale exeacutecute le sousndashprogramme puis sort du bloc principal et se termine correctement

La trace drsquoune exeacutecution correcte de cette proceacutedure (qui se deacuteroute vers le sous-programmeappeleacute du fait de NOT FOUND) est la suivante

+-----------------------------------------------+

| Resultat procpasTrouve |

+-----------------------------------------------+

| Il ny a pas de pilote pour la compagnie RIEN |

+-----------------------------------------------+

Il est aiseacute de transposer ce raisonnement agrave plusieurs exceptions appelant diffeacuterents sous-programmes

Tableau 7-10 Exception NOT FOUND traiteacutee avec EXIT et CALL

Code MySQL Commentaires

CREATE PROCEDURE bdsoutoupasTrouve (IN p_comp VARCHAR(4)) BEGIN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procpasTrouveEND

Codage du sous-programme appeleacute lors de lrsquoexception

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE var1 VARCHAR(20)

Proceacutedure qui deacuteclare lrsquoexception

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp = p_comp SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1

Requecircte pouvant deacuteclencher lrsquoexception preacutevueAffichage du reacutesultat

END Fin de la proceacutedure principale

Web

DECLARE EXIT HANDLER FOR NOT FOUNDCALL bdsoutoupasTrouve(p_comp)

4055_07_C07 Page 253 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

254 copy Eacuteditions Eyrolles

Exceptions avec CONTINUEEacutetudions agrave preacutesent la clause CONTINUE de lrsquoinstruction DECLARE HANDLER

Gestion de NOT FOUND

Le tableau suivant deacutecrit la mecircme proceacutedure geacuterant lrsquoerreur NOT FOUND La proceacutedure setermine correctement si la requecircte retourne une seule ligne mais pas lorsqursquoelle en renvoieplusieurs (erreur Result consisted of more than one row)

Gestion drsquoune erreur particuliegravere

Le tableau suivant deacutecrit la mecircme proceacutedure qui gegravere en plus lrsquoerreur Result consistedof more than one row La proceacutedure se termine correctement si la requecircte retourne uneseule ou plusieurs lignes

Tableau 7-11 Exception NOT FOUND traiteacutee avec CONTINUE

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

Deacuteclaration de la proceacutedure et des variables

Bloc qui deacuteclare lrsquoexception

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 ELSE SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END IF

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Test de gestion de lrsquoerreur

Affichage du reacutesultat

END Fin de la proceacutedure

Web

DECLARE CONTINUE HANDLER FOR NOT FOUNDSET flagNOTFOUND =1

4055_07_C07 Page 254 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 255

chapitre ndeg 7 Programmation avanceacutee

Gestion des autres erreurs (SQLEXCEPTION)

Si une erreur non preacutevue en tant qursquoexception (dans les clauses DECLARE HANDLER) seproduisait le programme se terminerait anormalement en renvoyant lrsquoerreur en question Ladirective SQLEXCEPTION couvre toutes les erreurs qui ne sont administreacutees ni par SQLWAR-NING ni par NOT FOUND

Dans notre exemple (seacutelection drsquoune colonne drsquoune table) seule une erreur laquo interne raquo pour-rait eacuteventuellement se produire (base de donneacutees ou table inexistante colonne de la tableinexistante ou drsquoun type diffeacuterent de VARCHAR(4) ou autre erreur systegraveme)

MySQL ne permet pas pour lrsquoinstant de reacutecupeacuterer dynamiquement au sein drsquoun sous-pro-gramme le code et le message de lrsquoerreur associeacutee agrave une exception leveacutee suite agrave une instruc-tion SQL et qui nrsquoa pas eacuteteacute preacutevue dans un handler

Tableau 7-12 Exceptions 1172 et NOT FOUND traiteacutees avec CONTINUE

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE flagPlusDun BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

Deacuteclaration de la proceacutedure et des variables

DECLARE CONTINUE HANDLER FOR NOT FOUND SET flagNOTFOUND =1

Bloc qui deacuteclare les deux exceptions

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 ELSEIF flagPlusDun THEN SELECT CONCAT(Il y a plusieurs pilotes pour la compagnie p_comp) AS Resultat procException1 ELSE SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END IF

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Test de gestion des erreurs

Affichage du reacutesultat

END Fin de la proceacutedure

Web

DECLARE CONTINUE HANDLER FOR 1172SET flagPlusDun =1

4055_07_C07 Page 255 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

256 copy Eacuteditions Eyrolles

En drsquoautres termes il faudra soit

interrompre brusquement votre proceacutedure avec diffeacuterents cas drsquoerreurs pour lister lescodes erreur geacuteneacutereacutes en sortie

vous contenter de geacuterer globalement les autres exceptions tout en ne sachant pas de quel-les erreurs il srsquoagit

Le tableau suivant deacutecrit la preacuteceacutedente proceacutedure qui controcircle en plus toutes les autres erreursnon preacutevues en appelant le sous-programme autreErreur()

Tableau 7-13 Exceptions toutes traiteacutees avec EXIT et SQLEXCEPTION

Code MySQL Commentaires

CREATE PROCEDURE bdsoutoutropdeLignes (IN p_comp VARCHAR(4))BEGIN SELECT CONCAT(Il y a plusieurs pilotes pour la compagnie p_comp) AS Resultat tropdeLignesEND

Codage des sous-programmesappeleacutes lors des exceptions

CREATE PROCEDURE bdsoutoupasTrouve (IN p_comp VARCHAR(4)) BEGIN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat pasTrouveEND

CREATE PROCEDURE bdsoutouautreErreur()BEGIN SELECT Erreur mais laquelle AS Resultat autreErreur 3 casEND

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE var1 VARCHAR(20) DECLARE EXIT HANDLER FOR 1172 CALL bdsoutoutropdeLignes(p_comp) DECLARE EXIT HANDLER FOR NOT FOUND CALL bdsoutoupasTrouve(p_comp) SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp = p_comp SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1

Proceacutedure principale qui deacuteclareles deux exceptions et toutes lesautres

Requecircte pouvant deacuteclencherlrsquoexception preacutevueAffichage du reacutesultat

END Fin de la proceacutedure

Web

DECLARE EXIT HANDLER FOR SQLEXCEPTIONCALL bdsoutouautreErreur()

4055_07_C07 Page 256 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 257

chapitre ndeg 7 Programmation avanceacutee

La trace drsquoune exeacutecution de cette proceacutedure (quelle que soit la valeur du paramegravetre passeacute enentreacutee) suite agrave la suppression de la table Pilote dans la base bdsoutou est la suivante

CALL bdsoutouprocException1(AF)$

+-----------------------+

| Resultat autreErreur |

+-----------------------+

| Erreur mais laquelle |

+-----------------------+

Mecircme erreur sur diffeacuterentes instructions

Plusieurs cas de figure sont possibles suivant qursquoon deacutesire maicirctriser une exception ou terminertoutes les exceptions avant la fin du sous-programme

Gestion drsquoune seule exception

Le tableau suivant deacutecrit une proceacutedure qui gegravere deux fois lrsquoerreur non trouveacutee (NOT FOUND)sur deux requecirctes distinctes La premiegravere requecircte extrait le nom du pilote de code passeacute en para-megravetre La deuxiegraveme donne le nom du pilote ayant un nombre drsquoheures de vol eacutegal agrave celui passeacuteen paramegravetre Le sous-programme se termine correctement si les deux requecirctes ne retournentqursquoun seul enregistrement Les autres erreurs potentielles ne sont pas prises en compte

Le principe est drsquoutiliser une variable indiquant quelle est la requecircte qui a fait sortir du blocpar lrsquoexception leveacutee

Exeacutecutons cette proceacutedure avec diffeacuterents paramegravetres on obtient

CALL bdsoutouprocException2(PL-1 1000)$

+------------------------------------------------------+

| CONCAT(Le pilote de code p_brevet est v_nom) |

+------------------------------------------------------+

| Le pilote de code PL-1 est Gilles Laborde |

+------------------------------------------------------+

+----------------------------------------------------------------+

| CONCAT(Le pilote ayant p_heures heures de vol est v_nom) |

+----------------------------------------------------------------+

| Le pilote ayant 1000 heures de vol est Florence Peacuterissel |

+----------------------------------------------------------------+

CALL bdsoutouprocException2(PL-0 2450)$

+-----------------------------------------------+

| CONCAT(Pas de pilote de brevet p_brevet) |

+-----------------------------------------------+

| Pas de pilote de brevet PL-0 |

+-----------------------------------------------+

4055_07_C07 Page 257 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

258 copy Eacuteditions Eyrolles

Dans cette proceacutedure une erreur sur la premiegravere requecircte interrompt le programme (apregraves avoirtraiteacute lrsquoexception) et de ce fait la deuxiegraveme requecircte nrsquoest pas eacutevalueacutee Pour cela il est inteacuteres-sant drsquoutiliser des blocs imbriqueacutes pour poursuivre le traitement apregraves avoir traiteacute une ouplusieurs exceptions

Gestion de plusieurs exceptions

Le tableau suivant deacutecrit une proceacutedure qui traite toutes les mecircmes exceptions en seacutequenceCe meacutecanisme permet de continuer lrsquoexeacutecution apregraves que MySQL a leveacute une exception Danscette proceacutedure les deux requecirctes sont eacutevalueacutees indeacutependamment du reacutesultat retourneacute parchacune drsquoelles

Tableau 7-14 Une exception NOT FOUND traiteacutee pour deux instructions

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException2 (IN p_brevet VARCHAR(6)IN p_heures DECIMAL(72)) BEGIN DECLARE v_nom VARCHAR(20) DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE v_requete TINYINT

IF flagNOTFOUND THEN IF v_requete = 1 THEN SELECT CONCAT(Pas de pilote de brevet p_brevet) ELSEIF v_requete = 2 THEN SELECT CONCAT(Pas de pilote ayant ce nombre dheures de vol p_heures) END IF END IFEND

Bloc avec les requecirctes deacuteclenchant potentiellement une exception preacutevue

Traitement pour savoir quelle requecircte a provoqueacute lrsquoexception

Web

BEGIN

SET v_requete = 1 SELECT nom INTO v_nom FROM bdsoutouPilote WHERE brevet = p_brevet SELECT CONCAT(Le pilote de code p_brevet est v_nom) SET v_requete = 2 SELECT nom INTO v_nom FROM bdsoutouPilote WHERE nbHVol = p_heures SELECT CONCAT(Le pilote ayant p_heures heures de vol est v_nom) END

DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND =1

4055_07_C07 Page 258 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 259

chapitre ndeg 7 Programmation avanceacutee

Lrsquoexeacutecution suivante de cette proceacutedure deacuteclenche les deux exceptions (ce qui nrsquoeacutetait pas lecas dans la proceacutedure preacuteceacutedente)

CALL bdsoutouprocException3(PL-0 500)$

+-----------------------------------------------+

| CONCAT(Pas de pilote de brevet p_brevet) |

+-----------------------------------------------+

| Pas de pilote de brevet PL-0 |

+-----------------------------------------------+

+-----------------------------------------------------------------+

| CONCAT(Pas de pilote ayant ce nombre dheures de vol p_heures) |

+-----------------------------------------------------------------+

| Pas de pilote ayant ce nombre dheures de vol 500 |

+-----------------------------------------------------------------+

Il resterait agrave programmer lrsquoexception ERROR 1172 (Result consisted of morethan one row) pour geacuterer au niveau de la seconde requecircte lrsquoextraction de plusieurs pilotes

Tableau 7-15 Exceptions NOT FOUND toutes traiteacutees

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException3 (IN p_brevet VARCHAR(6)IN p_heures DECIMAL(72))BEGIN DECLARE v_nom VARCHAR(20) DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 SELECT nom INTO v_nom FROM bdsoutouPilote WHERE brevet = p_brevet IF flagNOTFOUND THEN SELECT CONCAT(Pas de pilote de brevet p_brevet) SET flagNOTFOUND = 0 ELSE SELECT CONCAT(Le pilote de code p_brevet est v_nom) END IF

Gestion de lrsquoexception de la premiegravere requecircte

SELECT nm INTO v_nom FROM bdsoutouPilote WHERE nbHVol = p_heures IF flagNOTFOUND THEN SELECT CONCAT(Pas de pilote ayant ce nombre d heures de vol p_heures) ELSE SELECT CONCAT(Le pilote ayant p_heures heures de vol est v_nom) END IFEND

Gestion de lrsquoexception de la deuxiegraveme requecircte

Web

DECLARE CONTINUE HANDLER FOR NOT FOUNDSET flagNOTFOUND = 1

4055_07_C07 Page 259 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

260 copy Eacuteditions Eyrolles

ayant un mecircme nombre drsquoheures de vol Deux solutions srsquooffrent agrave vous dans un sous-blocavec EXIT ou dans le mecircme bloc avec un CONTINUE et une variable pour tester lrsquoeacuteventuelleredirection

Afin de deacuteclarer drsquoautres exceptions il faut consulter la liste des erreurs dans la documentationofficielle (Appendix B Error Codes and Messages) de maniegravere agrave connaicirctre le numeacutero drsquoerreurMySQL (paramegravetre code_erreur_mysql dans la syntaxe DECLARE HANDLER)

Vous pouvez aussi eacutecrire un bloc qui programme volontairement lrsquoerreur pour voir sous lrsquointer-face de commande le numeacutero que MySQL renvoie

Exceptions nommeacutees

Pour intercepter une erreur MySQL et lui attribuer au passage un identificateur il faut utiliserla clause DECLARE CONDITION La syntaxe est la suivante

Deacuteclaration

DECLARE nomException CONDITION FOR

SQLSTATE [VALUE] lsquovaleur_sqlstatersquo | code_erreur_mysql

Il est ainsi possible de regrouper plusieurs types drsquoerreurs (avec SQLSTATE ou cibler une erreuren particulier en indiquant le code erreur de MySQL) Une fois lrsquoexception nommeacutee il est possi-ble de lrsquoutiliser dans la deacuteclaration de lrsquoeacuteveacutenement associeacute via la directive DECLARE HANDLER

Deacuteclenchement

Consideacuterons les deux tables suivantes La colonne comp de la table Pilote est une cleacute eacutetran-gegravere vers la table Compagnie Programmons une proceacutedure qui supprime une compagnie decode passeacute en paramegravetre

Le tableau suivant deacutecrit la proceacutedure procExceptionNommee qui intercepte une erreurreacutefeacuterentielle (SQLSTATE agrave 23 000) Il srsquoagit de controcircler le programme si la compagnie agravedeacutetruire est encore rattacheacutee agrave un enregistrement reacutefeacuterenceacute dans la table Pilote

Figure 7-5 Deux tables

Compagnie

comp ville nomComp

AF Paris Air FranceSING Singapour Singapore AL

CAST Blagnac Castanet AL EJET Dublin Easy Jet

Pilote

brevet nom nbHVol comp

PL-1 Gilles Laborde 2450 AF PL-2 Freacutedeacuteric DAlmeyda 900 AF PL-3 Florence Peacuterissel 1000 SING PL-4 Thierry Millan 2450 CAST PL-5 Christine Royo 200 AF PL-6 Aureacutelia Ente 2450 SINGagrave deacutetruire

4055_07_C07 Page 260 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 261

chapitre ndeg 7 Programmation avanceacutee

Les traces de lrsquoexeacutecution de cette proceacutedure sont les suivantes Notez que si on appelle cetteproceacutedure en passant en paramegravetre une compagnie inexistante le sous-programme se terminenormalement sans passer dans la section drsquoerreur

CALL bdsoutouprocExceptionNommee(AF)$

+-----------------------------------------------------+

| Resultat procExceptionNommee |

+-----------------------------------------------------+

| Deacutesoleacute il reste encore un pilote agrave la compagnie AF |

+-----------------------------------------------------+

CALL bdsoutouprocExceptionNommee(EJET)$

+------------------------------+

| Resultat procExceptionNommee |

+------------------------------+

| Compagnie EJET deacutetruite |

+------------------------------+

Tableau 7-16 Programmation drsquoune exception nommeacutee

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocExceptionNommee (IN p_comp VARCHAR(4))BEGIN DECLARE flagerr BOOLEAN DEFAULT 0

Deacuteclaration de lrsquoexception nommeacutee

Corps du traitement (valida-tion)

BEGIN DECLARE EXIT HANDLER FOR SET flagerr =1 SET AUTOCOMMIT=0 DELETE FROM Compagnie WHERE comp = p_comp SELECT CONCAT(Compagnie p_comp deacutetruite) AS Resultat procExceptionNommee END IF flagerr THEN ROLLBACK SELECT CONCAT(Deacutesoleacute il reste encore un pilote agrave la compagnie p_comp) AS Resultat procExceptionNommee ELSE COMMIT END IFEND

Gestion de lrsquoexception

Web

DECLARE erreur_ilResteUnPilote CONDITIONFOR SQLSTATE 23000

erreur_ilResteUnPilote

4055_07_C07 Page 261 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

262 copy Eacuteditions Eyrolles

Deacuteclencheurs

Concernant MySQL les deacuteclencheurs nrsquoexistent que depuis la version 5 Comme nous leverrons ils sont limitatifs en termes de fonctionnaliteacutes et relativement instables (P Gulutzancitait en parlant de la version becircta dans son livre blanc toujours preacutesent (au moment de lrsquoimpres-sion de ce livre) en page drsquoaccueil du site de MySQL MySQL 50 Triggers laquo Triggers are verynew There are bugs hellip Do not try triggers with a database that has important data in ithellip raquo)

Bien que beaucoup drsquoameacuteliorations aient eacuteteacute apporteacutees les deacuteclencheurs qui modifient lestables ne sont pas encore agrave mon sens tout agrave fait fiables Prudence donc avec vos donneacuteesToutes les limitations que nous allons deacutetailler seront sans doute reacutesolues au fur et agrave mesuredes prochaines versions majeures du serveur Songez qursquoavant la version 5010 lesdeacuteclencheurs ne pouvaient mecircme pas acceacuteder agrave la base

Geacuteneacuteraliteacutes

Drsquoun point de vue geacuteneacuteral et sans parler de MySQL la plupart des deacuteclencheurs (triggers)peuvent ecirctre vus comme des sous-programmes reacutesidents associeacutes agrave un eacuteveacutenement particulier(insertion modification drsquoune ou de plusieurs colonnes suppression) sur une table (ou unevue) Une table (ou vue) peut laquo heacuteberger raquo plusieurs deacuteclencheurs ou aucun Pour certainsSGBD il existe drsquoautres types de deacuteclencheurs que ceux associeacutes agrave une table (ou vue) afin dereacutepondre agrave des eacuteveacutenements qui ne concernent pas les donneacutees (exemple connexion drsquounutilisateur particulier suppression drsquoune table deacutemarrage ou arrecirct du serveur deacuteconnexiondrsquoun utilisateur etc)

Agrave la diffeacuterence des sous-programmes lrsquoexeacutecution drsquoun deacuteclencheur nrsquoest pas explicite (parCALL par exemple) crsquoest lrsquoeacuteveacutenement de mise agrave jour de la table qui lance automatiquement lecode programmeacute dans le deacuteclencheur On dit que le deacuteclencheur laquo se deacuteclenche raquo (lrsquoanglais letraduit mieux fired trigger)

Agrave quoi sert un deacuteclencheur

En theacuteorie un deacuteclencheur permet de

Programmer toutes les regravegles de gestion qui nrsquoont pas pu ecirctre mises en place par descontraintes au niveau des tables Par exemple la condition une compagnie ne fait volerun pilote que srsquoil a totaliseacute plus de 60 heures de vol dans les 2 derniers mois sur le typedrsquoappareil du vol en question ne pourra pas ecirctre programmeacutee par une contrainte et neacuteces-sitera lrsquoutilisation drsquoun deacuteclencheur

Deacuteporter des contraintes au niveau du serveur et alleacuteger ainsi la programmation client Renforcer des aspects de seacutecuriteacute et drsquoaudit Programmer lrsquointeacutegriteacute reacutefeacuterentielle et la reacuteplication dans des architectures distribueacutees

avec lrsquoutilisation de liens de bases de donneacutees

4055_07_C07 Page 262 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 263

chapitre ndeg 7 Programmation avanceacutee

En theacuteorie les eacuteveacutenements deacuteclencheurs peuvent ecirctre

une instruction INSERT UPDATE ou DELETE sur une table (ou vue) On parle de deacuteclen-cheurs LMD

une instruction CREATE ALTER ou DROP sur un objet (table vue index etc) On parlede deacuteclencheurs LDD

le deacutemarrage ou lrsquoarrecirct de la base (startup ou shutdown) une erreur speacutecifique (not foundduplicate key etc) une connexion ou une deacuteconnexion drsquoun utilisateur On parle dedeacuteclencheurs drsquoinstances

En pratique dans MySQL seuls les eacuteveacutenements de la premiegravere cateacutegorie sont pris en compte

Meacutecanisme geacuteneacuteral

Auparavant consideacutereacutes au niveau table les deacuteclencheurs sont deacutesormais attacheacutes agrave plus justetitre au niveau database En conseacutequence le nom drsquoun deacuteclencheur doit ecirctre unique pourchaque base de donneacutees En revanche diffeacuterentes bases peuvent heacuteberger un deacuteclencheur demecircme nom

La figure suivante illustre les quatre eacutetapes agrave suivre pour mettre complegravetement en œuvre undeacuteclencheur (de la creacuteation agrave son test) Il faut drsquoabord le coder (comme un sous-programme)puis le compiler (il est pour lrsquoinstant stockeacute indeacutependamment de la table mais il devrait y ecirctreinclus dans les prochaines versions) Par la suite au cours du temps chaque eacuteveacutenement (quicaracteacuterise le deacuteclencheur) aura pour conseacutequence son exeacutecution

Syntaxe

Pour pouvoir creacuteer un deacuteclencheur vous devez disposer du privilegravege SUPER (le privilegravegeCREATE TRIGGER est agrave venir) Un deacuteclencheur est composeacute de deux parties la descriptionde lrsquoeacuteveacutenement traqueacute et celle de lrsquoaction agrave reacutealiser lorsque lrsquoeacuteveacutenement se produit La syntaxede creacuteation drsquoun deacuteclencheur est la suivante

Figure 7-6 Meacutecanisme des deacuteclencheurs

1 Eacutecriture

CREATE TRIGGER trig1 BEFORE | AFTER nature de lrsquoeacuteveacutenement e1

ON Tab1Bloc drsquoinstructions

2

Compilation

3 Eacuteveacutenement e1sur Tab1

4 Actions codeacutees dans trig1

Tab1trig1

4055_07_C07 Page 263 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

264 copy Eacuteditions Eyrolles

CREATE TRIGGER nomDeacuteclencheur

BEFORE | AFTER DELETE | INSERT | UPDATE

ON nomTable

FOR EACH ROW

instruction |

[etiquette] BEGIN

instructions

END [etiquette]

Les options de cette commande sont les suivantes

BEFORE | AFTER preacutecise la chronologie entre lrsquoaction agrave reacutealiser par le deacuteclencheur LMD etla reacutealisation de lrsquoeacuteveacutenement (BEFORE INSERT exeacutecutera le deacuteclencheur avant de reacutealiserlrsquoinsertion)

DELETE | INSERT | UPDATE preacutecise la nature de lrsquoeacuteveacutenement pour les deacuteclencheurs LMD

ndash Pour DELETE le deacuteclencheur examine les eacuteveacutenements DELETE et REPLACE

ndash Pour INSERT le deacuteclencheur prend en compte les eacuteveacutenements suivants INSERTCREATE SELECT LOAD DATA et REPLACE

ndash Pour UPDATE le deacuteclencheur considegravere seulement lrsquoeacuteveacutenement UPDATE

ON nomTable speacutecifie la table associeacutee au deacuteclencheur LMD

FOR EACH ROW diffeacuterencie les deacuteclencheurs LMD au niveau ligne (le niveau eacutetat nrsquoestpas encorepris en charge)

instruction ou instructions compose le corps du code du deacuteclencheur

Il nrsquoest pas possible de deacutefinir deux deacuteclencheurs distincts sur le mecircme eacuteveacutenement drsquoune tabledonneacutee En revanche il est possible drsquoavoir deux deacuteclencheurs distincts sur la mecircme actiondans une table donneacutee (un deacuteclencheur pour BEFORE UPDATE et un autre pour AFTER UPDATEpar exemple)

Attention agrave ne pas creacuteer de deacuteclencheurs recursifs (exemple drsquoun deacuteclencheur qui exeacutecute uneinstruction lanccedilant elle-mecircme le deacuteclencheur ou deux deacuteclencheurs srsquoappelant en cascadejusqursquoagrave lrsquooccupation de toute la meacutemoire reacuteserveacutee)

Eacutetudions agrave preacutesent plus preacuteciseacutement les caracteacuteristiques du seul type de deacuteclencheur qursquoil estactuellement possible de programmer

Deacuteclencheurs LMD (de lignes)

Pour ce type de deacuteclencheur lrsquoeacuteveacutenement agrave deacuteterminer est une mise agrave jour particuliegravere de labase (ajout modification ou suppression dans une table ou une vue)

4055_07_C07 Page 264 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 265

chapitre ndeg 7 Programmation avanceacutee

Lrsquoexeacutecution est pour lrsquoheure deacutependante du nombre de lignes toucheacutees par lrsquoeacuteveacutenementSeuls les deacuteclencheurs de lignes (row trigger) sont permis car la directive FOR EACH ROWest obligatoire Ils sont pratiques quand on deacutesire utiliser autant de fois le deacuteclencheur qursquoil ya de lignes concerneacutees par une mise agrave jour

Si on deacutesirait exeacutecuter une seule fois le deacuteclencheur quel que soit le nombre de lignesconcerneacutees il faudrait employer un deacuteclencheur drsquoeacutetat (statement trigger) qui nrsquoest pas encorereconnu Pour ce faire il faudrait ne pas indiquer la directive FOR EACH ROW ou preacuteciser FOREACH STATEMENT agrave la place (agrave confirmer avec une prochaine version incluant cetteextension)

Dans lrsquoexemple drsquoune table t1 ayant cinq enregistrements si on programme un deacuteclencheur deniveau ligne avec lrsquoeacuteveacutenement AFTER DELETE et qursquoon lance DELETE FROM t1 ledeacuteclencheur effectuera cinq fois ses instructions (une fois apregraves chaque suppression) Letableau suivant explique ce meacutecanisme

Seuls les deacuteclencheurs de lignes peuvent acceacuteder aux anciennes et aux nouvelles valeurs descolonnes de la ligne affecteacutee par la mise agrave jour preacutevue par lrsquoeacuteveacutenement Les identificateurs OLDet NEW sont programmeacutes pour cela Ce sont des extensions de MySQL agrave la norme SQL(MySQL suit ainsi Oracle dans ce domaine qui propose OLD et NEW)

Un deacuteclencheur de type AFTER ne se lance sur une table t que si le deacuteclencheur de typeBEFORE de la table t (srsquoil existe) et que lrsquoinstruction associeacutee agrave lrsquoeacuteveacutenement se sont correcte-ment deacuterouleacutes

Quand utiliser la directive OLD

Chaque enregistrement qui tente drsquoecirctre supprimeacute drsquoune table qui inclut un deacuteclencheur detype DELETE FOR EACH ROW est deacutesigneacute par OLD au niveau du code du deacuteclencheurLrsquoaccegraves aux colonnes de ce pseudo-enregistrement dans le corps du deacuteclencheur se fait par lanotation pointeacutee

Consideacuterons lrsquoexemple suivant et programmons la regravegle de gestion tout pilote qui perd unequalification doit voir son compteur automatiquement deacutecreacutementer Programmons le deacuteclen-cheur TrigDelQualif qui surveille les suppressions de la table Qualifications et dimi-nue de un la colonne nbQualif pour le pilote concerneacute par la suppression de sa qualification

Tableau 7-17 Exeacutecution drsquoun deacuteclencheur LMD

Nature delrsquoeacuteveacutenement

Eacutetat (statement trigger)sans FOR EACH ROW

Ligne (row trigger)avec FOR EACH ROW

BEFORE Exeacutecution une fois avant la mise agrave jour Exeacutecution avant chaque ligne mise agrave jour

AFTER Exeacutecution une fois apregraves la mise agrave jour Exeacutecution apregraves chaque ligne mise agrave jour

4055_07_C07 Page 265 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

266 copy Eacuteditions Eyrolles

Lrsquoeacuteveacutenement deacuteclencheur est ici AFTER DELETE car il faudra srsquoassurer que la suppressionnrsquoest pas entraveacutee par drsquoeacuteventuelles contraintes reacutefeacuterentielles On utilise un deacuteclencheur FOREACH ROW car srsquoil se produit une suppression de toute la table (DELETE FROM Qualifi-cations) on exeacutecutera autant de fois le deacuteclencheur qursquoil y a de lignes deacutetruites

Chaque enregistrement qui va ecirctre supprimeacute de la table Qualifications est deacutesigneacute parOLD au niveau du code du deacuteclencheur Lrsquoaccegraves aux colonnes de ce pseudo-enregistrementdans le corps du deacuteclencheur se fait par la notation pointeacutee

Le code minimal de ce deacuteclencheur (on ne prend pas en compte le fait qursquoil nrsquoexiste pas depilote de ce code brevet) est deacutecrit dans le tableau suivant

En consideacuterant les donneacutees initiales des tables le test de ce deacuteclencheur sous lrsquointerface decommande est le suivant Par ailleurs la table Qualifications ne contient plus que troisenregistrements

Figure 7-7 Principe du deacuteclencheur TrigDelQualif

BREVET TYPA EXPIRE

------ ---- --------

PL - 1 A340 220605

PL - 1 A330 050205

PL - 1 A320 160104

PL - 2 A320 180104

PL - 3 A330 220106

TypeAvion

TYPA NOMTYPE

--- - --------------------------

A320 Bireacuteacteur Airbus 320

A330 Bireacuteacteur Airbus 330

A340 Quadrireacuteacteur Airbus 340

Pilote

BREVET NOM NBHVOL COMP NBQUALIF------ -------------------- ---------- ---- ----------

DeacuteclencheurTrigDelQualif

1

2

- 13

OLD

DELETE

PL-1 P Caboche 450 AF 3

PL-2 G Lebur 3400 AF 1

PL-3 X Leclercq 900 SING 1

Qualifications

A380 Big-Quadrireacuteacteur 380

Tableau 7-18 Deacuteclencheur apregraves suppression

Code MySQL Commentaires

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

BEGIN UPDATE Pilote SET nbQualif = nbQualif - 1 WHERE brevet = END

Corps du deacuteclencheurMise agrave jour du pilote concerneacute par la suppression

WebCREATE TRIGGER TriDelQualifAFTER DELETE ON QualificationsFOR EACH ROW

OLDbrevet

4055_07_C07 Page 266 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 267

chapitre ndeg 7 Programmation avanceacutee

Quand utiliser la directive NEW

Chaque enregistrement qui tente drsquoecirctre ajouteacute dans la table Qualifications est deacutesigneacutepar NEW au niveau du code du deacuteclencheur Lrsquoaccegraves aux colonnes de ce pseudo-enregistre-ment dans le corps du deacuteclencheur se fait par la notation pointeacutee

Consideacuterons le mecircme exemple et eacutecrivons la regravegle de gestion tout pilote qui gagne une quali-fication doit voir son compteur automatiquement increacutementer Programmons le deacuteclencheurTrigInsQualif qui surveille les insertions sur la table Qualifications et augmente deun la colonne nbQualif pour le pilote concerneacute

Lrsquoeacuteveacutenement deacuteclencheur est ici AFTER INSERT car il faudra srsquoassurer avant de fairelrsquoinsertion que le code du pilote et celui de lrsquoavion sont corrects (existant dans les tableslaquo pegravere raquo) On utilise un deacuteclencheur FOR EACH ROW car on deacutesire qursquoil srsquoexeacutecute autant defois qursquoil y a de lignes concerneacutees par lrsquoeacuteveacutenement deacuteclencheur

Le code minimal de ce deacuteclencheur (on ne prend en compte aucune erreur potentielle) estdeacutecrit dans le tableau suivant

Tableau 7-19 Test du deacuteclencheur AFTER DELETE

Eacuteveacutenement deacuteclencheur Reacutesultat

DELETE FROM Qualifications WHERE typa = A320

SELECT FROM Pilote+--------+-------------+---------+-------+----------+| brevet | nom | nbHVol | compa | nbQualif |+--------+-------------+---------+-------+----------+| PL-1 | P Caboche | 45000 | AF | || PL-2 | G Lebur | 340000 | AF | || PL-3 | X Leclercq | 90000 | SING | 1 |+--------+-------------+---------+-------+----------+

Figure 7-8 Principe du deacuteclencheur TrigInsQualif

20

Qualifications BREVET TYPA EXPIRE------ ---- --------PL-1 A340 220605PL-1 A330 050205PL-1 A320 160104PL-2 A320 180104PL-3 A330 220106

TypeAvionTYPA NOMTYPE---- --------------------------A320 Bireacuteacteur Airbus 320A330 Bireacuteacteur Airbus 330A340 Quadrireacuteacteur Airbus 340A380 Big -Quadrireacuteacteur 380

PiloteBREVET NOM NBHVOL COMP NBQUALIF------ -------------------- ---------- ---- ----------PL-1 P Caboche 450 AF 3PL-2 G Lebur 3400 AF 1PL-3 X Leclercq 900 SING 1

Deacuteclencheur

TrigInsQualif

PL-2 A380 200606

INSERT1

2

+13

NEW

4055_07_C07 Page 267 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

268 copy Eacuteditions Eyrolles

En consideacuterant les donneacutees initiales des tables le test de ce deacuteclencheur (reacutealiseacute le20 deacutecembre 2005) sous lrsquointerface de commande est le suivant

Quand utiliser agrave la fois les directives NEW et OLD

Seuls les deacuteclencheurs de type UPDATE FOR EACH ROW permettent de manipuler agrave la fois lesdirectives NEW et OLD En effet la mise agrave jour drsquoune ligne dans une table fait intervenir unenouvelle donneacutee qui en remplace une ancienne Lrsquoaccegraves aux anciennes valeurs se fera par lanotation pointeacutee du pseudo-enregistrement OLD Lrsquoaccegraves aux nouvelles valeurs se fera par NEW

La figure suivante illustre ce meacutecanisme dans le cas de la modification de la colonne brevet dudernier enregistrement de la table Qualifications Le deacuteclencheur doit programmer deuxmises agrave jour dans la table Pilote

Tableau 7-20 Deacuteclencheur apregraves insertion

Deacuteclencheur Commentaires

BEGIN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = END

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheurMise agrave jour du pilote concerneacute par la qualification

CREATE TRIGGER TrigInsQualifAFTER INSERT ON QualificationsFOR EACH ROW

NEWbrevet

Tableau 7-21 Test du deacuteclencheur AFTER INSERT

Eacuteveacutenement deacuteclencheur Reacutesultat

INSERT INTO Qualifications VALUES(PL-2 A380 SYSDATE())

SELECT FROM Qualifications $+--------+------+------------+| brevet | typa | expire |+--------+------+------------+| PL-1 | A340 | 2005-06-22 || PL-1 | A330 | 2005-02-05 || PL-1 | A320 | 2004-01-16 || PL-2 | A320 | 2004-01-18 || PL-3 | A330 | 2006-01-22 || |+--------+------+------------+SELECT FROM Pilote$+--------+-------------+---------+-------+----------+| brevet | nom | nbHVol | compa | nbQualif |+--------+-------------+---------+-------+----------+| PL-1 | P Caboche | 45000 | AF | 3 || PL-2 | G Lebur | 340000 | AF | 2 || PL-3 | X Leclercq | 90000 | SING | 1 |+--------+-------------+---------+-------+----------+

Web

PL-2 | A380 | 2005-12-20

4055_07_C07 Page 268 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 269

chapitre ndeg 7 Programmation avanceacutee

Lrsquoeacuteveacutenement deacuteclencheur est ici AFTER UPDATE car il faudra srsquoassurer que la suppressionnrsquoest pas entraveacutee par drsquoeacuteventuelles contraintes reacutefeacuterentielles Le code minimal de ce deacuteclen-cheur est deacutecrit dans le tableau suivant

En consideacuterant les donneacutees preacutesenteacutees agrave la figure preacuteceacutedente le test de ce deacuteclencheur est lesuivant

Figure 7-9 Principe du deacuteclencheur TrigUpdQualif

Qualifications BREVET TYPA EXPIRE------ ---- --------PL-1 A340 220605PL-1 A330 050205PL-1 A320 160104PL-2 A320 180104PL-3 A330 220106

PiloteBREVET NOM NBHVOL COMP NBQUALIF------ -------------------- ---------- ---- ----------PL-1 P Caboche 450 AF 3PL-2 G Lebur 3400 AF 1PL-3 X Leclercq 900 SING 1

DeacuteclencheurTrigUpdQualif

PL-2

UPDATE

1

2

+13

NEW

OLD

-1

Tableau 7-22 Deacuteclencheur apregraves modification

Deacuteclencheur Commentaires

BEGIN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = UPDATE Pilote SET nbQualif = nbQualif - 1 WHERE brevet = END

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheur

Mise agrave jour des pilotes concerneacutes par la modification de la qualification

WebCREATE TRIGGER TrigUpdQualifAFTER UPDATE ON QualificationsFOR EACH ROW

NEWbrevet

OLDbrevet

4055_07_C07 Page 269 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

270 copy Eacuteditions Eyrolles

Bilan de NEW et OLD

Le tableau suivant reacutesume les valeurs contenues dans les pseudo-enregistrements OLD et NEWpour les deacuteclencheurs FOR EACH ROW Retenez que seuls les deacuteclencheurs UPDATE peuventmanipuler agrave bon escient les deux types de directives

MySQL preacutevient clairement agrave la compilation que vous utilisez une variable OLD dans undeacuteclencheur INSERT ndash ou NEW dans un deacuteclencheur DELETE ndash par deux messages de mecircmecode mais de libelleacutes diffeacuterents suivant les cas

ERROR 1363 (HY000) There is no NEW row in on DELETE trigger

ERROR 1363 (HY000) There is no OLD row in on INSERT trigger

Une colonne preacutefixeacutee de OLD est en lecture seule dans le corps drsquoun deacuteclencheur

Une colonne preacutefixeacutee de NEW ne peut ecirctre accessible qursquoagrave lrsquoaide du privilegravege SELECT associeacute

Tableau 7-23 Test du deacuteclencheur AFTER UPDATE

Eacuteveacutenement deacuteclencheur Reacutesultat

UPDATE Qualifications SET brevet = PL-2 WHERE brevet = PL-3 AND typa = A330$

SELECT FROM Pilote$+--------+-------------+---------+-------+----------+| brevet | nom | nbHVol | compa | nbQualif |+--------+-------------+---------+-------+----------+| PL-1 | P Caboche | 45000 | AF | || PL-2 | G Lebur | 340000 | AF | || PL-3 | X Leclercq | 90000 | SING | 0 |+--------+-------------+---------+-------+----------+

SELECT FROM Qualifications$+--------+------+------------+| brevet | typa | expire |+--------+------+------------+| PL-1 | A340 | 2005-06-22 || PL-1 | A330 | 2005-02-05 || PL-1 | A320 | 2004-01-16 || PL-2 | A320 | 2004-01-18 || | A330 | 2006-01-22 |+--------+------+------------+

32

PL-2

Tableau 7-24 Valeurs de OLD et NEW

Nature de lrsquoeacuteveacutenement OLDcolonne NEWcolonne

INSERT Impossible Nouvelle valeur

UPDATE Ancienne valeur Nouvelle valeur

DELETE Ancienne valeur Impossible

4055_07_C07 Page 270 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 271

chapitre ndeg 7 Programmation avanceacutee

Appel de sous-programmes

Un deacuteclencheur peut appeler directement par CALL (ou dans son corps) un sous-programmeMySQL

bull Un deacuteclencheur ne peut pas lancer une proceacutedure catalogueacutee retournant des donneacutees auclient (traces avec SELECT) ou utilisant du SQL dynamique (eacutetudieacute plus loin) En revanche lesproceacutedures employeacutees peuvent renvoyer des reacutesultats via leurs paramegravetres de sortie (OUT)

bull Les proceacutedures appeleacutees ne peuvent constituer aucune transaction (oubliez donc de pou-voir faire START TRANSACTION COMMIT et ROLLBACK)

Le tableau suivant deacutecrit lrsquoutilisation drsquoun sous-programme (procTrigg) dans un deacuteclen-cheur (espionAjoutPilote) qui srsquoexeacutecutera avant chaque ajout drsquoun nouveau pilote Lesous-programme ajoute simplement une ligne dans la table Trace

CREATE PROCEDURE bdsoutouprocTrigg(IN param DATETIME)

BEGIN

INSERT INTO Trace VALUES

(CONCAT(Insertion pilote appel de bdsoutouprocTrigg le param))

END

La trace drsquoexeacutecution en consideacuterant les donneacutees initiales des tables est la suivante

mysqlgt (INSERT INTO Pilote VALUES (PL-4 C Soutou 100 AF0)$

Query OK 1 row affected (004 sec)

mysqlgt SELECT FROM Pilote$

+--------+-------------+---------+-------+----------+

| brevet | nom | nbHVol | compa | nbQualif |

+--------+-------------+---------+-------+----------+

| PL-1 | P Caboche | 45000 | AF | 3 |

| PL-2 | G Lebur | 340000 | AF | 1 |

| PL-3 | X Leclercq | 90000 | SING | 1 |

| |

+--------+-------------+---------+-------+----------+

Tableau 7-25 Appel drsquoun sous-programme dans un deacuteclencheur

Deacuteclencheur Commentaire

CREATE TRIGGER bdsoutouespionAjoutPilote BEFORE INSERT ON Pilote FOR EACH ROWBEGIN END

Appel dans le corps du deacuteclencheur drsquoune proceacutedure MySQL en passant un paramegravetre drsquoentreacutee

Web

CALL bdsoutouprocTrigg(SYSDATE())

PL-4 | C Soutou | 10000 | AF | 0

4055_07_C07 Page 271 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

272 copy Eacuteditions Eyrolles

mysqlgt SELECT FROM Trace$

+-----------------------------------------------------------------+

| col |

+-----------------------------------------------------------------+

| |

+-----------------------------------------------------------------+

Dictionnaire des donneacutees

Eacutetudieacutee au chapitre 5 la base INFORMATION_SCHEMA inclut la vue TRIGGERS qui renseigneles caracteacuteristiques des deacuteclencheurs qui eacutetaient auparavant consideacutereacutes au niveau table Ilssont deacutesormais reconnus agrave juste titre au niveau database Il faut deacutetenir le privilegravege SUPERpour acceacuteder agrave cette vue

La requecircte suivante interroge cette vue et permet de retrouver les noms et les caracteacuteristiquesrelatives aux eacuteveacutenements deacuteclencheurs des trois triggers de la base de donneacutees bdsoutou

SELECT TRIGGER_NAMEEVENT_OBJECT_TABLE Table

EVENT_MANIPULATION Evenement ACTION_TIMING

EVENT_OBJECT_SCHEMA Base

FROM INFORMATION_SCHEMATRIGGERS

WHERE TRIGGER_SCHEMA=bdsoutou

+---------------+----------------+-----------+---------------+----------+

| TRIGGER_NAME | Table | Evenement | ACTION_TIMING | Base |

+---------------+----------------+-----------+---------------+----------+

| TrigInsQualif | Qualifications | INSERT | AFTER | bdsoutou |

| TrigUpdQualif | Qualifications | UPDATE | AFTER | bdsoutou |

| TriDelQualif | Qualifications | DELETE | AFTER | bdsoutou |

+---------------+----------------+-----------+---------------+----------+

Notez que MySQL utilise

la colonne TRIGGER_NAME pour deacutesigner le nom du deacuteclencheur drsquoune database

la colonne TRIGGER_SCHEMA pour deacutesigner le nom de la base de donneacutees agrave laquelle ilappartient

les colonnes EVENT_OBJECT_TABLE et EVENT_OBJECT_SCHEMA pour deacutesignerrespectivement le nom de la table qui accueille ce deacuteclencheur ainsi que la base de donneacuteesqui la contient (elle peut ecirctre diffeacuterente de celle du deacuteclencheur ici nous raisonnons sur lamecircme)

la colonne EVENT_MANIPULATION pour deacutesigner lrsquoeacuteveacutenement deacuteclencheur

la colonne ACTION_TIMING pour preacuteciser la chronologie de lrsquoeacuteveacutenement deacuteclencheur

La requecircte suivante interroge cette mecircme vue pour extraire le code du deacuteclencheur de typeafter update heacutebergeacute par la table Qualifications dans la base de donneacutees bdsoutou

Insertion pilote appel de bdsoutouprocTrigg le 2005-12-20 082720

4055_07_C07 Page 272 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 273

chapitre ndeg 7 Programmation avanceacutee

SELECT ACTION_STATEMENT FROM INFORMATION_SCHEMATRIGGERS WHERE TRIGGER_SCHEMA=bdsoutou AND EVENT_OBJECT_TABLE=Qualifications AND EVENT_MANIPULATION=UPDATE AND ACTION_TIMING=AFTER+-----------------------------------------------------------------------------+| ACTION_STATEMENT |+-----------------------------------------------------------------------------+|BEGIN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = NEWbrevet UPDATE Pilote SET nbQualif = nbQualif - 1 WHERE brevet = OLDbrevet END |+-----------------------------------------------------------------------------+

Remarquons que MySQL utilise la colonne ACTION_STATEMENT pour contenir le corps dudeacuteclencheur (visible aussi par SHOW TRIGGERS)

La colonne ACTION_ORIENTATION est pour lrsquoinstant toujours eacutevalueacutee agrave ROW (deacuteclencheurdrsquoeacutetat pas encore opeacuterationnel)

Les colonnes ACTION_REFERENCE_OLD_ROW et ACTION_REFERENCE_NEW_ROW contiennentpour lrsquoinstant toujours respectivement OLD et NEW (il nrsquoest pas encore possible de renommerces identificateurs)

Dans le but drsquoecirctre davantage en phase avec la norme dans les prochaines versions les colon-nes suivantes contiennent pour lrsquoheure toujours la valeur NULL TRIGGER_CATALOG EVENT_OBJECT_CATALOG ACTION_CONDITION ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE et CREATED Les deux premiegraveres colonnes sont relatives agrave la notionde catalogue la suivante a la possibiliteacute de conditionner un deacuteclencheur (clause WHEN drsquoOra-cle) la derniegravere contiendrait le moment de creacuteation du deacuteclencheur

Programmation drsquoune contrainte de veacuterification

Nous avons vu que les contraintes de veacuterification (CHECK) ne sont pas encore prises encharge Nous avons eacutetudieacute au chapitre 5 la possibiliteacute drsquoen programmer agrave lrsquoaide de vues Icinous allons creacuteer un deacuteclencheur srsquoen chargeant Attention il nrsquoest pas toujours possibledrsquoutiliser un deacuteclencheur pour valider une contrainte de veacuterification

Consideacuterons lrsquoexemple du chapitre 5 (Figure 5-10 Vue simulant la contrainte CHECK) quideacutecrit la table Pilote et la contrainte veacuterifiant qursquoun pilote

ne peut ecirctre commandant de bord qursquoagrave la condition qursquoil ait entre 1 000 et 4 000 heures devol

ne peut ecirctre copilote qursquoagrave la condition qursquoil ait entre 100 et 1 000 heures de vol

ne peut ecirctre instructeur qursquoagrave partir de 3 000 heures de vol

Le tableau suivant deacutecrit le code du deacuteclencheur Ici on choisit de forcer la valeur de lacolonne grade pour conserver la coheacuterence avec les conditions initiales

4055_07_C07 Page 273 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

274 copy Eacuteditions Eyrolles

Si aucune condition nrsquoest veacuterifieacutee lrsquoajout se reacutealise sans aucun changement Le test de cedeacuteclencheur est le suivant On remarque que les quatre premiers INSERT sont inchangeacutes alorsque les deux derniers sont modifieacutes (mais pas annuleacutes )

Tableau 7-26 Deacuteclencheur simulant un CHECK

Deacuteclencheur Commentaires

BEGIN IF ( = CDB AND ( lt1000)) THEN SET = COPI END IF IF (NEWgrade = CDB AND ( gt4000)) THEN SET = INST END IF IF (NEWgrade = COPI AND ( gt1000)) THEN SET = CDB END IF IF ( = INST AND ( lt3000)) OR ( lt100) THEN SET = NULL END IFEND

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheur

Test des conditions et mise agrave jour eacuteventuelle de la nouvelle valeur agrave inseacuterer au niveau de la colonne grade

WebCREATE TRIGGER TrigInsGradeBEFORE INSERT ON Pilote FOR EACH ROW

NEWgrade NEWnbHVolNEWgrade

NEWnbHVolNEWgrade

NEWnbHVolNEWgrade

NEWgrade NEWnbHVolNEWnbHVol

NEWgrade

Tableau 7-27 Test du deacuteclencheur BEFORE INSERT

Insertions valides Insertions non valides

INSERT INTO Pilote VALUES (PL-1Daniel Vielle1000CDB)INSERT INTO Pilote VALUES (PL-2Benoit Treihlou450COPI)INSERT INTO Pilote VALUES (PL-3Pierre Filoux9000INST)INSERT INTO Pilote VALUES (PL-4Philippe Minier1000COPI)

INSERT INTO Pilote VALUES (PL-5Trop jeune )

INSERT INTO Pilote VALUES (PL-6Inexperimente )

SELECT FROM Pilote+--------+-----------------+---------+-------+| brevet | nom | nbHVol | grade |+--------+-----------------+---------+-------+| PL-1 | Daniel Vielle | 100000 | CDB || PL-2 | Benoit Treihlou | 45000 | COPI || PL-3 | Pierre Filoux | 900000 | INST || PL-4 | Philippe Minier | 100000 | COPI || PL-5 | Trop jeune | || PL-6 | Inexperimente | |+--------+-----------------+---------+-------+

100CDB

2999INST

10000 | COPI299900 | NULL

4055_07_C07 Page 274 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 275

chapitre ndeg 7 Programmation avanceacutee

Invalidation dans le deacuteclencheur

Une fonctionnaliteacute importante des deacuteclencheurs consiste agrave pouvoir invalider lrsquoeacuteveacutenement quia deacuteclencheacute lrsquoaction En drsquoautres termes crsquoest pouvoir faire dire au deacuteclencheur non agrave uneinsertion une modification ou agrave une suppression Ces cas concernent les deacuteclencheurs lignesde type BEFORE puisqursquoil faudra veacuterifier des conditions dans le corps du deacuteclencheur avanteacuteventuellement drsquoaccepter lrsquoeacuteveacutenement

Dans un deacuteclencheur de type BEFORE

Il est possible de modifier une colonne preacutefixeacutee de NEW agrave la condition de deacutetenir le privi-legravege UPDATE associeacute Cela signifie que lrsquoon peut changer un enregistrement avant delrsquoinseacuterer

La valeur drsquoune colonne AUTO_INCREMENT preacutefixeacutee par NEW est 0 (et ne suit pas laseacutequence existante) La valeur actualiseacutee de la seacutequence ne sera effective que lors delrsquoinsertion

Dans tout deacuteclencheur (de type BEFORE ou AFTER) une erreur lors de lrsquoexeacutecution et toutes lesinstructions du bloc sont invalideacutees

Principe

Sans parler de MySQL lrsquoinvalidation dans un deacuteclencheur se traduit en geacuteneacuteral par le deacuteclen-chement drsquoune exception (qui fait avorter lrsquoinstruction LMD) et par le retour drsquoun messagedrsquoerreur personnaliseacute

Les proceacutedures et deacuteclencheurs MySQL ne permettent pour lrsquoinstant ni de provoquer uneexception systegraveme ni de retourner un code SQL personnaliseacute

Il nrsquoest pas non plus possible drsquoutiliser ROLLBACK dans un deacuteclencheur (ERROR 1422(HY000) Explicit or implicit commit is not allowed in stored functionor trigger)

Une seule solution qui nrsquoest pas du tout satisfaisante comme nous allons le voir consisteraitagrave provoquer artificiellement une erreur (mais pas une erreur systegraveme par exemple acceacuteder agraveune table inexistante) Il faut une erreur seacutemantiquement correcte qui pose problegraveme agravelrsquoexeacutecution (NULL dans une cleacute primaire)

Si vous programmez une erreur systegraveme (SELECT drsquoune table inexistante) elle sera releveacuteedans tous les cas drsquoexeacutecution du deacuteclencheur

Lrsquoinconveacutenient majeur de cette astuce est que le message drsquoerreur ne sera jamais explicite caril ne sera pas en rapport avec la contrainte qui nrsquoest pas satisfaite dans le deacuteclencheur

4055_07_C07 Page 275 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

276 copy Eacuteditions Eyrolles

Exemple

Consideacuterons agrave nouveau lrsquoexemple preacuteceacutedent et programmons la contrainte que tout pilote nepeut ecirctre qualifieacute sur plus de trois types drsquoappareils Ici il srsquoagit drsquoassurer la coheacuterence entrela valeur de la colonne nbQualif de la table Pilote et les enregistrements de la tableQualifications

Lrsquoeacuteveacutenement deacuteclencheur est ici BEFORE INSERT car il faudra srsquoassurer de la conditionavant drsquoautoriser Le code minimal de ce deacuteclencheur est deacutecrit dans le tableau suivant ensupposant qursquoon dispose drsquoune table de travail CREATE TABLE Trace(colVARCHAR(80) PRIMARY KEY)

En consideacuterant les donneacutees initiales le test de ce deacuteclencheur est le suivant On remarque quele premier INSERT est bien eacuteviteacute (le pilote PL-1 a deacutejagrave trois qualifications) Bizarrementlrsquoajout du message dans la table Trace nrsquoest pas effectueacute car le deacuteclencheur invalide tout sontraitement en cas drsquoerreur La seconde insertion en revanche est bien effectueacutee (le pilote PL-3 nrsquoa qursquoune seule qualification)

Tableau 7-28 Deacuteclencheur avant insertion

Deacuteclencheur Commentaires

CREATE TRIGGER TrigInsQualif ON Qualifications FOR EACH ROWBEGINDECLARE v_compteur TINYINT(1)DECLARE v_nom VARCHAR(30) SELECT nbQualif nom INTO v_compteur v_nom FROM Pilote WHERE brevet = NEWbrevet IF v_compteur lt 3 THEN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = NEWbrevet ELSE

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheur

Test de la condition

Mise agrave jour du pilote concerneacute par lrsquoajout de la qualification

INSERT INTO TRACE VALUES (CONCAT(Le pilote v_nom a deacutejagrave 3 qualifications)) END IFEND

Instruction jamais reacutealiseacutee

Erreur volontaire

WebBEFORE INSERT

INSERT INTO TRACE VALUES (NULL)

4055_07_C07 Page 276 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 277

chapitre ndeg 7 Programmation avanceacutee

Citons le travail de Roland Bouman un Hollandais qui a eacutecrit une fonction (UDF user-definedfunction) en C qui se comporte comme une fonction native (built-in) simulant le RAISE_APPLICATION_ERROR Cette fonction permet de retourner un message personnaliseacute agrave partirdu corps drsquoun deacuteclencheur (httprpboumanblogspotcom200511using-udf-to-raise-errors-from-insidehtml)

Tables mutantes

Alors qursquoil nrsquoest pas en geacuteneacuteral possible de manipuler la table sur laquelle se porte le deacuteclen-cheur dans le corps du deacuteclencheur lui-mecircme Oracle parle de mutating tables et MySQLpermet drsquoacceacuteder agrave la table en lecture Si on tente drsquoy parvenir en mise agrave jour (INSERTUPDATE ou DELETE) lrsquoerreur est laquo ERROR 1442 (HY000) Cant update tablexxx in stored functiontrigger because it is already used bystatement which invoked this stored functiontrigger raquo

Lrsquoexemple suivant deacutecrit la programmation drsquoun deacuteclencheur qui compte les lignes drsquounetable apregraves chaque nouvelle insertion

Tableau 7-29 Test du deacuteclencheur BEFORE INSERT

Eacuteveacutenement deacuteclencheur Reacutesultat

--ajout incorrectINSERT INTO Qualifications VALUES ( A380SYSDATE())$

ERROR 1048 (23000) Column col cannot be null-- ne fait pas lINSERT dans Qualifications -- ni dans Trace

-- ajout correctINSERT INTO Qualifications VALUES ( A380SYSDATE())$

Query OK 1 row affected (009 sec)-- fait lINSERT dans Qualifications et met agrave jour-- la table Pilote (colonne nbQualif)

PL-1

PL-3

Tableau 7-30 Deacuteclencheur (table mutante)

Deacuteclencheur Trace

SET vs_nombre=0$

CREATE TRIGGER TrigMutant AFTER INSERT ON Trace FOR EACH ROWBEGIN

SELECT COUNT() INTO vs_nombre FROM TraceEND$

SELECT vs_nombre$+------------+| vs_nombre |+------------+| 0 |+------------+INSERT INTO Trace VALUES (Test TrigMutant)$SELECT vs_nombre$+------------+| vs_nombre |+------------+| 1 |+------------+

Web

4055_07_C07 Page 277 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

278 copy Eacuteditions Eyrolles

Restrictions

Pour en finir avec les deacuteclencheurs je vais terminer la laquo litanie raquohellip

bull Pas de deacuteclencheur sur une table temporaire ou une vue ou sur un eacuteveacutenement systegraveme(connexion arrecirct de la base etc)

bull Pas de possibiliteacute de combiner plusieurs eacuteveacutenements par 2 ou par 3 (INSERT OR UPDATEINSERT OR DELETE etc)

bull Les deacuteclencheurs eacutetat (statement trigger) ne sont pas encore reconnus

bull Il nrsquoest pas possible de deacutesactiver un deacuteclencheur sans le deacutetruire

bull Les deacuteclencheurs ne peuvent ecirctre eacutecrits qursquoavec le langage proceacutedural de MySQL (qui sertaussi aux proceacutedures et aux fonctions catalogueacutees)

bull Un deacuteclencheur ne peut constituer aucune transaction ainsi les instructions suivantes sontinterdites COMMIT ROLLBACK SAVEPOINT START TRANSACTION et SET CONSTRAINT

bull Les deacuteclencheurs ne sont pas activeacutes par des actions en cascade reacutesultant drsquoopeacuterations surdes cleacutes primaires ou eacutetrangegraveres (CASCADE voir le chapitre 2)

Suppression drsquoun deacuteclencheur

Pour pouvoir supprimer un deacuteclencheur vous devez disposer du privilegravege SUPER (le privilegravegeDROP TRIGGER est agrave venir) La syntaxe de lrsquoinstruction DROP TRIGGER est la suivante

DROP TRIGGER [nomBase]nomDeacuteclencheur

Si le nom de la base est omis MySQL cherchera agrave deacutetruire le deacuteclencheur dans la base dedonneacutees en cours drsquoutilisation

Le fait de deacutetruire une table a pour conseacutequence drsquoeffacer aussi tous les deacuteclencheurs qui luisont associeacutes

Le fait de deacutetruire une base supprime toutes les tables Par conseacutequent les deacuteclencheurs pas-sent ainsi tous laquo agrave la casserole raquo

SQL dynamique

MySQL parle de server-side prepared statements (eacutetats preacutepareacutes) pour eacutevoquer le fait depouvoir programmer en SQL dynamique En plus des directives SQL (LMD LID) il estpossible de construire automatiquement certaines instructions SQL du LDD

4055_07_C07 Page 278 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 279

chapitre ndeg 7 Programmation avanceacutee

Il est bien sucircr possible de construire des instructions SQL agrave partir drsquoun programme C (MySQLC API client library) Java (MySQL ConnectorJ) Net (MySQL ConnectorNET) ou PHP parune API eacutecrite en C (mysqli extension)

Par exemple on pourra creacuteer une table dont le nom passera en paramegravetre et qui aura unnombre variable de colonnes Il sera aussi permis de construire automatiquement une requecircteSQL en fonction des choix drsquoun utilisateur En plus des ordres simples on pourra eacutegalementparameacutetrer une suite drsquoinstructions dans un bloc MySQL

Une instruction SQL dynamique est stockeacutee en tant que chaicircne de caractegraveres qui sera eacutevalueacuteeagrave lrsquoexeacutecution et non agrave la compilation (en opposition aux instructions SQL statiques quipeuplent la majoriteacute des sous-programmes)

Seules les instructions suivantes peuvent ecirctre construites dynamiquement (dans un preparedstatement) CREATE TABLE DELETE DO INSERT REPLACE SELECT SET UPDATE et la plu-part des commandes SHOW

Les eacutetats preacutepareacutes ne peuvent ecirctre utiliseacutes dans un deacuteclencheur (seuls les sous-programmespeuvent en beacuteneacuteficier pour lrsquoheure)

Lrsquoinstruction

DO expression1 [expression2]

exeacutecute lrsquoexpression (ou les expressions) sans retourner aucun reacutesultat On peut lrsquoassimiler agraveun raccourci de SELECT expression1 mais sans renvoi de reacutesultat Elle peut ecirctreutile pour des fonctions agrave effet de bord (comme la relacircche de verrou RELEASE_LOCK())

Syntaxe

La construction dynamique drsquoinstructions SQL (prepared statements) est baseacutee sur les troisdirectives suivantes

PREPARE nomEtat FROM eacutetatPreacutepareacute

EXECUTE nomEtat [USING var1 [ var2] ]

DEALLOCATE | DROP PREPARE nomEtat

Lrsquoinstruction PREPARE associe un nom (insensible agrave la casse) agrave une instruction dynamique

eacutetatPreacutepareacute est soit une chaicircne soit une variable de session contenant le texte delrsquoinstruction SQL construite (instruction simple pas drsquoinstructions multiples) Dans cettechaicircne le caractegravere laquo raquo (appeleacute placeholder) permet de se substituer agrave un paramegravetre

Lrsquoinstruction EXECUTE lance lrsquoordre parameacutetreacute avec eacuteventuellement la clause USING quireliera les paramegravetres aux variables de session

Pour en terminer avec un ordre preacutepareacute utilisez DEALLOCATE PREPARE qui supprime lecontenu de lrsquoordre (une fin de session deacutesalloue tous les ordres ouverts)

4055_07_C07 Page 279 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

280 copy Eacuteditions Eyrolles

Exemples

Consideacuterons la table Avion contenant deux enregistrements

CREATE TABLE Avion

(immat VARCHAR(6) typeAv CHAR(8) nbHVol DECIMAL(72) comp VARCHAR(4))

INSERT INTO Avion VALUES (F-GLFS A320 1000 AF)

INSERT INTO Avion VALUES (F-WOWW A380 1500 AF)

Instruction DELETE

Le tableau suivant deacutecrit la construction dynamique de lrsquoordre de suppression des avions dontle nombre drsquoheures de vol est supeacuterieur agrave un paramegravetre speacutecifieacute par une variable de session (icieacutevalueacutee agrave 1 000)

Lrsquoappel (CALL bdsoutousousProg()) de cette proceacutedure aura pour conseacutequence dedeacutetruire lrsquoavion immatriculeacute F-WOWW

Instruction SELECT

Le tableau suivant deacutecrit la construction dynamique de lrsquoextraction des avions dont le nombredrsquoheures de vol est eacutegal agrave un paramegravetre speacutecifieacute par une variable de session (ici eacutevalueacutee agrave1 000) La requecircte est elle-mecircme stockeacutee dans une variable de session

Lrsquoappel de cette proceacutedure aura pour conseacutequence drsquoextraire lrsquoavion immatriculeacute F-GLFS

Tableau 7-31 Utilisation de DELETE

Code MySQL Commentaires

SET vs_nbhVol = 1000 $ Deacuteclaration de la variable de session

CREATE PROCEDURE bdsoutousousProg()BEGIN END

Preacuteparation de lrsquoordreExeacutecution

Web

PREPARE etat FROMDELETE FROM Avion WHERE nbHVol gt

EXECUTE etat USING vs_nbhVolDEALLOCATE PREPARE etat

Tableau 7-32 Utilisation de SELECT

Code MySQL Commentaires

SET vs_chaine = SET vs_nbhVol = 1000$

Deacuteclaration des variables de session

CREATE PROCEDURE bdsoutousousProg()BEGIN END

Preacuteparation de lrsquoordreExeacutecution

WebSELECT FROM Avion WHERE nbHVol=$

PREPARE etat FROM vs_chaineEXECUTE etat USING vs_nbhVolDEALLOCATE PREPARE etat

4055_07_C07 Page 280 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 281

chapitre ndeg 7 Programmation avanceacutee

Instruction UPDATE

Le tableau suivant deacutecrit la construction dynamique de lrsquoinstruction de modification (augmen-tation du nombre drsquoheures de vol drsquoun pourcentage passeacute en premier paramegravetre) drsquoun aviondont lrsquoimmatriculation passe en deuxiegraveme paramegravetre Notez qursquoil nrsquoest pas besoin de doublerle guillemet dans la speacutecification du deuxiegraveme placeholder paramegravetre immat (bien qursquoilsrsquoagisse drsquoune chaicircne de caractegraveres)

Lrsquoappel de cette proceacutedure aura pour conseacutequence drsquoaumenter de 10 le nombre drsquoheures devol de lrsquoavion immatriculeacute F-GLFS

Si lrsquoimmatriculation avait eacuteteacute une constante il aurait fallu doubler le guillemet dans lrsquoaffectationde la variable de session

SET vs_chaine =UPDATE Avion SET nbHVol=nbHVol WHERE immat=F-GLFS$

Restrictions

Les placeholders (points drsquointerrogation) des eacutetats preacutepareacutes ne peuvent pas remplacer desnoms de tables de vues drsquoindex de colonnes etc dans une instruction de sorte agrave construireun ordre dynamiquement Ils ne peuvent que remplacer des donneacutes

bull dans la clause WHERE pour des SELECT UPDATE (dans la clause SET aussi) ou DELETE

bull dans la clause VALUES pour un INSERT

Utilisations

Le tableau suivant reacutesume quelques cas permis et les cas non valides associeacutes Nrsquooubliez pas dedoubler chaque guillemet pour affecter une telle chaicircne de caractegraveres dans une variable de session

Tableau 7-33 Utilisation de UPDATE

Code MySQL Commentaires

SET vs_chaine = SET vs_immat = F-GLFS$SET vs_pourcent = 11$

Deacuteclaration des variables de session

CREATE PROCEDURE bdsoutousousProg()BEGIN END

Preacuteparation de lrsquoordreExeacutecution

WebUPDATE Avion SET nbHVol=nbHVol

WHERE immat=$

PREPARE etat FROM vs_chaineEXECUTE etat USING vs_pourcentvs_immatDROP PREPARE etat

4055_07_C07 Page 281 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

282 copy Eacuteditions Eyrolles

Afin de pallier cette limitation il faut construire lrsquoinstruction dynamique agrave lrsquoaide de la fonc-tion CONCAT en incluant eacuteventuellement des placeholders aux endroits permis

Exemple sans placeholder

La proceacutedure catalogueacutee suivante creacutee dynamiquement dans la base bdsoutou une table denom passeacute en premier paramegravetre Le nom de la seconde colonne de la table (ici de type INT)est passeacute en second paramegravetre de la proceacutedure

Lrsquoappel suivant de cette proceacutedure aura pour effet de creacuteer la table Helico La commandeDESCRIBE confirme la structure de la nouvelle table

CALL bdsoutousousProg(Helicoturbine)$

Query OK 0 rows affected (021 sec)

DESCRIBE bdsoutouHelico $

Tableau 7-34 Utilisation des placeholders

Possibles Impossibles

SELECT FROM table WHERE col = SELECT FROM table WHERE

SELECT FROM WHERE

SELECT FROM table WHERE gt 1000

INSERT INTO table VALUES () INSERT INTO VALUES(F-FRTY)

UPDATE table SET col= WHERE col = UPDATE table SET = WHERE col =

UPDATE SET

DELETE FROM table WHERE col = DELETE FROM table WHERE =

DELETE FROM

Tableau 7-35 Creacuteation dynamique drsquoune table

Code MySQL Commentaires

CREATE PROCEDURE bdsoutousousProg (IN v_param1 VARCHAR(10) IN v_param2 VARCHAR(10))BEGIN SET vs_chaine = CONCAT ( PREPARE etat FROM vs_chaine EXECUTE etat DEALLOCATE PREPARE etatEND

Construction de la chaicircne

lsquoCREATE TABLE IF NOT EXISTS bdsoutou (immat CHAR(4) INT)rsquo

Creacuteation de la table

Web

CREATE TABLE IF NOT EXISTSbdsoutouv_param1 (immat CHAR(4) v_param2 INT))

v_param1

v_param2

4055_07_C07 Page 282 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 283

chapitre ndeg 7 Programmation avanceacutee

+---------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+---------+---------+------+-----+---------+-------+

| immat | char(4) | YES | | NULL | |

| turbine | int(11) | YES | | NULL | |

+---------+---------+------+-----+---------+-------+

2 rows in set (039 sec)

Exemple avec placeholder

La proceacutedure catalogueacutee suivante creacutee dynamiquement la requecircte drsquoextraction du type et dunombre drsquoheures de vol (colonnes de noms passeacutes en premier et en deuxiegraveme paramegravetres) dela table de nom passeacute en troisiegraveme paramegravetre en fonction drsquoune condition sur une colonne (denom passeacute en quatriegraveme paramegravetre) Cette condition fait intervenir un paramegravetre (placeholder)valant ici F-GLFS

Lrsquoappel de cette proceacutedure avec les paramegravetres suivants aura pour effet drsquoextraire les valeursdes deux colonnes du premier enregistrement de la table Avion preacutesenteacutee au deacutebut de cettesection

CALL bdsoutousousProg(typeAvnbHVolAvionimmat)$

+--------+---------+

| typeAv | nbHVol |

+--------+---------+

| A320 | 100000 |

+--------+---------+

1 row in set (001 sec)

Query OK 0 rows affected (001 sec)

Tableau 7-36 Creacuteation dynamique drsquoune requecircte avec placeholder

Code MySQL Commentaires

CREATE PROCEDURE bdsoutousousProg(IN v_param1 CHAR(6) IN v_param2 CHAR(6) IN v_param3 CHAR(5) IN v_param4 CHAR(5))BEGIN SET vs_immat = F-GLFS SET vs_chaine = CONCAT( PREPARE etat FROM vs_chaine EXECUTE etat USING vs_immat DEALLOCATE PREPARE etatEND

Avec lrsquoappel suivant construction de la chaicircne lsquoSELECT typeAvnbHVol FROM bdsoutouAvion WHERE immat=rsquo

Exeacutecution de la requecircte parameacutetreacutee

Web

SELECT v_param1v_param2 FROM bdsoutouv_param3 WHERE v_param4 = )

4055_07_C07 Page 283 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

284 copy Eacuteditions Eyrolles

Exercices

Lrsquoobjectif de ces exercices est drsquoeacutecrire des sous-programmes MySQL manipulant des curseurset geacuterant des exceptions sur la base de donneacutees Parc informatique

71 Curseur

On deacutesire connaicirctre pour chaque logiciel installeacute le temps (nombre de jours entier deacutecimal) passeacuteentre lrsquoachat et lrsquoinstallation Ce calcul devra renseigner la colonne delai de la table Installerpour lrsquoinstant nulle

Utiliser une table testTrace(message VARCHAR(80) (et lrsquoafficher en fin de sous-programme)pour stocker

bull les incoheacuterences (date drsquoinstallation anteacuterieure agrave la date drsquoachat date drsquoinstallation ou date drsquoachatinconnue)

bull le nombre entier de jours seacuteparant lrsquoachat de lrsquoinstallation (utiliser DATEDIFF)

bull une chaicircne simulant un format TIME eacutetendu qui repreacutesente le nombre de jours deacutecimal seacuteparantlrsquoachat de lrsquoinstallation (par exemple si le nombre de jours deacutecimal vaut laquo 145 raquo il faudra cons-truire la chaicircne laquo 14 j 120000 raquo)

Eacutecrire la proceacutedure calculTemps pour programmer ce processus Un exemple de tabletestTrace agrave produire en sortie

+------------------------------------------------------------------+

| message |

+------------------------------------------------------------------+

| Logiciel Oracle 6 sur Poste 2 attente 2924 jour(s) |

| En format TIME eacutetendu 2924 j 000000 |

| Logiciel Oracle 8 sur Poste 2 attente 1463 jour(s) |

| hellip |

| Logiciel I I S installeacute sur Poste 7 11 jour(s) avant lachat |

| Date dachat inconnue pour le logiciel SQLNet sur Poste 2 |

| Logiciel Oracle 6 sur Poste 8 attente 3876 jour(s) |

| En format TIME eacutetendu 3876 j 105917 |

| hellip |

+------------------------------------------------------------------+

72 Transaction

Eacutecrire la proceacutedure installLogSeg permettant drsquoeffectuer une installation groupeacutee sur tous lespostes drsquoun mecircme segment drsquoun nouveau logiciel La transaction doit enregistrer dans un premiertemps le nouveau logiciel puis les diffeacuterentes installations sur tous les postes du segment de mecircmetype que celui du logiciel acheteacute Lrsquoinstallation se fera agrave la date du jour Penser agrave mettre agrave jour lacolonne delai comme programmeacute preacuteceacutedemment

4055_07_C07 Page 284 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 285

chapitre ndeg 7 Programmation avanceacutee

Ne pas encore tenir compte des eacuteventuelles exceptions et tracer chaque insertion dans la tabletestTrace Utiliser les paramegravetres ci-dessous pour tester votre proceacutedure Lrsquoeacutetat de sortie doit ecirctrele suivant Veacuterifier aussi la preacutesence des deux nouveaux enregistrements dans la table InstallerNe programmer le COMMIT qursquoune fois la proceacutedure bien testeacutee

CALL installLogSeg(13012080 log99 Blaster 2005-09-05

99 PCWS 9999)$

+---------------------------------------+

| message |

+---------------------------------------+

| Blaster stockeacute dans la table Logiciel |

| Installation sur Poste 4 dans Salle 2 |

| Installation sur Poste 5 dans Salle 2 |

+---------------------------------------+

73 Exceptions

Modifier la proceacutedure installLogSeg afin de prendre en compte quelques-unes des exceptionspotentielles

bull numeacutero de segment inconnu (erreur NOT FOUND)

bull numeacutero de logiciel deacutejagrave preacutesent (ERROR 1062 Duplicate entry)

bull type du logiciel inconnu (ERROR 1452 Cannot add or update a child row)

bull date drsquoachat posteacuterieure agrave celle du jour (se servir du mecircme calcul que pour la colonne delai delrsquoexercice preacuteceacutedent)

bull aucune installation reacutealiseacutee car pas de poste de travail de ce type (erreur utilisateur pas_install_possible)

Veacuterifier chacun de ces cas avec le jeu de tests suivant

--test segmentCALL installLogSeg( log99Blaster 2005-09-05 99 PCWS 9999)$--test logiciel deacutejagrave preacutesentCALL installLogSeg(13012080 Blaster 2005-09-05 99 PCWS 9999)$--test type du logicielCALL installLogSeg(13012080 log98Mozilla 2005-11-04 1 1000)$--date drsquoachat plus grande que celle du jour CALL installLogSeg(13012080 log98Mozilla 1 PCWS 1000)$--aucune installCALL installLogSeg( log55Eudora 2005-12-06 5

540)$--bonne installationCALL installLogSeg(13012080 log77Blog Up 2005-12-05 13 PCWS 90)$

toto

log1

toto

2010-11-04

13012081PCWS

4055_07_C07 Page 285 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

286 copy Eacuteditions Eyrolles

74 Deacuteclencheurs

Mises agrave jour de colonnes

Eacutecrire les deacuteclencheurs Trig_AD_Installer et Trig_AI_Installer sur la table Installerpermettant de faire la mise agrave jour automatique des colonnes nbLog de la table Poste et nbIns-tall de la table Logiciel Preacutevoir les cas de deacutesinstallation drsquoun logiciel (AFTER DELETE) sur unposte et drsquoinstallation (AFTER INSERT) drsquoun logiciel sur un autre

Eacutecrire les deacuteclencheurs Trig_AI_Poste et Trig_AD_Poste sur la table Poste permettantdrsquoactualiser la colonne nbPoste de la table Salle agrave chaque ajout ou suppression drsquoun nouveauposte

Eacutecrire le deacuteclencheur Trig_AU_Salle sur la table Salle qui met agrave jour automatiquement lacolonne nbPoste de la table Segment apregraves la modification de la colonne nbPoste

Ces deux derniers deacuteclencheurs vont srsquoenchaicircner lrsquoajout ou la suppression drsquoun poste entraicircneralrsquoactualisation de la colonne nbPoste de la table Salle qui conduira agrave la mise agrave jour de la colonnenbPoste de la table Segment Ajouter un poste pour veacuterifier le rafraicircchissement des deux tables(Salle et Segment) Supprimer ce poste puis veacuterifier agrave nouveau la coheacuterence des deux tables

Programmation de contraintes

Eacutecrire le deacuteclencheur Trig_BI_Installer sur la table Installer permettant de controcircler avantchaque nouvelle installation que le type du logiciel correspond au type du poste et que la datedrsquoinstallation est soit nulle soit posteacuterieure agrave la date drsquoachat

4055_07_C07 Page 286 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie III

Langages et outils

4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

289

Chapitre 8

Utilisation avec Java

MySQL offre sur son site diffeacuterents pilotes pour rendre compatibles des applications avecune base de donneacutees sur diffeacuterents systegravemes

ConnectorODBC

(

Open DataBase Connectivity

) pour Windows Linux Mac OS X etUnix

ConnectorJ

pour toute plate-forme Java en utilisant JDBC (

Java DataBaseConnectivity

)

ConnectorNet

pour toute plate-forme Net

ConnectorMXJ composant qui encapsule le moteur MySQL dans une application J2EE

Ce chapitre explique lrsquoutilisation de lrsquoAPI JDBC 30 pour manipuler une base MySQL via unprogramme Java

JDBC avec ConnectorJ

Lrsquointerface JDBC initialement programmeacutee par Sun appeleacutee aussi laquo passerelle raquo ou laquo API raquoest composeacutee drsquoun ensemble de classes permettant le dialogue entre une application Java etune source de donneacutees compatible SQL (tables relationnelles en geacuteneacuteral mais aussi donneacuteesissues drsquoun fichier texte ou drsquoun classeur Excel par exemple) LrsquoAPI JDBC 30 que MySQLfournit gratuitement est appeleacutee

ConnectorJ

Lrsquointerface JDBC est conforme au niveau drsquoentreacutee de la norme SQL2 (

entry

level

) et prend encharge la programmation

multithread

La communication est reacutealiseacutee en mode client-serveurdeacuteconnecteacute et srsquoeffectue en plusieurs eacutetapes

connexion agrave la base de donneacutees

eacutemissions drsquoinstructions SQL et exploitation des reacutesultats provenant de la base dedonneacutees

deacuteconnexion de la base

Le spectre de JDBC est large car lrsquoapplicatif Java peut ecirctre une classe ou une

applet

cocircteacuteclient une

servlet

un EJB (

Enterprise Java Beans

) ou une proceacutedure catalogueacutee cocircteacute serveur

4055_08_C08 Page 289 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

290

copy Eacuteditions Eyrolles

Classification des pilotes (drivers)

Un pilote (

driver

) JDBC est une couche logicielle chargeacutee drsquoassurer la liaison entre lrsquoapplicationJava (cliente) et le SGBD (serveur) La classification des pilotes JDBC distingue quatre types

Les pilotes de type 1 (

JDBC-ODBC Bridge

) utilisent la couche logicielle de Microsoftappeleacutee ODBC Le client est dit laquo eacutepais raquo puisque le pilote JDBC convertit les appels Javaen appels ODBC avant de les exeacutecuter Cette approche convient bien pour des sources dedonneacutees Windows ou si lrsquointerface cliente est eacutecrite dans un langage natif de Microsoft

Les pilotes de type 2 (

Native-API Partly-Java Driver

) utilisent un pilote fourni par le cons-tructeur de la base de donneacutees (natif) Le pilote nrsquoeacutetant pas deacuteveloppeacute en Java le client estaussi dit laquo eacutepais raquo pour cette approche En effet les commandes JDBC sont toutes conver-ties en appels natifs du SGBD consideacutereacute Cette approche convient pour les applications quimanipulent des sources de donneacutees uniques (tout Oracle ou IBM etc)

Les pilotes de type 3 (

Net Protocol All-Java Driver

) utilisent un pilote geacuteneacuterique natif eacutecriten Java Le client est plus laquo leacuteger raquo car les appels JDBC sont transformeacutes par un protocoleindeacutependant du SGBD Cette approche convient pour des sources de donneacutees heacuteteacuterogegravenes

Les pilotes de type 4 (

Native Protocol All-Java Driver

) sont eacutecrits en Java Le client estleacuteger car il ne neacutecessite aucune couche logicielle suppleacutementaire Les appels JDBC sonttraduits en

sockets

exploiteacutes par le SGBD Cette approche est la plus simple mais pasforceacutement la plus puissante elle convient pour tous les types drsquoarchitectures

La figure suivante scheacutematise le principe mis en œuvre au travers des quatre types de pilotes JDBC

Le choix du pilote nrsquoa pas drsquoinfluence majeure sur la programmation Seules les phases dechargement du pilote et de connexion aux bases sont speacutecifiques les autres instructions sontindeacutependantes du pilote En drsquoautres termes si vous avez une application deacutejagrave eacutecrite et que

Figure 8-1

Types de pilotes JDBC

BD

Java

JDB C

ODBC

ODBC

BD

Java

JDB C

Driver BD

Driver BD

Java

Driver

Java

100

Driver Geacuteneacuterique

Driver

IBM

BD

Driver

IBM

DriverOracle

Java

Driver

100 Java

BD

type 1 type 2 type 3 type 4

TCP IP

4055_08_C08 Page 290 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

291

chapitre ndeg 8 Utilisation avec Java

vous deacutecidez de changer le type du pilote ndash soit que la source de donneacutees migre de MySQL agraveAccess agrave Oracle ou agrave SQL Server par exemple soit que vous optiez pour un autre pilote enconservant votre source de donneacutees ndash seules quelques instructions devront ecirctre reacuteeacutecrites

Avec MySQL vous pouvez travailler avec lrsquoAPI de Sun mais vous nrsquoavez pas trop le choixpour le type du pilote (

ConnectorJ

est un pilote JDBC de type 4)

Le paquetage

javasql

La version 30 de JDBC est composeacutee de classes et drsquointerfaces situeacutees dans le paquetage

javasql

du JDK MySQL propose eacutegalement une API proprieacutetaire (qui redeacutefinit et eacutetendcelle de Sun) Le tableau suivant reacutesume la composition de ce paquetage

Structure drsquoun programme

La structure drsquoun programme Java utilisant JDBC comprend successivement les phases

drsquoimportation de paquetages

de chargement drsquoun pilote

de creacuteation drsquoune ou de plusieurs connexions

de creacuteation drsquoun ou de plusieurs eacutetats

drsquoeacutemission drsquoinstructions SQL sur ces eacutetats

de fermeture des objets creacuteeacutes

Le code suivant (

JDBCTestjava

) deacutecrit la syntaxe du plus simple programme JDBC Nousinscrivons toutes les phases dans un mecircme bloc (le

main

) mais elles peuvent se trouver dansdiffeacuterents blocs ou meacutethodes de diverses classes

Tableau 8-1 LrsquoAPI JDBC 30 standard

Classeinterface Description

javasqlDriverjavasqlConnection

Pilotes JDBC pour les connexions aux sources de donneacutees SQL

javasqlStatementjavasqlPreparedStatementjavasqlCallableStatement

Construction drsquoordres SQL

javasqlResultSet

Gestion des reacutesultats des requecirctes SQL

javasqlDriverManager

Gestion des pilotes de connexion

javasqlSQLException

Gestion des erreurs SQL

javasqlDatabaseMetaDatajavasqlResultSetetaData

Gestion des meacuteta-informations (description de la base de donneacutees des tableshellip)

javasqlSavePoint

Gestion des transactions et des sous-transactions

4055_08_C08 Page 291 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

292

copy Eacuteditions Eyrolles

Le dernier bloc permet de reacutecupeacuterer les erreurs renvoyeacutees par le SGBD Nous deacutetaillerons enfin de section le traitement des exceptions

Test de votre configuration

Lrsquoenvironnement JDBC sous MySQL neacutecessite la configuration drsquoun certain nombre de variables

La variable

PATH

doit contenir le chemin de la machine virtuelle Java pour compiler etexeacutecuter des classes Le JDK est en geacuteneacuteral installeacute dans

Cj2sdk1XXX

les fichiers

javac

et

java

se trouvent dans le sous-reacutepertoire

bin

La variable

CLASSPATH

doit inclure le paquetage JDBC (fichier

jar

) pour MySQL (teacuteleacute-chargeable sur le site de MySQL) Pour ma part jrsquoai deacutezippeacute le fichier

mysql-connec-tor-java-3112zip

dans le reacutepertoire

Ctemp

Tableau 8-2 Programme de test de connexion JDBC

Code Java Commentaires

import javasql

Importation du paquetage

public class JDBCTestpublic static void main(String[] args) throws SQLException Exception

Classe ayant une meacutethode

main

try Systemoutprintln (Initialisation de la connexion) ClassforName (commysqljdbcDriver)newInstance() catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement+extoString()) try Connection cx = DriverManagergetConnection (jdbcmysqllocalhostbdsoutou user=soutouamppassword=iut)

Chargement du pilote JDBC MySQL

Creacuteation drsquoune connexion

Statement etat = cxcreateStatement () ResultSet rset = etatexecuteQuery (SELECT SYSDATE()) while (rsetnext ()) Systemoutprintln(Nous sommes le + rsetgetString (1)) Systemoutprintln(JDBC correctement configureacute)

Creacuteation drsquoun eacutetat de connexionExtraction de la date courante

Affichage du reacutesultat

catch(SQLException ex) Systemerrprintln(Erreur +ex)

Gestion des erreurs

Web

4055_08_C08 Page 292 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

293

chapitre ndeg 8 Utilisation avec Java

Vous pouvez tester votre environnement en utilisant le fichier

JDBCTest

java

Si vous utili-sez lrsquooutil

JCreator

configurez la variable

CLASSPATH

de la maniegravere suivante

Confi-gure

Options

JDK Profiles

clic sur la version du JDK puis

Edit

onglet

Classes

faire

Add Archive

et choisir le fichier

jar

(pour mon cas

mysql-connector-java-3112-binjar

)

Cet exemple deacutecrit le code neacutecessaire agrave la connexion agrave votre base (il faudra modifier le nom dela base le nom et le mot de passe de lrsquoutilisateur) et doit renvoyer les messages suivants

Initialisation de la connexion

Nous sommes le

date et heure courante

JDBC correctement configureacute

Connexion agrave une base

La connexion agrave une base de donneacutees est rendue possible par lrsquoutilisation de la classe

Driver-Manager

et de lrsquointerface

Connection

Deux eacutetapes sont neacutecessaires pour qursquoun programme Java puisse se connecter agrave une base dedonneacutees

bull Le chargement du pilote par appel de la meacutethode

javalangClassforName

bull Lrsquoeacutetablissement de la connexion en creacuteant un objet (ici cx) de lrsquointerface Connection parlrsquoinstruction suivante cx = DriverManagergetConnection(chaicircneConnexion)

Pour MySQL nous verrons que le paramegravetre chaicircneConnexion repreacutesente une variabledont une syntaxe simplifieacutee est de type

jdbcmysql[host][port][database][user][=nomUtil][amppassword][=motPasse]

Cette chaicircne permettra de deacutesigner la base et drsquoidentifier lrsquoutilisateur

Figure 8-2 Interface JCreator

4055_08_C08 Page 293 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

294 copy Eacuteditions Eyrolles

Base Access

Eacutetudions pour information lrsquoeacutetablissement de la connexion drsquoun pilote de type 1 pour semettre en rapport avec une base Access via une source de donneacutees ODBC La figure suivanteillustre les parties du panneau de configuration Windows qui permettent de deacutesigner une baseAccess Dans notre exemple la source (BaseGTRMDB) est situeacutee dans un reacutepertoire souslrsquouniteacute de disque D et deacutesigneacutee par le DSN (Data Source Name) sourcebaseGTR

Le code suivant (TestJDBCODBCjava) charge un pilote de type 1 puis se connecte agrave lasource ODBC preacuteciteacutee (inutile de preacuteciser le nom et le mot de passe de lrsquoutilisateur du faitdrsquoune base Access) Le DSN est noteacute en gras dans le script

Figure 8-3 Source de donneacutees ODBC

Tableau 8-3 Programme JDBC

Code Java Commentaires

import javasql Importationclass TestJDBCODBC public static void main (String args []) throws SQLException try catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement) try

Classe ayant une meacutethode mainChargement drsquoun pilote JDBCODBC

Connexion agrave la base Access

catch(SQLException ex) hellip Gestion des erreurs

Web

ClassforName(sunjdbcodbcJdbcOdbcDriver)

Connection conn = DriverManagergetConnection(jdbcodbcsourcebaseGTR)

4055_08_C08 Page 294 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 295

chapitre ndeg 8 Utilisation avec Java

Base MySQL

Seules les phases de chargement de pilote et de creacuteation de la connexion changent Afin detransfeacuterer un pilote MySQL il faut utiliser lrsquointerface DriverManager impleacutementeacutee parlrsquoappel de la meacutethode ClassforName() Sous ConnectorJ le nom de la classe agrave chargerest commysqljdbcDriver La connexion srsquoeffectue par la meacutethode getConnection

Interface ConnectionLe tableau ci-apregraves preacutesente les principales meacutethodes disponibles de lrsquointerface Connec-tion Nous deacutetaillerons lrsquoinvocation de certaines de ces meacutethodes agrave lrsquoaide des exemples dessections suivantes

Tableau 8-4 Chargement du pilote MySQL

Code Java Commentaires

try catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement+extoString())

Chargement du pilote MySQL

try

Deacuteclaration drsquoune con-nexion

catch(SQLException ex) Systemerrprintln(Erreur +ex)

Gestion des erreurs

ClassforName(commysqljdbcDriver)newInstance()

Connection cx = DriverManagergetConnection(jdbcmysqllocalhostbdsoutou

user=soutouamppassword=iut)

Tableau 8-5 Meacutethodes de lrsquointerface Connection

Meacutethode Description

createStatement() Creacuteation drsquoun objet destineacute agrave recevoir un ordre SQL statiquenon parameacutetreacute

prepareStatement(String) Preacutecompile un ordre SQL acceptant des paramegravetres et pouvantecirctre exeacutecuteacute plusieurs fois

prepareCall(String) Appel drsquoune proceacutedure catalogueacutee (certains pilotes attendentexecute ou ne reconnaissent pas prepareCall)

void setAutoCommit(boolean) Positionne ou non le commit automatique

void commit() Valide la transaction

void rollback() Invalide la transaction

void close() Ferme la connexion

4055_08_C08 Page 295 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

296 copy Eacuteditions Eyrolles

Eacutetats drsquoune connexion

Une fois la connexion eacutetablie il est neacutecessaire de deacutefinir des eacutetats qui permettront lrsquoencapsu-lation drsquoinstructions SQL dans du code Java Un eacutetat permet de faire passer plusieurs instruc-tions SQL sur le reacuteseau On peut affecter agrave un eacutetat une ou plusieurs instruction SQL Si ondeacutesire exeacutecuter plusieurs fois la mecircme instruction il est inteacuteressant de reacuteserver lrsquoutilisationdrsquoun eacutetat agrave cet effet

Interfaces disponibles

Diffeacuterentes interfaces sont preacutevues agrave cet effet

Statement pour les ordres SQL statiques Ces eacutetats sont construits par la meacutethodecreateStatement appliqueacutee agrave la connexion

PreparedStatement pour les ordres SQL parameacutetreacutes Ces eacutetats sont construits par lameacutethode prepareStatement appliqueacutee agrave la connexion

CallableStatement pour les proceacutedures ou fonctions catalogueacutees Ces eacutetats sont cons-truits par la meacutethode prepareCall appliqueacutee agrave la connexion

Srsquoil ne doit plus ecirctre utiliseacute dans la suite du code Java chaque objet de type StatementPreparedStatement ou CallableStatement devra ecirctre fermeacute agrave lrsquoaide de la meacutethodeclose

Meacutethodes geacuteneacuteriques pour les paramegravetres

Une fois qursquoun eacutetat est creacuteeacute il est possible de lui passer des paramegravetres par des meacutethodes geacuteneacute-riques (eacutetudieacutees plus en deacutetail par la suite)

setxxx ougrave XXX deacutesigne le type de la variable (exemple setString ou setInt) dusens Java vers MySQL (setter methods) Il srsquoagit ici de parameacutetrer un ordre SQL(instruction ou appel drsquoun sous-programme)

Figure 8-4 Connexion et eacutetats

Connection Statement

Statement

PreparedstatementBaseMySQL

Java

JDBC

SELECT INSERThellip

Donneacutees (INT VARCHAR )

4055_08_C08 Page 296 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 297

chapitre ndeg 8 Utilisation avec Java

getxxx (exemple getString ou getInt) du sens MySQL vers Java Il srsquoagit icidrsquoextraire des donneacutees de la base dans des variables hocirctes Java via un curseur Java (gettermethods)

updatexxx (exemple updateString ou upadateInt) du sens Java vers MySQL Ilsrsquoagit ici de mettre agrave jour des donneacutees de la base via un curseur Java (updater methods)Ces meacutethodes sont disponibles seulement depuis la version 2 de JDBC (SDK 12)

Eacutetats simples (interface Statement)

Nous deacutecrivons ici lrsquoutilisation drsquoun eacutetat simple (interface Statement) Nous eacutetudierons parla suite les instructions parameacutetreacutees (interface PreparedStatement) et appels de sous-programmes (interface CallableStatement) Le tableau suivant deacutecrit les principalesmeacutethodes de lrsquointerface Statement

Le code suivant (Etatsjava) preacutesente quelques exemples drsquoutilisation de ces meacutethodes surun eacutetat (objet etatSimple) Nous supposons qursquoun pilote JDBC est chargeacute et que laconnexion cx a eacuteteacute creacuteeacutee Nous verrons en fin de chapitre comment traiter proprement lesexceptions

Tableau 8-6 Meacutethodes de lrsquointerface Statement

Meacutethode Description

ResultSet execute-Query(String)

Exeacutecute une requecircte et retourne un ensemble de lignes (objetResultSet)

int executeUpdate(String) Exeacutecute une instruction SQL et retourne le nombre de lignestraiteacutees (INSERT UPDATE ou DELETE) ou 0 pour les instruc-tions ne renvoyant aucun reacutesultat (LDD)

boolean execute(String) Exeacutecute une instruction SQL et renvoie true si crsquoest une ins-truction SELECT false sinon (instructions LMD ou plusieursreacutesultats ResultSet)

Connection getConnection() Retourne lrsquoobjet de la connexion

void setMaxRows(int) Positionne la limite du nombre drsquoenregistrements agrave extraire partoute requecircte issue de cet eacutetat

int getUpdateCount() Nombre de lignes traiteacutees par lrsquoinstruction SQL (-1 si crsquoest unerequecircte ou si lrsquoinstruction nrsquoaffecte aucune ligne)

void close() Ferme lrsquoeacutetat

4055_08_C08 Page 297 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

298 copy Eacuteditions Eyrolles

Meacutethodes agrave utiliser

Le tableau suivant indique la meacutethode preacutefeacuterentielle agrave utiliser sur lrsquoeacutetat courant (objet State-ment) en fonction de lrsquoinstruction SQL agrave eacutemettre

Correspondances de types

Les eacutechanges de donneacutees entre variables Java et colonnes des tables Oracle impliquent depreacutevoir des conversions de types Drsquoune maniegravere geacuteneacuterale tout type de donneacutee MySQL peutecirctre convertit en un type javalangString Les types numeacuteriques trouvent aussi unecorrespondance dans les types numeacuteriques Java (attention toutefois aux arrondis deacutepassementde capaciteacute ou perte de preacutecision)

Tableau 8-7 Eacutetats simples

Code Java Commentaires

Statement etatSimple = cxcreateStatement() Creacuteation de lrsquoeacutetat (CREATE TABLE IF NOT EXISTSCompagnie(comp VARCHAR(4) nomComp VARCHAR(30)CONSTRAINT pk_Compagnie PRIMARY KEY(comp)))

Ordre LDD

(CREATE TABLE IF NOT EXISTS Avion (immat VARCHAR(6)typeAvionVARCHAR(15) cap SMALLINT compa VARCHAR(4) CONSTRAINT pk_Avion PRIMARY KEY(immat) CONSTRAINT fk_Avion_comp_Compagnie FOREIGN KEY(compa) REFERENCESCompagnie(comp)))

Ordre LDD (autre eacutecri-ture) j contient 0 (aucune ligne nrsquoest con-cerneacutee)

(INSERT INTOCompagnie VALUES (AFAir France))

Ordre LMD k contient 1 (une ligne est concerneacutee)

(INSERT INTO Avion VALUES (F-WTSSConcorde90AF)) (INSERT INTO Avion VALUES (F-FGFBA320148AF))

Ordres LMD (autres eacutecri-tures)

(10) Pas plus de 10 lignes retourneacutees par les pro-chaines extractions

ResultSet curseurJava = (SELECT FROM Avion)

Chargement drsquoun curseur Java

etatSimpleexecute(DELETE FROM Avion) int l = ()

Ordre LMD l contient 2 (avions supprimeacutes)

WebetatSimpleexecute

int j = etatSimpleexecuteUpdate

int k = etatSimpleexecuteUpdate

etatSimpleexecute

etatSimpleexecute

etatSimplesetMaxRows

etatSimpleexecuteQuery

etatSimplegetUpdateCount

Tableau 8-8 Meacutethodes Java pour les ordres SQL

Instruction SQL Meacutethode Type de retour

CREATE ALTER DROP executeUpdate int

INSERT UPDATE DELETE executeUpdate int

SELECT executeQuery ResultSet

4055_08_C08 Page 298 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 299

chapitre ndeg 8 Utilisation avec Java

Les tableaux suivants preacutesentent les principales correspondances existantes

La meacutethode getObject()de lrsquointerface ResultSet (que nous allons eacutetudier plus loin)reacutealise implicitement les conversions suivantes

Tableau 8-9 Conversions possibles entre types

Les types MySQL Peuvent creacuteer les classes Java

CHAR VARCHAR BLOB TEXT ENUM et SET

javalangString javaioInputStream javaioReader javasqlBlob et javasqlClob

FLOAT REAL DOUBLE PRECISION NUMERIC DECIMAL TINYINT SMALLINT MEDIUMINT INTEGER et BIGINT

javalangString javalangShort javalangInteger javalangLong javalangDou-ble et javamathBigDecimal

DATE TIME DATETIME et TIMESTAMP

javalangString javasqlDate et javasqlTimestamp

Tableau 8-10 Correspondances entre types

Types MySQL Types Java

BOOL et BOOLEAN alias de TINYINT(1)

BLOB BINARY(n) BIT(gt1) LONGBLOB MEDIUMBLOB TINYBLOB et VARBINARY(n)

byte[]

BIT(1) et TINYINT javalangBoolean si la configuration tinyInt1isBit est mise agrave true (par deacutefaut) et la taille de la variable = 1 (javalangInteger sinon)

DOUBLE[(np)] javalangDouble

FLOAT[(np)] javalangFloat

SMALLINT[(n)] [UNSIGNED] javalangInteger (sans controcircle du signe)

INT et INTEGER[(n)] [UNSIGNED] javalangInteger (si UNSIGNED javalangLong)

MEDIUMINT[(n)] [UNSIGNED] javalangInteger (si UNSIGNED javalangLong)

BIGINT[(n)] [UNSIGNED] javalangLong (si UNSIGNEDjavamathBigInteger)

TINYTEXT TEXT MEDIUMTEXTLONGTEXT ENUM() et SET()

javalangString

CHAR(M) VARCHAR(M) [BINARY] javalangString (si BINARY byte[])

DECIMAL[(n[p])] javamathBigDecimal

DATE javasqlDate

YEAR[(2|4)] javasqlDate (date initialiseacutee au 1er Janvier 0h)

TIME javasqlTime

DATETIME TIMESTAMP[(n)] javasqlTimestamp

4055_08_C08 Page 299 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

300 copy Eacuteditions Eyrolles

Il est possible de connaicirctre le type de la variable (ou de lrsquoobjet Java) que vous devez utiliserdans votre programme JDBC pour travailler avec une colonne col drsquoune table tab Pour cefaire utiliser la meacutethode Class getClass() appliqueacute agrave lrsquoobjet reacutesultant de lrsquoextraction de lacolonne dans le ResultSet par getObject(col) Une fois cette classe instancieacutee il resteagrave utiliser String getName() pour trouver son nom

Le code suivant (CorresTypesjava) preacutesente la maniegravere drsquoextraire le type Java neacutecessairepour travailler avec la colonne cap de la table Avion (ici SMALLINT)

La trace de ce programme est la suivante

Valeur 148

Classe Java equivalente

Manipulations avec la base

Deacutetaillons agrave preacutesent les diffeacuterents sceacutenarios que lrsquoon peut rencontrer lors drsquoune manipulationde la base de donneacutees par un programme Java Les tableaux suivants reacutepertorient les conseacute-quences les plus freacutequentes Les autres cas (relatifs aux contraintes reacutefeacuterentielles et auxproblegravemes de syntaxe) seront eacutetudieacutes dans la section Traitement des exceptions

Suppression de donneacutees

Tableau 8-11 Deacuteduction du type Java agrave utiliser

Code Java Commentaires

ResultSet curseurJava = etatSimpleexecuteQuery (SELECT cap FROM Avion LIMIT 1)

Extraction dans un curseur de lacapaciteacute du premier avion

while (curseurJavanext ()) Ouverture et lecture du curseur Systemoutprintln(Valeur +curseurJavagetObject(cap)) Systemoutprintln (Classe Java equivalente + )

Extraction de lrsquoobjet Java eacutequiva-lent

Deacuteduction de sa classe

Web

Object obj = curseurJavagetObject(cap)

Class clJava = objgetClass()

clJavagetName()

javalangInteger

Tableau 8-12 Enregistrements preacutesents dans la table

Code Java Reacutesultat

etatexecuteUpdate(DELETE FROM Avion) Fait la suppression et passe en seacutequence

j = etatexecuteUpdate(DELETE FROM Avion) Fait la suppression affecte agrave j le nombredrsquoenregistrements supprimeacutes et passe enseacutequence

4055_08_C08 Page 300 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 301

chapitre ndeg 8 Utilisation avec Java

Ajout drsquoenregistrements

Modification drsquoenregistrements

Extraction de donneacutees

Eacutetudions ici la gestion des reacutesultats drsquoune instruction SELECT

Le reacutesultat drsquoune requecircte est placeacute dans un objet de lrsquointerface ResultSet qui srsquoapparente agraveun curseur Java

Le tableau suivant preacutesente les principales meacutethodes disponibles de lrsquointerface ResultSetLes meacutethodes relatives aux curseurs navigables seront eacutetudieacutees par la suite Le parcours de cecurseur srsquoopegravere par la meacutethode next Initialement (apregraves creacuteation et chargement du curseur)on est positionneacute avant la premiegravere ligne Bien qursquoun objet de lrsquointerface ResultSet soitautomatiquement fermeacute quand son eacutetat est fermeacute ou recreacuteeacute il est preacutefeacuterable de le fermer expli-citement par la meacutethode close srsquoil ne doit pas ecirctre reacuteutiliseacute

Tableau 8-13 Aucun enregistrement dans la table

Code Java Reacutesultat

etatexecuteUpdate(DELETE FROM Avion) Aucune action sur la base et passe enseacutequence

j = etatexecuteUpdate(DELETE FROM Avion) Aucune action sur la base affecte agrave j lavaleur 0 et passe en seacutequence

Tableau 8-14 Diffeacuterentes eacutecritures drsquoun INSERT

Code Java Reacutesultat

etatexecuteUpdate(INSERT INTO Compagnie VALUES (TAFToulouse Air Free))

Fait lrsquoinsertion et passe en seacutequence

int j= etatexecuteUpdate(INSERT INTO Compa-gnie VALUES (TAFToulouse Air Free))

Fait lrsquoinsertion affecte agrave j le nombre 1 etpasse en seacutequence

Tableau 8-15 Diffeacuterentes eacutecritures drsquoun UPDATE

Code Java Reacutesultat

etatexecuteUpdate(UPDATE Compagnie SET nomComp = Air France Compagny WHERE comp = AF)

Fait la modification et passe enseacutequence Si aucun enregistrement nrsquoestconcerneacute aucune exception nrsquoest leveacutee

int j= etatexecuteUpdate(UPDATE Avion SET capacite=capacite12)

Fait la (les) modification(s) affecte agrave j lenombre drsquoenregistrements modifieacutes etpasse en seacutequence (0 si aucun enregis-trement nrsquoest modifieacute)

4055_08_C08 Page 301 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

302 copy Eacuteditions Eyrolles

Distinguons lrsquoinstruction SELECT qui geacutenegravere un curseur statique (objet Resultset utiliseacutesans option particuliegravere) de celle qui produit un curseur navigable ou modifiable (objetResultset employeacute avec des options disponibles depuis la version 2 de JDBC)

Curseurs statiques

Le code suivant (SELECTstatiquejava) extrait les avions de la compagnie Air Francepar lrsquointermeacutediaire du curseur curseurJava Notez lrsquoutilisation des diffeacuterentes meacutethodesget pour reacutecupeacuterer des valeurs issues de colonnes

Tableau 8-16 Meacutethodes principales de lrsquointerface ResulSet

Meacutethode Description

boolean next() Charge lrsquoenregistrement suivant en retournant true renvoiefalse lorsqursquoil nrsquoy a plus drsquoenregistrement suivant

void close() Ferme le curseur

getxxx(int) Reacutecupegravere au niveau de lrsquoenregistrement la valeur de lacolonne numeacuteroteacutee de type xxx Exemple getInt(1) getS-tring(1) getDate(1) etc pour reacutecupeacuterer la valeur de la pre-miegravere colonne

updatexxx(hellip) Modifie au niveau de lrsquoenregistrement la valeur de la colonnenumeacuteroteacutee de type xxx Exemple updateInt(1i)updateString(1nom) etc

ResultSetMetaData getMetaData() Retourne un objet ResultSetMetaData correspondant au curseur

Object getObject(String) Retourne la valeur de la colonne deacutesigneacutee par le paramegravetredans une variable Java de type adeacutequat

Tableau 8-17 Extraction de donneacutees dans un curseur statique

Code Java Commentaires

try hellipStatement etatSimple = cxcreateStatement() Creacuteation de lrsquoeacutetat

= (SELECT immat cap FROM Avion WHERE comp = (SELECT comp FROM Compagnie WHERE nom-Comp=Air France))

Creacuteation et charge-ment du curseur

float moyenneCapaciteacute =0int nbAvions = 0while ( ) Systemoutprint(Immat + Systemoutprintln(Capaciteacute + moyenneCapaciteacute += curseurJavagetInt(2) nbAvions ++ moyenneCapaciteacute = nbAvions Systemoutprintln(Capaciteacute moy +moyenneCapaciteacute)

Parcours du curseur

Extraction de colonnes

Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

ResultSet curseurJavaetatSimpleexecuteQuery

curseurJavanext()curseurJavagetString(1))

curseurJavagetInt(2))

curseurJavaclose()

4055_08_C08 Page 302 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 303

chapitre ndeg 8 Utilisation avec Java

Curseurs navigables

Un curseur ResultSet deacuteclareacute sans option nrsquoest ni navigable ni modifiable Seul un deacuteplace-ment du deacutebut vers la fin (par la meacutethode next) est admis Il est possible de rendre un curseurnavigable en permettant de le parcourir en avant ou en arriegravere et en autorisant lrsquoaccegraves direct agraveun enregistrement drsquoune maniegravere absolue (en partant du deacutebut ou de la fin du curseur) ou rela-tive (en partant de la position courante du curseur) On peut aussi rendre un curseur modifiable(la base pourra ecirctre changeacutee par lrsquointermeacutediaire du curseur)

Degraves lrsquoinstant ougrave on deacuteclare un curseur navigable il faut aussi statuer sur le fait qursquoil soit modi-fiable ou pas (section suivante) La nature du curseur est expliciteacutee agrave lrsquoaide drsquooptions de lameacutethode createStatement

Statement createStatement(int typeCurseur int modifCurseur)

Constantes

Les valeurs permises du premier paramegravetre (typeCurseur) et qui concernent le sens deparcours sont preacutesenteacutees dans le tableau suivant

Un curseur est sensible degraves que des mises agrave jour de la table sont automatiquement reacutepercu-teacutees au niveau du curseur durant la transaction Lorsqursquoil est deacuteclareacute insensible les modifica-tions de la table ne sont pas renvoyeacutees dans le curseur

Meacutethodes

Les principales meacutethodes que lrsquoon peut appliquer agrave un curseur navigable sont les suivantesLes deux premiegraveres sont aussi des meacutethodes de lrsquointerface Statement qui affectent et preacuteci-sent le sens de parcours pour tous les curseurs de lrsquoeacutetat donneacute

Tableau 8-18 Constantes de navigation drsquoun curseur

Constante Explication

ResultSetTYPE_FORWARD_ONLY Le parcours du curseur srsquoopegravere invariablement du deacutebut agrave la fin (non navigable)

ResultSetTYPE_SCROLL_INSENSITIVE Le curseur est navigable mais pas sensible aux modifica-tions

ResultSetTYPE_SCROLL_SENSITIVE Le curseur est navigable et sensible aux modifications

4055_08_C08 Page 303 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

304 copy Eacuteditions Eyrolles

ConnectorJ de MySQL ne permet pas encore de changer le sens de parcours drsquoun curseur auniveau de lrsquoeacutetat et au niveau du curseur lui-mecircme (seule la constante ResultSetFETCH_FORWARD est interpreacuteteacutee) Aucune erreur nrsquoa lieu agrave lrsquoexeacutecution si vous modifiez le sens de par-cours drsquoun curseur la direction restera simplement inchangeacutee (en avant toute )

Ainsi pour parcourir un curseur agrave lrsquoenvers il faudra soit utiliser des indices neacutegatifs (dans lesmeacutethodes absolute et relative) soit employer la meacutethode previous en partant de lafin du curseur (afterLast)

Tableau 8-19 Meacutethodes de navigation dans un curseur

Meacutethode Fonction

void setFetchDirection(int) Affecte la direction du parcours ResultSetFETCH_FORWARD (1000)ResultSetFETCH_REVERSE (1001) ouResultSetFETCH_UNKNOWN (1002)

int getFetchDirection() Extrait la direction courante (une des trois valeurs ci-dessus)

boolean isBeforeFirst() Indique si le curseur est positionneacute avant le premier enregistre-ment (false si aucun enregistrement nrsquoexiste)

void beforeFirst() Positionne le curseur avant le premier enregistrement (aucuneffet si le curseur est vide)

boolean isFirst() Indique si le curseur est positionneacute sur le premier enregistrement(false si aucun enregistrement nrsquoexiste)

boolean isLast() Indique si le curseur est positionneacute sur le dernier enregistrement(false si aucun enregistrement nrsquoexiste)

boolean isAfterLast() Indique si le curseur est positionneacute apregraves le dernier enregistre-ment (false si aucun enregistrement nrsquoexiste)

void afterLast() Positionne le curseur apregraves le dernier enregistrement (aucun effetsi le curseur est vide)

boolean first() Positionne le curseur sur le premier enregistrement (false siaucun enregistrement nrsquoexiste)

boolean previous() Positionne le curseur sur lrsquoenregistrement preacuteceacutedent (false siaucun enregistrement ne preacutecegravede)

boolean last() Positionne le curseur sur le dernier enregistrement (false siaucun enregistrement nrsquoexiste)

boolean absolute(int) Positionne le curseur sur le n-iegraveme enregistrement (en partant dudeacutebut si n est positif ou de la fin si n est neacutegatif false si aucunenregistrement nrsquoexiste agrave cet indice)

boolean relative(int) Positionne le curseur sur le n-iegraveme enregistrement en partant dela position courante (en avant si n est positif ou en arriegravere si n estneacutegatif false si aucun enregistrement nrsquoexiste agrave cet indice)

4055_08_C08 Page 304 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 305

chapitre ndeg 8 Utilisation avec Java

Parcours

Le code suivant (SELECTnavigablejava) preacutesente une utilisation du curseur navigablecurseurNaviJava Le deuxiegraveme test renvoie false car apregraves lrsquoouverture le curseurnrsquoest pas positionneacute sur le premier enregistrement et la meacutethode next le place selon le sensdu parcours du curseur

Creacuteez des curseurs non navigables quand vous voulez rapatrier de tregraves gros volumes de don-neacutees (taille du cache limitative cocircteacute client) Fragmentez vos requecirctes quand vous voulez mani-puler des curseurs navigables Les prochaines versions de MySQL et ConnectorJ devraientprendre en charge une gestion cocircteacute serveur des curseurs navigables

Tableau 8-20 Parcours drsquoun curseur navigable

Code Java Commentaires

try hellipStatement etatSimple =createStatement Creacuteation de

lrsquoeacutetat

ResultSet curseurNaviJava = etatSimpleexecuteQuery(SELECT immattypeAvioncap FROM Avion)

Creacuteation et chargement du curseur

if ( ) Systemoutprintln(Curseur positionneacute au deacutebut)

Test renvoyant true

if ( curseurNaviJavaisFirst() ) Systemoutprintln(Curseur positionneacute sur le 1er deacutejagrave)

Test renvoyant false

while( ) if ( ) Systemoutprintln(1er avion ) if ( ) Systemoutprintln(Dernier avion ) Systemoutprint(Immat +curseurNaviJavagetString(1)) Systemoutprintln( type +curseurNaviJavagetString(2))

Parcours du curseur en affi-chant les pre-mier et dernier enregistre-ments

if ( )Systemoutprintln(Curseur positionneacute apregraves la fin)

Test renvoyant true

if ( ) if ( ) Systemoutprinln(Avant dernier avion + curseurNaviJavagetString(1))

Affiche lrsquoavant-dernier enregis-trement

if ( ) Systemoutprintln(First avion + curseurNaviJavagetString(1))

Affiche le pre-mier enregistre-ment

if ( ) Systemoutprintln(Last avion + curseurNaviJavagetString(1))

Affiche le der-nier enregistre-ment

curseurNaviJavaclose() Ferme le cur-seur

catch(SQLException ex) hellip Gestion des erreurs

Web

(ResultSetTYPE_SCROLL_INSENSITIVEResultSetCONCUR_READ_ONLY)

curseurNaviJavaisBeforeFirst()

curseurNaviJavanext()curseurNaviJavaisFirst()

curseurNaviJavaisLast()

curseurNaviJavaisAfterLast()

curseurNaviJavaprevious()curseurNaviJavaprevious()

curseurNaviJavafirst()

curseurNaviJavalast()

4055_08_C08 Page 305 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

306 copy Eacuteditions Eyrolles

Positionnements

Des meacutethodes assurent lrsquoaccegraves direct agrave un curseur navigable Notez que absolute(1) eacutequi-vaut agrave first() de mecircme absolute(-1) eacutequivaut agrave last() Concernant la meacutethoderelative il faut lrsquoutiliser dans un test pour srsquoassurer qursquoelle srsquoapplique agrave un enregistrementexistant (voir lrsquoexemple suivant) Drsquoautre part lrsquoutilisation de relative(0) nrsquoa aucun effetConsideacuterons la table suivante qui est interrogeacutee au niveau des trois premiegraveres colonnes par lecurseur navigable curseurPosJava

Le code suivant (SELECTPositionsjava) preacutesente les meacutethodes qui permettent drsquoacceacutederdirectement agrave des enregistrements de ce curseur

Figure 8-5 Curseur navigable

Avion

immat typeAvion cap comp

F-FGFB Concorde 95 AF F-GKUB A330 240 AERIF-GLFS A320 140 TAT

F-GLKT A340 300 AERI F-GLZV A330 250 AERI F-WTSS Concorde 90 AF

curseurPosJava

absolute(1)

relative (2)

absolute(-1)

Tableau 8-21 Positionnements dans un curseur navigable

Code Java Commentaires

try hellipStatement etatSimple =createStatement

Creacuteation de lrsquoeacutetat avec cur-seurs insensibles et non modi-fiables

ResultSet curseurPosJava = etatSimpleexecuteQuery(SELECT immattypeAvioncap FROM Avion)

Creacuteation et chargement du cur-seur

Curseur sur le premier avion if ( ) Systemoutprintln(relative(2) + curseurPosJavagetString(1)) else Systemoutprintln(Pas de 3egraveme avion)

Accegraves au troisiegraveme avion

if ( ) Systemoutprintln(relative(-2) + curseurPosJavagetString(1)) else Systemoutprintln(Pas retour -2 possible )

Retour au premier avion

Web

(ResultSetTYPE_SCROLL_INSENSITIVEResultSetCONCUR_READ_ONLY)

curseurPosJavaabsolute(1)curseurPosJavarelative(2)

curseurPosJavarelative(-2)

4055_08_C08 Page 306 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 307

chapitre ndeg 8 Utilisation avec Java

Pour deacutefinir un curseur navigable

bull Une requecircte ne doit pas contenir de jointure

bull Eacutecrivez laquo SELECT a FROM table ahellip raquo agrave la place de laquo SELECT FROM tablehellipraquo

Curseurs modifiables

Un curseur modifiable permet de mettre agrave jour la base de donneacutees transformation de colon-nes suppressions et insertions drsquoenregistrements Les valeurs permises du deuxiegraveme paramegrave-tre (modifCurseur) de la meacutethode createStatement deacutefinie agrave la section preacuteceacutedentesont preacutesenteacutees dans le tableau suivant

Le caractegravere modifiable drsquoun curseur est indeacutependant de sa navigabiliteacute Neacuteanmoins il estcourant qursquoun curseur modifiable soit eacutegalement navigable (pour pouvoir se positionner agrave lademande sur un enregistrement avant drsquoeffectuer sa mise agrave jour)

Pour speacutecifier un curseur de nature CONCUR_UPDATABLE

bull Une requecircte ne doit pas contenir de jointure ni de regroupement elle doit seulement extrairedes colonnes (les fonctions monolignes et multilignes sont interdites)

bull Eacutecrivez laquo SELECT a FROM table ahellip raquo agrave la place de laquo SELECT FROM tablehellip raquo

if ( Systemoutprintln(absolute(-2) + curseurPosJavagetString(1)) else Systemoutprintln(Pas davant dernier avion)

Accegraves agrave lrsquoavant-dernier enre-gistrement

while( ) hellip

Parcours du curseur en sensinverse

curseurPosJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

Tableau 8-21 Positionnements dans un curseur navigable (suite)

Code Java Commentaires

curseurPosJavaabsolute(-2)

curseurPosJavaafterLast()curseurPosJavaprevious()

Tableau 8-22 Constantes de modification drsquoun curseur

Constante Explication

ResultSetCONCUR_READ_ONLY Le curseur ne peut ecirctre modifieacute

ResultSetCONCUR_UPDATABLE Le curseur peut ecirctre modifieacute

4055_08_C08 Page 307 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

308 copy Eacuteditions Eyrolles

Il est aussi possible de deacutefinir un curseur par une requecircte de type SELECThellip FOR UPDATELes principales meacutethodes relatives aux curseurs modifiables sont les suivantes

Les opeacuterations de modification et drsquoinsertion (UPDATE et INSERT) agrave travers un curseur se reacutealisenten deux temps mise agrave jour du curseur puis propagation agrave la table de la base de donneacutees Il suffitainsi de ne pas exeacutecuter la deuxiegraveme eacutetape pour ne pas opeacuterer la mise agrave jour de la base

La suppression drsquoenregistrements (DELETE) agrave travers un curseur srsquoopegravere en une seule instruc-tion qui nrsquoest pas forceacutement valideacutee par la suite il faudra programmer explicitement le commitou laisser le paramegravetre drsquoautocommit agrave true (par deacutefaut)

La figure suivante illustre les modifications effectueacutees sur la table Avion par lrsquointermeacutediairedu curseur CurseurModifJava utiliseacute par les trois programmes Java suivants

Tableau 8-23 Meacutethodes de navigation dans un curseur

Meacutethode Fonction

int getResultSetType() Renvoie le caractegravere navigable des curseurs drsquoun eacutetat donneacute (ResultSetTYPE_FORWARD_ONLYhellip)

int getResultSetConcurrency() Renvoie le caractegravere modifiable des curseurs drsquoun eacutetat donneacute (ResultSetCONCUR_READ_ONLY ouResultSetCONCUR_UPDATABLE)

int getType() Renvoie le caractegravere navigable drsquoun curseur donneacute

int getConcurrency() Renvoie le caractegravere modifiable drsquoun curseur donneacute

void deleteRow() Supprime lrsquoenregistrement courant

void updateRow() Modifie la table avec lrsquoenregistrement courant

void cancelRowUpdates() Annule les modifications faites sur lrsquoenregistrement courant

void moveToInsertRow() Deacuteplace le curseur vers un nouvel enregistrement

void insertRow() Insegravere dans la table lrsquoenregistrement courant

void moveToCurrentRow() Retour vers lrsquoenregistrement courant (agrave utiliser eacuteventuellement apregraves moveToInsertRow)

Figure 8-6 Mises agrave jour drsquoun curseur

Avion

immat typeAvion cap comp

F-FGFB Concorde 95 AF F-GKUB A330rarrA380 240rarr350 AERI F-GLFS A320 140 TAT F-GLKT A340 300 AERI F-GLZV A330 250 AERI F-WTSS Concorde 90 AF F-LUTE TB20 4 NULL

curseurModifJavainsertRow()

deleteRow()

updateRow()

4055_08_C08 Page 308 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 309

chapitre ndeg 8 Utilisation avec Java

Suppressions

Le code suivant (ResultDELETEjava) supprime le troisiegraveme enregistrement du curseur etreacutepercute la mise agrave jour au niveau de la table Avion du scheacutema connecteacute Nous deacuteclarons icice curseur laquo navigable raquo

Le code suivant (ResultDELETE2java) supprime le mecircme enregistrement en supposantson indice a priori inconnu Nous deacuteclarons ici ce curseur laquo non navigable raquo Notez lrsquoutilisa-tion de la meacutethode equals pour comparer deux chaicircnes de caractegraveres

Tableau 8-24 Suppression drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

if ( ) cxcommit() else Systemoutprintln(Pas de 3egraveme avion)

Accegraves direct au troi-siegraveme avion suppres-sion de lrsquoenregistre-ment

curseurModifJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_SCROLL_INSENSITIVEResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

curseurModifJavaabsolute(3)curseurModifJavadeleteRow()

Tableau 8-25 Suppression drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la valida-tion automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

while(curseurModifJavanext()) if (curseurModifJavagetString(1)equals(p_immat))

Accegraves agrave lrsquoenregistrementet suppression

curseurModifJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_FORWARD_ONLYResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

String p_immat = F-GLFS

curseurModifJavadeleteRow()

4055_08_C08 Page 309 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

310 copy Eacuteditions Eyrolles

Modifications

La modification de colonnes drsquoun enregistrement au niveau de la base de donneacutees srsquoopegravere endeux eacutetapes mise agrave jour du curseur par les meacutethodes updatexxx (updater methods) puispropagation des mises agrave jour dans la table par la meacutethode updateRow()

Les meacutethodes updatexxx ont chacune deux signatures Par exemple la meacutethode de modifi-cation drsquoune chaicircne de caractegraveres (valable pour les colonnes CHAR et VARCHAR) est disponibleen raisonnant en fonction soit de la position soit du nom de la colonne du curseur

void updateString(int positionColonne String chaicircne)

void updateString(String nomColonne String chaicircne)

Le code suivant (ResultUPDATEjava) change au niveau de la table Avion deux colonnesdu deuxiegraveme enregistrement du curseur Nous deacuteclarons ici ce curseur laquo sensible raquo pourpouvoir eacuteventuellement visualiser la transformation reacutealiseacutee dans le mecircme programme

Insertions

Lrsquoinsertion drsquoun enregistrement au niveau de la base de donneacutees srsquoopegravere en trois eacutetapes preacuteparation agrave lrsquoinsertion dans le curseur par la meacutethode moveToInsertRow mise agrave jour ducurseur par les meacutethodes updatexxx puis propagation des actualisations dans la table par lameacutethode insertRow Lrsquoeacuteventuel retour agrave lrsquoenregistrement courant se programme agrave lrsquoaide dela meacutethode moveToCurrentRow

Le code suivant (ResultINSERTjava) insegravere un nouvel enregistrement au niveau de latable Avion La quatriegraveme colonne de la table nrsquoest pas indiqueacutee dans le curseur elle est

Tableau 8-26 Modifications drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

if (curseurModifJavaabsolute(2))

cxcommit() else Systemoutprintln(Pas de 2egraveme avion)

Accegraves agrave lrsquoenregistrementPremiegravere eacutetape

Deuxiegraveme eacutetape

Validation

curseurModifJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_SCROLL_SENSITIVEResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

curseurModifJavaupdateString(2A380)curseurModifJavaupdateInt(3350)

curseurModifJavaupdateRow()

4055_08_C08 Page 310 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 311

chapitre ndeg 8 Utilisation avec Java

donc passeacutee agrave NULL au niveau de la table en lrsquoabsence de valeur par deacutefaut deacutefinie dans lacolonne

Gestion des seacutequences

Avant la version 30 de lrsquoAPI JDBC de Sun il nrsquoy avait pas de possibiliteacute laquo standard raquodrsquoextraire la valeur courante drsquoune seacutequence (colonne AUTO_INCREMENT) Avec des ancienspilotes JDBC pour MySQL il eacutetait possible drsquoutiliser une meacutethode speacutecifique de lrsquointerfaceStatement ou drsquoexeacutecuter une requecircte du type SELECT LAST_INSERT_ID() apregraves avoirinseacutereacute un enregistrement Le premier meacutecanisme nrsquoassure pas la portabiliteacute le second nrsquoestpas efficace puisqursquoil oblige agrave inseacuterer une ligne au preacutealable (qursquoon peut toutefois annuleravec un rollback)

Agrave preacutesent JDBC 30 offre deux nouveaux meacutecanismes afin drsquoextraire la valeur courante drsquouneseacutequence AUTO_INCREMENT la meacutethode getGeneratedKeys() ou lrsquoexploitation drsquouncurseur modifiable via la meacutethode insertRow()

Dans tous les cas il nrsquoest pas neacutecessaire drsquoinseacuterer reacuteellement un nouvel enregistrement (annu-lation possible par rollback) En revanche lrsquoexeacutecution de lrsquoajout (par INSERT) est obligatoirepour que MySQL eacutevalue une nouvelle valeur de la seacutequence Cette action est irreacuteversible dansle sens ougrave la seacutequence sera increacutementeacutee qursquoon valide ou non lrsquoajout de lrsquoenregistrement

Tableau 8-27 Insertion drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

cxcommit()

Premiegravere eacutetape

Deuxiegraveme eacutetape

Troisiegraveme eacutetape curseurModifJavaclose() Validation

Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_SCROLL_SENSITIVEResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

curseurModifJavamoveToInsertRow()

curseurModifJavaupdateString(1F-LUTE)curseurModifJavaupdateString(2TB20)curseurModifJavaupdateInt(34)

curseurModifJavainsertRow()

4055_08_C08 Page 311 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

312 copy Eacuteditions Eyrolles

Meacutethode getGeneratedKeysLe code suivant (Sequence1java) insegravere un nouvel enregistrement dans la table Affre-ter (deacutecrite au chapitre 2 section Seacutequences) et reacutecupegravere la valeur courante de la seacutequence agravelrsquoaide de la meacutethode getGeneratedKeys()

Curseur modifiable

Le code suivant (Sequence2java) insegravere un nouvel enregistrement dans la table Affre-ter par un curseur modifiable et reacutecupegravere la valeur courante de la seacutequence agrave lrsquoaide de lameacutethode getInt() appliqueacutee agrave la colonne AUTO_INCREMENT

Tableau 8-28 Reacutecupeacuteration drsquoune seacutequence agrave lrsquoaide drsquoun eacutetat

Code Java Commentaires

try hellip Statement etat = cxcreateStatement (javasqlResultSetTYPE_FORWARD_ONLY javasqlResultSetCONCUR_UPDATABLE) cxsetAutoCommit(false)

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

if (curseurnext()) Systemoutprintln(Valeur de la sequence + curseurgetInt(1)) else Systemoutprintln(Pb sequence ) cxrollback()

Insertion avec lrsquooption dereacutecupeacuteration de cleacute geacuteneacute-reacutee

Extraction de la seacutequence

curseurclose() etatclose() cxclose() Invalidation de lrsquoajoutFermeture des objets

catch(SQLException ex) hellip Gestion des erreurs

Web

etatexecute(INSERT INTO bdsoutouAffreter(compimmatdateAffnbPax)VALUES(AFA1NOW()100)StatementRETURN_GENERATED_KEYS)

ResultSet curseur = etatgetGeneratedKeys()

Tableau 8-29 Reacutecupeacuteration drsquoune seacutequence agrave lrsquoaide drsquoun curseur modifiable

Code Java Commentaires

try hellip Statement etat = cxcreateStatement (javasqlResultSetTYPE_FORWARD_ONLY javasqlResultSetCONCUR_UPDATABLE) cxsetAutoCommit(false)

Creacuteation de lrsquoeacutetat et deacutesac-tivation de la validationautomatique

Web

4055_08_C08 Page 312 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 313

chapitre ndeg 8 Utilisation avec Java

Interface ResultSetMetaData

Lrsquointerface ResultSetMetaData est utile pour retrouver dynamiquement des proprieacuteteacutes destables qui sont manipuleacutees par des curseurs ResultSet Cette interface est inteacuteressante pourprogrammer dynamiquement des requecirctes ou drsquoautres instructions SQL Ces fonctions vontextraire de maniegravere transparente des informations par lrsquointermeacutediaire du dictionnaire des donneacutees

Une fois un curseur ResultSet programmeacute il suffit de lui appliquer la meacutethode getMeta-Data() pour disposer drsquoun objet ResultSetMetaData Le tableau suivant preacutesente lesprincipales meacutethodes disponibles de lrsquointerface ResultSetMetaData

ResultSet curseur = etatexecuteQuery( ) curseurmoveToInsertRow() curseurinsertRow() curseurlast() Systemoutprintln(Valeur de la sequence + ) cxrollback()

Insertion via le curseur

Extraction de la seacutequence

curseurclose() etatclose() cxclose() Invalidation de lrsquoajoutFermeture des objets

catch(SQLException ex) hellip Gestion des erreurs

Tableau 8-29 Reacutecupeacuteration drsquoune seacutequence agrave lrsquoaide drsquoun curseur modifiable (suite)

Code Java Commentaires

SELECTnumAffimmatcompdateAff FROM bdsoutouAffreter

curseurgetInt(1)

Tableau 8-30 Meacutethodes principales de lrsquointerface ResultSetMetaData

Meacutethode Description

int getColumnCount() Retourne le nombre de colonnes du curseur

String getColumnName(int) Retourne le nom de la colonne drsquoun indice donneacute du curseur

int getColumnType(int) Retourne le code du type (selon la classification dejavasqlTypes) de la colonne drsquoun indice donneacute du curseur

String getColumnTypeName(int) Retourne le nom du type SQL de la colonne drsquoun indice donneacutedu curseur

int isNullable(int) Indique si la colonne drsquoun indice donneacute du curseur peut ecirctrenulle (constantes retourneacutees ResultSetMetaDatacolumnNoNullsResultSetMetaDatacolumnNullable ouResultSetMetaDatacolumnNullableUnknown)

int getPrecision(int) Nombre de chiffres avant la virgule de la colonne deacutesigneacutee

int getScale(int) Nombre de deacutecimales de la colonne deacutesigneacutee

String getSchemaName(int) Nom du scheacutema proprieacutetaire de la colonne

String getTableName(int) Nom de la table de la colonne

4055_08_C08 Page 313 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

314 copy Eacuteditions Eyrolles

Comme nous lrsquoavons vu au chapitre 5 MySQL ne renseigne pas encore le nom de catalogueAinsi la meacutethode getSchemaName() nrsquoest pas encore reconnue

Le code suivant (ResulSetMetajava) utilise des meacutethodes de lrsquointerface ResultSet-MetaData sur la base de la requecircte extrayant trois colonnes dans la table Avion

Interface DatabaseMetaDataLrsquointerface DatabaseMetaData est utile pour connaicirctre des aspects plus geacuteneacuteraux de labase de donneacutees cible (version eacutediteur prise en charge des transactionshellip) ou des informa-tions sur la structure de la base (structures des tables et vues preacuterogatives)

Plus de quarante meacutethodes sont proposeacutees par lrsquointerface DatabaseMetaData Le tableausuivant en preacutesente quelques-unes Consultez la documentation du JDK pour en savoir plus

Tableau 8-31 Extraction de meacuteta-informations au niveau drsquoun curseur

Code Java Commentaires

try hellip ResultSet curseurJava=etatSimpleexecuteQuery (SELECT immat typeAvion cap FROM Avion)

Creacuteation du curseur

ResultSetMetaData rsmd =

Creacuteation drsquoun objetResultSetMetaData

int nbCol = rsmdgetColumnCount() nbCol contient 3 String nom2emeCol = rsmdgetColumnName(2) nom2emeCol contient typeAvion String type2emeCol = rsmdgetColumnTypeName(2) type2emeCol contient VARCHAR int codeType2emeCol = rsmdgetColumnType(2) codeType2emeCol contient 12

(code pour VARCHAR) if (rsmdisNullable(1) == ResultSetMetaDatacolumnNoNulls) hellip

Test renvoyant vrai (la premiegravere colonne est la cleacute primaire)

int p1 = rsmdgetPrecision(3) Taille de la colonne cap (renvoie 6 pour un SMALLINT)

int t1 = rsmdgetScale(3) Deacutecimales de la colonne cap (renvoie 0 pour un SMALLINT)

curseurJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

Web

curseurJavagetMetaData()

Tableau 8-32 Meacutethodes principales de lrsquointerface ResultSetMetaData

Meacutethode Description

ResultSet getColumns(StringString String String)

Description de toutes les colonnes drsquoune table drsquounscheacutema donneacute

String getDatabaseProductName() Nom de lrsquoeacutediteur de la base de donneacutees utiliseacutee

String getDatabaseProductVersion() Numeacutero de la version de la base utiliseacutee

4055_08_C08 Page 314 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 315

chapitre ndeg 8 Utilisation avec Java

Le code suivant (MetaDatajava) emploie ces meacutethodes pour extraire des informations agravepropos de la base cible et des objets (tables vues seacutequenceshellip) du scheacutema courant

La trace de ce programme est la suivante (dans notre jeu drsquoexemples)

Objets du schema soutoulocalhost

Nom de lobjet Avion Type TABLE

Nom de lobjet Compagnie Type TABLE

Nom base MySQL

Version base 5015-nt

Supporte les SelectForUpdate

Supporte les Transactions

ResultSet getTables(String String String String[])

Description des tables drsquoun scheacutema donneacute

String getUserName() Nom de lrsquoutilisateur connecteacute (scheacutema courant)

boolean supportsSavepoints() Renvoie true si la base reconnaicirct les points de validation

boolean supportsTransactions() Renvoie true si la base reconnaicirct les transactions

Tableau 8-32 Meacutethodes principales de lrsquointerface ResultSetMetaData (suite)

Meacutethode Description

Tableau 8-33 Extraction de meacuteta-informations au niveau drsquoun scheacutema

Code Java Commentaires

try hellip DatabaseMetaData infoBase = cxgetMetaData() Creacuteation drsquoun objet

DatabaseMetaData ResultSet toutesLesTables =

Systemoutprintln(Objets du schema + )

Creacuteation drsquoun objetResultSet contenant lescaracteacuteristiques du scheacutemacourant

while (toutesLesTablesnext()) Systemoutprint(Nom de lobjet + toutesLesTablesgetString(3)) Systemoutprintln( Type + toutesLesTablesgetString(4))

Parcours du curseur en affi-chant quelques caracteacuteristi-ques

Systemoutprintln(Nom base + ())

Affichage du nom de la base

Systemoutprintln(Version base + ())

Affichage de la version de labase

if ( ()) Systemoutprintln(Supporte les Transactions)

Transactions prises en chargeou pas

toutesLesTablesclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

Web

infoBasegetTables(infoBasegetUserName() null null)

infoBasegetUserName()

infoBasegetDatabaseProductName

infoBasegetDatabaseProductVersioninfoBasesupportsTransactions

4055_08_C08 Page 315 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

316 copy Eacuteditions Eyrolles

Instructions parameacutetreacutees (PreparedStatement)

Lrsquointerface PreparedStatement heacuterite de lrsquointerface Statement et la speacutecialise enpermettant de parameacutetrer des objets (eacutetats preacutepareacutes) repreacutesentant des instructions SQLpreacutecompileacutees Ces eacutetats sont creacuteeacutes par la meacutethode prepareStatement de lrsquointerfaceConnection deacutecrite ci-apregraves La chaicircne de caractegraveres contient lrsquoordre SQL dont les paramegrave-tres srsquoil en possegravede doivent ecirctre indiqueacutes par le symbole laquo raquo

PreparedStatement prepareStatement(String)

Une fois creacuteeacutes ces objets peuvent ecirctre aiseacutement reacuteutiliseacutes pour exeacutecuter agrave la demandelrsquoinstruction SQL en modifiant eacuteventuellement les valeurs des paramegravetres drsquoentreacutee agrave lrsquoaidedes meacutethodes setxxx (setter methods) Le tableau suivant deacutecrit les principales meacutethodes delrsquointerface preparedStatement

Deacutecrivons agrave preacutesent un exemple drsquoappel pour chaque meacutethode de compilation drsquoun ordre para-meacutetreacute On suppose la connexion cx creacuteeacutee

Extraction de donneacutees (executeQuery)

Le code suivant (PrepareSELECTjava) illustre lrsquoutilisation de la meacutethode execute-Query pour extraire les enregistrements de la table Avion

Tableau 8-34 Meacutethodes de lrsquointerface PreparedStatement

Meacutethode Description

ResultSet executeQuery() Exeacutecute la requecircte et retourne un curseur ni navigable nimodifiable par deacutefaut

int executeUpdate() Exeacutecute une instruction LMD (INSERT UPDATE ou DELETE) etretourne le nombre de lignes traiteacutees ou 0 pour les instructionsSQL ne retournant aucun reacutesultat (LDD)

boolean execute() Exeacutecute une instruction SQL et renvoie true si crsquoest une instruc-tion SELECT false sinon

void setNull(int int) Affecte la valeur NULL au paramegravetre de numeacutero et de type (classi-fication javasqlTypes) speacutecifieacutes

void close() Ferme lrsquoeacutetat

4055_08_C08 Page 316 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 317

chapitre ndeg 8 Utilisation avec Java

Mises agrave jour (executeUpdate)

Le code suivant (PrepareINSERTjava) illustre lrsquoutilisation de la meacutethode execute-Update pour inseacuterer lrsquoenregistrement (F-NEW A319 178 AF) dans la table Avion compo-seacutee de quatre colonnes de types CHAR(6) VARCHAR(15) SMALLINT et VARCHAR(4)

Instruction LDD (execute)

Le code suivant (PrepareDELETEjava) illustre lrsquoutilisation de la meacutethode execute poursupprimer un avion dont lrsquoimmatriculation passe en paramegravetre

Tableau 8-35 Extraction de donneacutees par un ordre preacutepareacute

Code Java Commentaires

try hellip String ordreSQL = SELECT immat typeAvion cap FROM Avion

Creacuteation drsquoun eacutetat preacutepareacute

ResultSet curseurJava =

while(curseurJavanext()) hellip

Creacuteation du curseur reacutesultant dela compilation de lrsquoeacutetatParcours du curseur

curseurJavaclose() Fermeture du curseur Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

Web

PreparedStatement eacutetatPreacutepareacute =cxprepareStatement(ordreSQL)

eacutetatPreacutepareacuteexecuteQuery()

eacutetatPreacutepareacuteclose()

Tableau 8-36 Insertion drsquoun enregistrement par un ordre preacutepareacute

Code Java Commentaires

try hellip String ordreSQL = INSERT INTO Avion VALUES ( )

Creacuteation drsquoun eacutetat preacutepareacute

Passage des paramegravetres

Systemoutprintln( + avion inseacutereacute)

Exeacutecution de lrsquoinstruction

Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

Web

PreparedStatement eacutetatPreacutepareacute =cxprepareStatement(ordreSQL)

eacutetatPreacutepareacutesetString(1 F-NEW)eacutetatPreacutepareacutesetString(2 A319)eacutetatPreacutepareacutesetInt(3 178)eacutetatPreacutepareacutesetString(4 AF)

eacutetatPreacutepareacuteexecuteUpdate()

eacutetatPreacutepareacuteclose()

4055_08_C08 Page 317 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

318 copy Eacuteditions Eyrolles

Il nrsquoest pas possible de parameacutetrer des instructions SQL du LDD (CREATE ALTERhellip) Pourreacutesoudre ce problegraveme il faut construire dynamiquement la chaicircne (String) qui contient lrsquoins-truction agrave lrsquoaide de lrsquoopeacuterateur de concateacutenation Java (+) Cette chaicircne sera ensuite lrsquouniqueparamegravetre de la meacutethode prepareStatement

Proceacutedures catalogueacutees

Lrsquointerface CallableStatement permet drsquoappeler des sous-programmes (fonctions ouproceacutedures catalogueacutees) en passant drsquoeacuteventuels paramegravetres en entreacutee et en en reacutecupeacuterant ensortie Lrsquointerface CallableStatement speacutecialise lrsquointerface PreparedStatement Lesparamegravetres drsquoentreacutee sont affecteacutes par les meacutethodes setxxx Les paramegravetres de sortie (deacutefinisOUT au niveau du sous-programme) sont extraits agrave lrsquoaide des meacutethodes getxxx Ces eacutetats quipermettent drsquoappeler des sous-programmes sont creacuteeacutes par la meacutethode prepareCall delrsquointerface Connection deacutecrite ci-apregraves

CallableStatement prepareCall(String)

Le tableau suivant deacutecompose le paramegravetre de cette meacutethode (deux eacutecritures sont possibles)Chaque paramegravetre est indiqueacute par un symbole laquo raquo

Tableau 8-37 Insertion drsquoun enregistrement par un ordre preacutepareacute

Code Java Commentairestry hellip cxsetAutoCommit(false) String ordreSQL = DELETE FROM Avion WHERE immat = Creacuteation drsquoun eacutetat preacutepareacute Passage du paramegravetreif ( ) Systemoutprintln(Enregistrement sup-primeacute) cxcommit()

Exeacutecution de lrsquoinstruction

Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

Web

PreparedStatement eacutetatPreacutepareacute =cxprepareStatement(ordreSQL)

eacutetatPreacutepareacutesetString(1 F-NEW )eacutetatPreacutepareacuteexecute()

eacutetatPreacutepareacuteclose()

Tableau 8-38 Paramegravetre de prepareCall

Type du sous-programme Paramegravetre

Fonction = call nomFonction( [ ] )

Proceacutedure call nomProceacutedure( [ ] )

4055_08_C08 Page 318 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 319

chapitre ndeg 8 Utilisation avec Java

Une fois lrsquoeacutetat creacuteeacute il faut reacutepertorier le type des paramegravetres de sortie (meacutethode register-OutParameter) passer les valeurs des paramegravetres drsquoentreacutee appeler le sous-programme etanalyser les reacutesultats Le tableau suivant deacutecrit les principales meacutethodes de lrsquointerfaceCallableStatement

Exemple

Le programme JDBC suivant (CallableProcedurejava) deacutecrit lrsquoappel de la proceacutedureleNomCompagnieEst (ayant deux paramegravetres) Le premier indique lrsquoavion de la compagnierechercheacute le second contient le reacutesultat (nom de la compagnie)

CREATE PROCEDURE bdsoutouleNomCompagnieEst

BEGIN

DECLARE flagNOTFOUND BOOLEAN DEFAULT 0

BEGIN

DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND =1

SELECT nomComp INTO p_nomcomp FROM Compagnie

WHERE comp = (SELECT compa FROM Avion WHERE immat = p_immat)

END

IF flagNOTFOUND THEN

SET p_nomcomp = NULL

END IF

END

Le tableau suivant deacutecrit les eacutetapes neacutecessaires agrave lrsquoappel de cette proceacutedure (qui ne gegravere pas leseacuteventuelles erreurs) pour lrsquoavion drsquoimmatriculation F-GLFS

Tableau 8-39 Meacutethodes de lrsquointerface CallableStatement

Meacutethode Description

ResultSet executeQuery() Idem PreparedStatement

int executeUpdate() Idem PreparedStatement

boolean execute() Idem PreparedStatement

void registerOutParameter(int int)

Transfegravere un paramegravetre de sortie agrave un indice donneacute drsquountype Java (classification javasqlTypes)

boolean wasNull() Deacutetermine si le dernier paramegravetre de sortie extrait est agraveNULL Cette meacutethode doit ecirctre seulement invoqueacuteeapregraves une meacutethode de type getxxx

(IN p_immat CHAR(6)OUT p_nomcomp VARCHAR(25))

4055_08_C08 Page 319 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

320 copy Eacuteditions Eyrolles

La trace de lrsquoappel de cette proceacutedure est la suivante

Compagnie de F-GLFS Transport Air Tour

Pensez sous root agrave donner les privilegraveges neacutecessaires agrave lrsquoutilisateur qui va lancer le sous-pro-gramme via Java (pour mon test jrsquoai ducirc lancer GRANT EXECUTE ON bdsoutou TO sou-toulocalhost et GRANT SELECT ON mysqlproc TO soutoulocalhost) Sivous ne le faites pas JDBC vous rappellera clairement agrave lrsquoordre

Transactions

JDBC supporte le mode transactionnel qui consiste agrave valider tout ou une partie drsquoun ensembledrsquoinstructions Nous avons deacutejagrave deacutecrit agrave la section Interface Connection les meacutethodes quipermettent agrave un programme Java de coder des transactions (setAutoCommit commit etrollback)

Par deacutefaut chaque instruction SQL est valideacutee (on parle drsquoautocommit) Lorsque ce mode estdeacutesactiveacute il faut geacuterer manuellement les transactions avec commit ou rollback

Quand le mode autocommit est deacutesactiveacute

bull La deacuteconnexion drsquoun objet Connection (par la meacutethode close) valide implicitement latransaction (mecircme si commit nrsquoa pas eacuteteacute invoqueacute avant la deacuteconnexion)

bull Chaque instruction du LDD (CREATE ALTER DROP) valide implicitement la transaction

Tableau 8-40 Appel drsquoune proceacutedure (paramegravetre en entreacutee et sortie)

Code Java Commentaires

String CallableStatement eacutetatAppelable =

Creacuteation drsquoun eacutetat appelable

Deacuteclaration du paramegravetre de sortie

Passage du paramegravetre drsquoentreacutee Exeacutecution de la proceacutedure Systemoutprint(Compagnie de F-GLFS + Extraction du reacutesultat

Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

WebordreSQL =

call bdsoutouleNomCompagnieEst()

cxprepareCall(ordreSQL)eacutetatAppelableregisterOutParameter

(2javasqlTypesVARCHAR)eacutetatAppelablesetString(1F-GLFS)eacutetatAppelableexecute()

eacutetatAppelablegetString(2))eacutetatAppelableclose()

4055_08_C08 Page 320 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 321

chapitre ndeg 8 Utilisation avec Java

Points de validation

Depuis la version 30 de JDBC (JDK 14) on peut inclure des points de validation et affinerainsi la programmation des transactions Les interfaces Connection et Savepoint rendentpossible cette programmation

Interface Connection

Le tableau suivant preacutesente les meacutethodes de lrsquointerface Connection qui sont relatives auprincipe des points de validation

Interface Savepoint

Les points de validation sont anonymes (identifieacutes toutefois par un entier) ou nommeacutes Letableau suivant preacutesente les deux seules meacutethodes de lrsquointerface Savepoint

Le code suivant (TransactionJDBCjava) illustre une transaction deacutecoupeacutee en deuxphases par deux points de validation Dans notre exemple nous validons seulement lapremiegravere partie (seul lrsquoavion F-NEW2 sera inseacutereacute dans la table) On suppose la connexion cxcreacuteeacutee

Tableau 8-41 Meacutethodes concernant les points de validation de lrsquointerface Connection

Meacutethode Description

Savepoint setSavepoint() Positionne un point de validation anonyme et retourne unobjet Savepoint

Savepoint setSavepoint(String) Positionne un point de validation nommeacute et retourne unobjet Savepoint

void releaseSavepoint(Savepoint) Supprime le point de validation de la transaction courante

void rollback(Savepoint) Invalide la transaction agrave partir du point de validation

Tableau 8-42 Meacutethodes de lrsquointerface Savepoint

Meacutethode Description

int getSavepointId() Retourne lrsquoidentifiant du point de validation de lrsquoobjet Savepoint

String getSavepointName() Retourne le nom du point de validation de lrsquoobjet Savepoint

4055_08_C08 Page 321 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

322 copy Eacuteditions Eyrolles

Traitement des exceptions

Les exceptions qui ne sont pas traiteacutees dans les sous-programmes appeleacutes ou celles que lessous-programmes ou deacuteclencheurs peuvent retourner doivent ecirctre prises en compte au niveaudu code Java (dans un bloc tryhellip catch) Le bloc drsquoexceptions permet de programmer destraitements en fonction des codes drsquoerreur renvoyeacutes par la base Oracle Plusieurs blocsdrsquoexceptions peuvent ecirctre imbriqueacutes dans un programme JDBC

Afin de geacuterer les erreurs renvoyeacutees par le SGBD JDBC propose la classe SQLExceptionqui heacuterite de la classe Exception Chaque objet (automatiquement creacuteeacute degraves la premiegravereerreur) de cette classe dispose des meacutethodes suivantes

Tableau 8-43 Points de validation

Code Java Commentaires

try hellip cxsetAutoCommit(false) String ordreSQL = INSERT INTO Avion VALUES ( ) PreparedStatement eacutetatPreacutepareacute = cxprepareStatement(ordreSQL)

Deacutesactivation de lrsquoautocommit

Creacuteation drsquoun eacutetat appelableCreacuteation du point de validation P1

eacutetatPreacutepareacutesetString(1 F-NEW2) hellip if ( eacutetatPreacutepareacuteexecute() ) Systemoutprintln(F-NEW2 inseacutereacute)

Passage de paramegravetres et premiegravere insertion

Creacuteation du point de validation P2 eacutetatPreacutepareacutesetString(1 F-NEW3) hellip if ( eacutetatPreacutepareacuteexecute() ) Systemoutprintln(F-NEW3 inseacutereacute)

Passage de paramegravetres et deuxiegraveme insertion

Annulation de la deuxiegraveme partie cxcommit() Validation de la premiegravere partie cxclose() Fermeture de la connexion catch(SQLException ex) hellip Gestion des erreurs

Web

Savepoint p1 = cxsetSavepoint(P1)

Savepoint p2 = cxsetSavepoint(P2)

cxrollback(p2)

Tableau 8-44 Meacutethodes de la classe SQLException

Meacutethode Description

String getMessage() Message deacutecrivant lrsquoerreur

String getSQLState() Code erreur SQL Standard (XOPEN ou SQL99)

int getErrorCode() Code erreur SQL de la base

SQLException getNextException() Chaicircnage agrave lrsquoexception suivante (si une erreur renvoie plu-sieurs messages)

4055_08_C08 Page 322 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 323

chapitre ndeg 8 Utilisation avec Java

Affichage des erreurs

Le code suivant (Exceptions1java) illustre une maniegravere drsquoafficher explicitement toutesles erreurs sans effectuer drsquoautres instructions

Traitement des erreurs

Il est possible drsquoassocier des traitements agrave chaque erreur reacutepertorieacutee avant lrsquoexeacutecution duprogramme On peut appeler des meacutethodes de la classe principale ou coder directement dansle bloc des exceptions

Le code suivant (Exceptions2java) insegravere un enregistrement dans la table Avion en geacuterantun certain nombre drsquoexceptions possibles Le premier bloc des exceptions permet drsquoafficher unmessage personnaliseacute pour chaque type drsquoerreur preacutealablement reacutepertorieacute (duplication de cleacuteprimaire mauvais nombre ou type de colonneshellip) Si lrsquoavion agrave inseacuterer nrsquoest pas rattacheacute agrave unecompagnie existante (contrainte reacutefeacuterentielle) exception 1452-Cannot add or update achild row a foreign key constraint fails) Le dernier bloc drsquoexceptions afficheune erreur qui nrsquoa pas eacuteteacute preacutevue par le programmeur (erreur systegraveme ou de syntaxe danslrsquoinstruction par exemple)

Tableau 8-45 Affichage des erreurs

Code Java Commentaires

import javasqlpublic class Exceptions1 public static void main (String args []) throws SQLException Exception try ClassforName (commysqljdbcDriver)newInstance() catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement+extoString()) try Connection cx = DriverManagergetConnection( cxclose()

Classe principale

Chargement du pilote

Connexion

Instructionshellip

Systemerrprintln(Erreur) while ((ex = null)) Systemerrprintln(Statut + ) Systemerrprintln(Message + ) Systemerrprintln(Code base + ) ex =

Gestion des erreurs

Web

catch(SQLException ex)

exgetSQLState()exgetMessage()exgetErrorCode()

exgetNextException()

4055_08_C08 Page 323 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

324 copy Eacuteditions Eyrolles

Tableau 8-46 Traitement des exceptions

Code Java Commentaires

try Connection cx = DriverManagergetConnection(hellip) String ordreSQL = INSERT INTO bdsoutouAvion VALUES (F-NOUVA310 5600 AF) PreparedStatement eacutetatPreacutepareacute = cxprepareStatement(ordreSQL) Systemoutprintln(eacutetatPreacutepareacuteexecuteUpdate() + avion insere en base) cxclose()

Instructions du main

catch(SQLException ex) if ( ) Systemoutprintln(Avion deacutejagrave existant)

Non unique

else if ( ) Systemoutprintln(Nom de base inconnu)

Mauvais nom de base

else if ( ) Systemoutprintln(Trop ou pas assez de valeurs)

Mauvais nombre de colon-nes

else if ( ) Systemoutprintln(Nom de table inconnue)

Mauvais nom de table

else if (( ) ampamp ( )) Systemoutprintln(Valeur trop longue ou valeur trop importante)

Mauvais type de colonnes

else if ( ) Systemoutprintln(Compagnie inconnue a inserer avec lavion)

Cleacute eacutetrangegravere absente

else Systemerrprintln(Erreur) while ((ex = null)) Systemerrprintln(Statut + exgetSQLState()) Systemerrprintln(Message + exgetMessage()) Systemerrprintln(Code Erreur base + exgetErrorCode()) ex = exgetNextException()

Gestion des autres erreurs

Web

exgetErrorCode() == 1062

exgetErrorCode() == 1044

exgetErrorCode() == 1136

exgetErrorCode() == 1146

exgetSQLState() == 01004exgetErrorCode() == 0

exgetErrorCode() == 1452

4055_08_C08 Page 324 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 325

chapitre ndeg 8 Utilisation avec Java

Exercices

Lrsquoobjectif de ces exercices est de deacutevelopper des meacutethodes de la classe Java ExoJDBC pourextraire et mettre agrave jour des donneacutees des tables du scheacutema Parc informatique

81 Curseur statique

Eacutecrire les meacutethodes

bull ArrayList getSalles() qui retourne sous la forme drsquoune liste les enregistrements de latable Salle

bull main qui se connecte agrave la base appelle la meacutethode getSalles et affiche les reacutesultats (exempledonneacute ci-dessous)

nSalle nomSalle nbPoste indIP

------------------------------------------

s01 Salle 1 3 13012080

s02 Salle 2 2 13012080

hellip

Ajoutez une nouvelle salle dans la table Salle dans lrsquointerface de commande et lancez agrave nouveau leprogramme pour veacuterifier

82 Curseur modifiable

Eacutecrivez la meacutethode void deleteSalle(int) qui supprime de la table Salle lrsquoenregistrement derang passeacute en paramegravetre Vous utiliserez la meacutethode deleteRow appliqueacutee agrave un curseur modifiableAppelez dans le main cette meacutethode pour supprimer lrsquoenregistrement de la table Salle que vousavez ajouteacute en test dans lrsquoexercice preacuteceacutedent Si lrsquoenregistrement est rattacheacute agrave un enregistrement filsne forcez pas la contrainte reacutefeacuterentielle contentez-vous drsquoafficher le message drsquoerreur 1451 renvoyeacutepar MySQL dans le bloc des exceptions

4055_08_C08 Page 325 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

326 copy Eacuteditions Eyrolles

83 Appel drsquoun sous-programme

Compiler dans votre base la proceacutedure catalogueacutee supprimeSalle(IN ns VARCHAR(7)OUTres TINYINT) qui supprime une salle dont le numeacutero est passeacute en premier paramegravetre

CREATE PROCEDURE supprimeSalle(IN ns VARCHAR(7)OUT res TINYINT)

BEGIN

DECLARE ligne VARCHAR(20)

DECLARE EXIT HANDLER FOR NOT FOUND SET res = -1

DECLARE EXIT HANDLER FOR SQLEXCEPTION SET res = -2

SELECT nomSalle INTO ligne FROM Salle WHERE nSalle = ns

DELETE FROM Salle WHERE nsalle = ns

SET res = 0

COMMIT

END

La proceacutedure retourne en second paramegravetre

bull 0 si la suppression srsquoest deacuterouleacutee correctement

bull -1 si le code de la salle est inconnu

bull -2 si la suppression est impossible (contraintes reacutefeacuterentielles)

Eacutecrire la meacutethode Java int deleteSalleSP(String) qui appelle le sous-programme suppri-meSalle Essayer les diffeacuterents cas drsquoerreurs en appelant cette meacutethode drsquoabord avec un numeacutero desalle reacutefeacuterenceacute par un poste de travail et ensuite avec un numeacutero de salle inexistant Penser agrave donneragrave lrsquoutilisateur le privilegravege en exeacutecution sur cette proceacutedure

4055_08_C08 Page 326 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

327

Chapitre 9

Utilisation avec PHP

Ce chapitre deacutetaille les moyens de faire interagir un programme PHP 5 avec une base MySQLPHP propose deux extensions (API) qui sont

mysql

et

msqli

La premiegravere convient agrave desbases MySQL de version anteacuterieure agrave 41 Nous deacutetaillerons donc lrsquoextension

mysqli

quicorrespond toutefois agrave des bases plus anciennes (jusqursquoagrave la version 322) Pour plus de deacutetailsconsultez une documentation en ligne mise agrave jour (httpwwwnexennetdocsphpanno-teerefmysqliphp)

Configuration adopteacutee

Plusieurs configurations sont possibles en fonction de la version de PHP utiliseacutee de la versiondrsquoApache et de celle de MySQL Nous avons opteacute pour faire interagir un programme PHP 5avec une base MySQL 5 sous Apache 13 Je deacutecris ici une proceacutedure minimale sans plusdrsquoexplication Vous trouverez sur le Web de nombreuses ressources agrave ce sujet

Logiciels

Reacutecupeacuterez et installez Apache (wwwapacheorg) Lancez Apacheexe srsquoil nrsquoest pas automati-quement lanceacute apregraves lrsquoinstallation Testez le service dans le navigateur en fonction du nom deserveur que vous avez speacutecifieacute agrave lrsquoinstallation (httpcamparols dans mon cas)

Installez PHP (httpwwwphpnetdownloadsphp) en deacutezippant le fichier teacuteleacutechargeacute dans unreacutepertoire personnel (CPHP dans mon cas)

Fichiers de configuration

Dans le fichier

httpdconf

(situeacute dans

CProgram FilesApache GroupApacheconfhttpdconf

dans mon cas) modifiez ou ajoutez les lignes suivantes (le laquo raquo deacutesigneun commentaire)

modif pour MySQL et PHP ici 9999 par exemple

Port 9999

hellip

4055_09_C09 Page 327 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

328

copy Eacuteditions Eyrolles

Ajout pour PHP

LoadModule php5_module cphpphp5apachedll

hellip

Ajout pour PHP

AddModule mod_php5c

SEtEnv PHPRC Cphp

AddType applicationx-httpd-php php

hellip

DirectoryIndex indexhtml indexphp

hellip

Ajout pour MySQL reacutepertoire contenant les sources php (pas

daccent dans les noms de reacutepertoire)

DocumentRoot DdevPHP-MySQL

Dans le fichier

phpini

(se trouvant dans

CWINDOWS

dans mon cas) ajoutez les lignessuivantes (le laquo raquo deacutesigne un commentaire)

Paths and Directories

extension_dir = CPHPext

Dynamic Extensions

extension=php_mysqlidll

Copiez le fichier

libmysqldll

qui se situe dans le reacutepertoire de PHP (

CPHP

dans moncas) dans le reacutepertoire de Windows (

CWINDOWS

dans mon cas)

Test drsquoApache et de PHP

Eacutecrivez le programme suivant (

indexphp

) et disposez-le dans le reacutepertoire contenant lessources PHP (

DdevPHP-MySQL

dans mon cas)

lthtmlgt ltheadgt lttitlegttest Apache 13 PHP5 lttitlegt ltheadgt

ltbodygt

Test de la configuration Apache 13 - PHP5 - Livre MySQL - C Sou-

tou

ltphp

phpinfo()

gt

ltbodygt lthtmlgt

Pour tester votre serveur arrecircter puis relancer Apache Dans le navigateur saisir lrsquoURL devotre serveur sur le port concerneacute (

httpcamparols9999

dans mon cas) qui doitlancer le programme

indexphp

Vous devez voir lrsquoaffichage preacuteceacutedent suivi de la configu-ration actuelle de PHP (reacutesultat de la fonction systegraveme PHP

phpinfo

)

4055_09_C09 Page 328 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

329

chapitre ndeg 9 Utilisation avec PHP

Test drsquoApache de PHP et de MySQL

Il faut que le serveur MySQL soit deacutemarreacute (veacuterifiez dans

Services

agrave partir du panneau deconfiguration) Eacutecrivez le programme

cx1php

suivant et disposez-le dans le reacutepertoirecontenant les sources PHP Renseignez le nom drsquoutilisateur MySQL le mot de passe et le nomde la base Ici je lance une connexion agrave la base du dictionnaire des donneacutees puis je seacutelectionnepar la suite la base

bdsoutou

ltphpif (($service= )gt0) print Connexion reacuteussie avec ltBgtsoutoultBgt sur information_schema de localhost if (($usebdsoutou = ) gt 0) print ltBRgt La base est deacutesormais ltBgtbdsoutoultBgt else print ltBRgt Seacutelection impossible sur ltBgtbdsoutoultBgt print ltBRgt Fermeture de la connexion else print ltBRgt La connexion est un eacutechec

gt

Tester ce programme dans le navigateur (

httpcamparols9999cx1php

dans moncas) Vous devez obtenir un reacutesultat analogue

API de PHP pour MySQL

Depuis PHP 5 le preacutefixe des fonctions de la derniegravere extension est deacutesormais laquo

msqli_

raquoAvec cette nouvelle API de nouvelles fonctions apparaissent elles concernent principalementles eacutetats preacutepareacutes (

prepared statements

) la possibiliteacute drsquoappeler des proceacutedures catalogueacutees etelles prennent en charge la programmation objet (classes) de PHP Nous nrsquoeacutetudierons pas icice mode de deacuteveloppement en restant dans une programmation proceacutedurale (des compleacutementsseront mis en ligne)

Figure 9-1

Test drsquoune connexion

mysqli_connect(localhostsoutouiutinformation_schema)

mysqli_select_db($servicebdsoutou)

mysqli_close($service)

4055_09_C09 Page 329 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

330

copy Eacuteditions Eyrolles

Connexion

La fonction

mysqli_connect

retourne un identifiant de connexion utiliseacute par la majoriteacutedes appels agrave la base Les fonctions

mysqli_close

mysqli_select_db

et

mysqli_change_user

renvoient

TRUE

en cas de succegraves

FALSE

en cas drsquoerreur Une connexion seferme implicitement en fin de programme mecircme si elle nrsquoa pas eacuteteacute clocirctureacutee explicitement

Interactions avec la base

La majoriteacute des traitements SQL lorsqursquoils incluent des paramegravetres srsquoeffectuent comme suit connexion (

connect

) preacuteparation de lrsquoordre (

parse

) association des paramegravetres agrave lrsquoordre SQL(

bind

) exeacutecution dudit ordre (

execute

) lecture des lignes (pour les

SELECT

fetch

) et libeacutera-tion des ressources (

free

et

close

) apregraves une eacuteventuelle validation de la transaction courante(

commit

ou

rollback

)

Preacuteparation exeacutecution

La fonction

msqli_prepare

preacutepare lrsquoordre SQL puis retourne un identifiant drsquoeacutetat qui peutecirctre utiliseacute notamment par les fonctions

mysqli_stmt_bind_param

et

mysqli_stmt_execute

La fonction

msqli_prepare

retourne

FALSE

dans le cas drsquoune erreur mais nevalide ni seacutemantiquement ni syntaxiquement lrsquoordre SQL Il faudra attendre pour cela sonexeacutecution par

mysqli_stmt_execute

La fonction

mysqli_stmt_execute

exeacutecute un ordre SQL preacutepareacute (renvoie

TRUE

en casde succegraves

FALSE

sinon) Le mode par deacutefaut est

auto

-

commit

Pour la programmation detransactions deacutesactiver ce mode (avec

mysqli_autocommit

) puis valider explicitementpar

mysqli_commit

La fonction

mysqli_stmt_fetch exeacutecute pas agrave pas une requecircte preacutepareacutee (retourne TRUEen cas de succegraves FALSE sinon)

Tableau 9-1 Fonctions de connexion et de deacuteconnexion

Nom de la fonction Paramegravetres

ressource mysqli_connect(stringserveur string utilisateur string motpasse [string nomBase])

Nom du serveur utilisateur mot de passe nom de la base eacuteventuellement Retourne FALSE en cas drsquoerreur

boolean mysqli_close(ressourceconnexion)

Ferme la connexion dont lrsquoidentifiant passe en paramegravetre

boolean mysqli_select_db(ressource connexion string nomBase)

Modifie la seacutelection de la base de la connexion dont lrsquoidentifiant passe en paramegravetre

boolean mysqli_change_user(ressource connexion string utilisateur string motpasse string nomBase)

Modifie lrsquoutilisateur et la base de la connexion dont lrsquoidentifiant passe en paramegravetre

4055_09_C09 Page 330 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 331

chapitre ndeg 9 Utilisation avec PHP

Validation

Les fonctions mysqli_commit et mysqli_rollback permettent de geacuterer des transactionselles retournent TRUE en cas de succegraves FALSE sinon

Le programme suivant (insert1php) insegravere une nouvelle compagnie (en supposantqursquoaucune erreur nrsquoest retourneacutee de la part de la base) Nous eacutetudierons plus loin commentpasser des paramegravetres agrave une instruction (prepared statement) et comment reacutecupeacuterer au niveaude PHP les erreurs renvoyeacutees par MySQL

Tableau 9-2 Fonctions drsquoanalyse et drsquoexeacutecution

Nom de la fonction Paramegravetres

ressource msqli_prepare(ressourceconnexion string ordreSQL)

Le premier paramegravetre deacutesigne lrsquoidentifiant de la connexion Le second contient lrsquoordre SQL agrave ana-lyser (SELECT INSERT UPDATE DELETE CREATEhellip)

boolean mysqli_stmt_execute(ressource ordreSQL)

Le paramegravetre deacutesigne lrsquoidentifiant drsquoeacutetat agrave exeacutecu-ter (renvoyeacute par prepare)

boolean mysqli_stmt_fetch(ressource ordreSQL)

Affecte aux variables de liaison PHP le reacutesultat drsquoune requecircte preacutepareacutee

Tableau 9-3 Fonctions de validation et drsquoannulation

Nom de la fonction Paramegravetres

boolean mysqli_commit(ressourceconnexion)

Valide la transaction de la connexion en paramegravetre

boolean mysqli_rollback(ressource connexion)

Annule la transaction de la connexion en paramegravetre

Tableau 9-4 Insertion drsquoun enregistrement

Code PHP Commentaires

ltphp if ( ($service = mysqli_connect (localhostsoutouiutbdsoutou)) gt 0)

Connexion

mysqli_autocommit($serviceFALSE) $insert1 = INSERT INTO bdsoutouCompagnie VALUES(ALAir Lib)

Deacutebut de la transactionCreacuteation de lrsquoinstruction

$ordre = Preacutepare lrsquoinsertion if ( ($res = ) gt 0) Exeacutecute lrsquoinsertion print ltBRgt Ajout opeacutereacute Validation

Libegravere les ressources Ferme la connexion else print ltBRgt La connexion est un eacutechecgt

Web

mysqli_prepare($service $insert1)mysqli_stmt_execute($ordre)

mysqli_commit($service)mysqli_stmt_free_result($ordre)

mysqli_close($service)

4055_09_C09 Page 331 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

332 copy Eacuteditions Eyrolles

Si vous souhaitez connaicirctre le nombre de lignes affecteacutees par lrsquoordre SQL utilisez laquo mysqli_stmt_affected_rows($ordre) raquo (voir la section Meacutetadonneacutees)

Constantes preacutedeacutefinies

Les constantes suivantes permettent de positionner des indicateurs jouant le rocircle de paramegrave-tres systegraveme (modes drsquoexeacutecution) au sein drsquoinstructions SQL Nous verrons au long de nosexemples lrsquoutilisation de certaines de ces constantes

Extractions

Les fonctions suivantes permettent drsquoextraire des donneacutees via un curseur que la documenta-tion de PHP appelle tableau On rappelle que MySQL retourne les noms de colonnes toujoursen minuscules Cette remarque inteacuteressera les habitueacutes des tableaux agrave accegraves associatifs(exemple $tab[prenom] prenom eacutetant une colonne extraite drsquoune table)

Tableau 9-5 Constantes preacutedeacutefinies

Constante Commentaires

MYSQLI_ASSOC Utiliseacute par mysqli_fetch_array afin drsquoextraire un associative array comme reacutesultat

MYSQLI_NUM Utiliseacute par mysqli_fetch_array afin drsquoextraire un enumerated array comme reacutesultat

MYSQLI_BOTH Utiliseacute par mysqli_fetch_array afin drsquoextraire un array reconnais-sant agrave la fois le mode associatif et le mode numeacuterique en indices

Tableau 9-6 Fonctions drsquoextraction

Nom de la fonction Paramegravetres

ressource mysqli_query(ressource ordreSQL [ressource connexion])

Exeacutecute la requecircte sur la base de donneacutees en coursRetourne un identifiant de reacutesultat ou FALSE en casdrsquoerreur

array mysqli_fetch_array(ressource idresultat [ int param] )

Retourne un tableau qui contient la ligne du curseursuivante ou FALSE en cas drsquoerreur ou en fin de cur-seur Le tableau est accessible de maniegravere associa-tive ou numeacuterique suivant le paramegravetre param quipeut ecirctre une combinaison de bull MYSQLI_BOTH (par deacutefaut identique agraveMYSQLI_ASSOC + MYSQLI_NUM)

bull MYSQLI_ASSOC pour un tableau agrave accegraves associatif(comme mysqli_fetch_assoc)

bull MYSQLI_NUM pour un tableau agrave accegraves numeacuterique(comme mysqli_fetch_row)

4055_09_C09 Page 332 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 333

chapitre ndeg 9 Utilisation avec PHP

Illustrons agrave partir drsquoexemples certaines utilisations de quelques-unes de ces fonctions

Le programme suivant (select1php) utilise mysqli_fetch_array afin drsquoextraire lesavions de la compagnie de code AF On suppose ici et dans les programmes suivants que laconnexion agrave la base est reacutealiseacutee et se nomme $service Le curseur obtenu est nommeacuteligne il prend en compte les valeurs nulles eacuteventuelles

La fonction mysqli_num_fields renvoie le nombre de colonnes de la requecircte et sasignature est deacutetailleacutee agrave la section Meacutetadonneacutees

array mysqli_fetch_assoc(ressource ordreSQL)

Retourne la ligne du curseur suivante dans untableau associatif ou FALSE en cas drsquoerreur ou enfin de curseur

object mysqli_fetch_object(ressource ordreSQL)

Retourne la ligne du curseur suivante dans un objetPHP ou FALSE en cas drsquoerreur ou en fin de curseur

array mysqli_fetch_row(ressource ordreSQL)

Retourne la ligne du curseur suivante dans untableau numeacuterique ou FALSE en cas drsquoerreur ou enfin de curseur

booleanmysqli_stmt_free_result(ressource ordreSQL)

Libegravere les ressources associeacutees aux curseurs occu-peacutes apregraves mysqli_prepare Retourne TRUE encas de succegraves FALSE dans le cas inverse

Tableau 9-6 Fonctions drsquoextraction

Nom de la fonction Paramegravetres

Tableau 9-7 Extraction agrave lrsquoaide de mysqli_fetch_array

Code PHP Commentaires

$requete = SELECT immatcapacitetypeAvion FROM Avion WHERE compa = AF if ( ($resultat= ) gt 0)

Creacuteation de la requecircte

$ncols = print ltH3gtAvions de la compagnie AFltH3gt print ltTABLE BORDER=1gt

Chargement du curseurObtention du nombre de colonnes

while ($ligne = ) print ltTRgt for ( $i=0$i lt $ncols $i++) print ltTDgt $ligne[$i] ltTDgt print ltTRgt print ltTABLEgt

Parcours des colonnes

Affichage des colonnes

Libeacuteration des ressources

else print ltBRgtLa requecircte est un eacutechec mysqli_close($service)

Fermeture de la connexion

Web

mysqli_query($service $requete)mysqli_num_fields($resultat)

mysqli_fetch_array($resultat)

mysqli_free_result($resultat)

4055_09_C09 Page 333 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

334 copy Eacuteditions Eyrolles

La fonction mysqli_num_rows($resultat) aurait retourneacute 4 (nombre de lignesextraites)

La fonction mysqli_free_result joue le mecircme rocircle que mysqli_stmt_free_result mais srsquoapplique aux instructions SELECT

Vous devez obtenir un reacutesultat analogue (en supposant que la compagnie AF dispose dequatre avions dont un est affecteacute drsquoune capaciteacute nulle)

Le programme suivant (select2php) deacutecrit lrsquoutilisation de la fonction mysqli_fetch_assoc pour extraire tous les Airbus Le tableau associatif obtenu est nommeacute row Lrsquoaccegraves agravechaque cellule de ce tableau est reacutealiseacute agrave lrsquoaide du nom des colonnes

Figure 9-2 Exemple avec mysqli_fetch_array

Tableau 9-8 Extraction agrave lrsquoaide de mysqli_fetch_assoc

Code PHP Commentaires

$requete = SELECT immattypeAvioncapacite FROM Avion WHERE typeAvion LIKE A

Creacuteation de la requecircte

if ( ($resultat= )gt0) print ltH3gtListe des AirbusltH3gt print lttable border=1gtn print lttrgtlttdgtImatriculationlttdgt lttdgtTypelttdgtlttdgtcapacitelttdgt $i=0 while ( ) print lttrgtlttdgt$row[immat] lttdgtlttdgt$row[typeAvion] lttdgtlttdgt$row[capacite]lttdgtlttrgt

Exeacutecution de la requecircte

Parcours du curseurAffichage des colonnes

print lttablegtn mysqli_free_result($resultat)

Libeacuteration des ressources

else print ltBRgtLa requecircte est un eacutechec mysqli_close($service)

Fermeture de la connexion

Web

mysqli_query($service $requete)

$row = mysqli_fetch_assoc($resultat)

4055_09_C09 Page 334 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 335

chapitre ndeg 9 Utilisation avec PHP

Le reacutesultat est le suivant (en supposant que la base ne stocke que trois avions de type Airbus)

Instructions parameacutetreacutees

Les fonctions mysqli_stmt_bind_param et mysqli_stmt_bind_result permettentdrsquoassocier agrave des colonnes MySQL des variables PHP et inversement Ces fonctions retournentTRUE en cas de succegraves FALSE sinon

Extractions

Le programme suivant (select3php) utilise la fonction mysqli_stmt_bind_resultafin drsquoextraire lrsquoimmatriculation et le type de tous les avions (au travers de variables PHP quisont deacutefinies apregraves exeacutecution de la requecircte) Notez lrsquoutilisation des fonctions mysqli_stmt_

Figure 9-3 Exemple avec mysqli_fetch_assoc

Tableau 9-9 Fonctions de passage de paramegravetres

Nom de la fonction Paramegravetres

booleanmysqli_stmt_bind_result(ressource ordreSQL mixed ampvariable1 [mixed ampvariable2hellip])

Le premier paramegravetre est lrsquoidentifiant drsquoeacutetatobtenu apregraves prepare Les paramegravetres suivantslistent les variables PHP de reacuteception

booleanmysqli_stmt_bind_param(ressource ordreSQL string types mixedampvariable1 [mixed ampvariable2hellip])

Le premier paramegravetre est lrsquoidentifiant de reacutesultatobtenu apregraves prepare Le deuxiegraveme paramegravetredeacutecrit les types des variables agrave substituer auxcolonnes Les paramegravetres suivants listent lesvariables PHP en entreacutee

string types Description des types des variables (i pournumeacuterique d pour flottant s pour chaicircne decaractegravere et b pour BLOB) Concateacutener autantde ces caractegraveres qursquoil existe de variables

4055_09_C09 Page 335 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

336 copy Eacuteditions Eyrolles

fetch pour parcourir le reacutesultat de la requecircte ligne apregraves ligne et mysqli_stmt_closepour fermer la requecircte preacutepareacutee

Manipulations

Le programme suivant (insert2php) utilise la fonction mysqli_stmt_bind_param enfaisant passer deux paramegravetres (variables PHP) lors de lrsquoinsertion drsquoune nouvelle compagnieOn retrouve la notion de placeholders (symbole laquo raquo deacutesignant une valeur drsquoune colonnedrsquoune table ou drsquoune vue) eacutetudieacutee au chapitre 7 Notez le second paramegravetre de la fonctionmysqli_stmt_bind_param (laquo ss raquo deacutesigne deux types chaicircnes de caractegraveres)

Tableau 9-10 Extraction preacutepareacutee avec la fonction mysqli_stmt_bind_result

Code PHP Commentaires

$requete = SELECT immattypeAvion FROM bdsoutouAvion$ordre = if ( ($res = ) gt 0)

Deacutefinition et exeacutecution de la requecircte preacutepareacutee

if ( ($resbind = ) gt 0) print ltH4gtListe des avionsltH4gt print ltTABLE BORDER=1gt while ( ) print ltTRgt ltTDgt $imltTDgt print ltTDgt $tyltTDgt ltTRgt print ltTABLEgt else print ltBRgtLa liaison est un eacutechec

Affectation des variables PHP

Parcours de la requecircte

else print ltBRgtLa requete est un eacutechecmysqli_stmt_close($ordre)mysqli_close($service)

Fermeture de la requecircte et de la connexion

Webmysqli_prepare($service$requete)

mysqli_stmt_execute($ordre)

mysqli_stmt_bind_result($ordre$im$ty)

mysqli_stmt_fetch($ordre)

Tableau 9-11 Insertion parameacutetreacutee avec la fonction mysqli_stmt_bind_param

Code PHP Commentaires

mysqli_autocommit($serviceFALSE)$codeComp = CAST$nomComp = Castanet Air$insert2 = $ordre =

Affectation des variables PHPDeacutefinition de lrsquoordre parameacute-treacute

if (( if (($res = ) gt 0) print ltBRgtCompagnie $nomComp inseacutereacutee mysqli_commit($service) mysqli_stmt_free_result($ordre)

Association avec les variables PHPExeacutecution de lrsquoordre

Validation else print ltBRgtLinsertion est un eacutechec

Libeacuteration des ressources

else print ltBRgtProblegraveme au bindmysqli_close($service)

Fermeture de la connexion

Web

INSERT INTO Compagnie VALUES()mysqli_prepare($service $insert2)

mysqli_stmt_bind_param($ordre ss $codeComp$nomComp)) gt 0)

mysqli_stmt_execute($ordre)

4055_09_C09 Page 336 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 337

chapitre ndeg 9 Utilisation avec PHP

Pour toute extraction par SELECT modification par UPDATE ou suppression par DELETE leprincipe agrave adopter est le mecircme

Gestion des seacutequences

La fonction mysqli_insert_id($connexion) retourne la valeur courante de laseacutequence apregraves avoir inseacutereacute un enregistrement dans une table contenant une colonne AUTO_INCREMENT

Le programme suivant (insert3php) insegravere un affregravetement (table deacutecrite aux chapitres 2 et8) agrave la date du jour pour la compagnie de code CAST et lrsquoavion immatriculeacute F-GRTC Onreacutecupegravere la derniegravere valeur de la seacutequence apregraves lrsquoinsertion

Traitement des erreurs

Les fonctions mysqli_errno et mysqli_error permettent de geacuterer les erreurs retourneacuteespar MySQL au niveau de la connexion Les fonctions mysqli_stmt_errno et mysqli_stmt_error sont analogues au niveau drsquoune instruction preacutepareacutee

Le programme suivant (erreur1php) utilise plusieurs de ces fonctions Dans cet exemplela suppression ne se deacuteroule pas correctement du fait de lrsquoexistence drsquoenregistrements laquo fils raquodans la table Avion Il est donc possible de deacuterouter le programme en fonction du codedrsquoerreur MySQL renvoyeacute (comme pour les exceptions des proceacutedures catalogueacutees)

Tableau 9-12 Insertion parameacutetreacutee avec la fonction mysqli_insert_id

Code PHP Commentaires

mysqli_autocommit($serviceFALSE)$codeComp = CAST$immatric = F-GRTC$n = 162$insert3 = INSERT INTO bdsoutouAffreter (compimmatdateAffnbPax) VALUES(SYS-DATE())$ordre = mysqli_prepare($service $insert3)

Affectation des variables PHP

if (( ) gt 0) if (($res = mysqli_stmt_execute($ordre)) gt 0) print ltBRgtAffretement inseacutereacutee sequence mysqli_commit($service) mysqli_stmt_free_result($ordre) else print ltBRgtLinsertion est un eacutechec

Deacutefinition de lrsquoordre parameacutetreacuteAssociation avec les variables PHPExeacutecution de lrsquoordreReacutecupeacuteration de la seacutequenceValidation

Libeacuteration des ressources

else print ltBRgtProblegraveme au bind mysqli_close($service)

Fermeture de la connexion

Web

mysqli_stmt_bind_param($ordre ssi $codeComp)$immatric $n)

mysqli_insert_id($service)

4055_09_C09 Page 337 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

338 copy Eacuteditions Eyrolles

Le reacutesultat est le suivant

Tableau 9-13 Fonctions pour la gestion des erreurs MySQL

Nom de la fonction Paramegravetres

int mysqli_errno(ressourceconnexion)

Retourne le code drsquoerreur du dernier appel agrave la base sur laconnexion deacutesigneacutee dans le paramegravetre (0 si aucune erreurnrsquoest survenue lors du dernier eacutechange)

string mysqli_error(ressourceconnexion)

Retourne le libelleacute de lrsquoerreur lors du dernier eacutechange (chaicircnevide si aucune erreur)

int mysqli_stmt_errno (ressource ordreSQL)

Idem mysqli_errno agrave partir de lrsquoidentifiant drsquoeacutetat deacutesigneacutedans le paramegravetre

string mysqli_stmt_error (ressource ordreSQL)

Idem mysqli_error agrave partir de lrsquoidentifiant drsquoeacutetat deacutesigneacutedans le paramegravetre

string mysqli_connect_error() Retourne le message drsquoerreur drsquoune mauvaise connexion

int mysqli_connect_errno() Retourne le code drsquoerreur drsquoune mauvaise connexion

Tableau 9-14 Gestion drsquoerreurs

Code PHP Commentaires

if ( ($service = mysqli_connect(localhost soutou iut bdsoutou)) gt 0) $delete1 = DELETE FROM bdsoutouCompagnie $ordre = mysqli_prepare($service $delete1) print $delete1

Connexion

Preacuteparation de lrsquoordre if ( ($res = mysqli_stmt_execute($ordre)) gt 0) print ltBRgtSuppression de Compagnie

Exeacutecution

else print ltBRgtltBgtMessage ltBgt print ltBRgtltBgtCode ltBgt mysqli_stmt_free_result($ordre) mysqli_close($service)

Affichage de lrsquoerreurLibeacuteration des ressourcesFermeture de laconnexion

else print Lutilisateur na pu se connecter ltBRgt print ltBgtMessage ltBgt

Erreur de connexion

Web

mysqli_stmt_error($ordre)mysqli_stmt_errno($ordre)

mysqli_connect_error()

Figure 9-4 Exception SQL leveacutee agrave lrsquoaide de PHP

4055_09_C09 Page 338 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 339

chapitre ndeg 9 Utilisation avec PHP

Proceacutedures catalogueacutees

Comme dans tout autre langage hocircte PHP permet drsquoinvoquer des proceacutedures catalogueacutees cocircteacuteserveur Supposons que nous disposions de la proceacutedure augmenteCap qui augmente lacapaciteacute (premier paramegravetre) des avions drsquoune compagnie donneacutee (deuxiegraveme paramegravetre)

CREATE PROCEDURE bdsoutouaugmenteCap(IN nbre TINYINT IN compag CHAR(4))

BEGIN

UPDATE Avion SET capacite = capacite + nbre WHERE compa = compag

END

Paramegravetre en entreacutee

Le code suivant (procedureCatphp) appelle cette proceacutedure afin drsquoaugmenter de 50 lacapaciteacute des avions de la compagnie de code AF en utilisant la fonction mysqli_multi_query Notez lrsquoutilisation des simples guillemets pour les paramegravetres en chaicircnes de caractegraveres

Pensez agrave donner lrsquoautorisation agrave lrsquoutilisateur appelant (ici soutou) drsquoexeacutecuter la proceacutedure (jelrsquoai eacutecrite sous root GRANT EXECUTE ON PROCEDURE bdsoutouaugmenteCap TO sou-toulocalhost$)

Paramegravetre en sortie

Afin de travailler avec des paramegravetres en sortie il est neacutecessaire drsquoutiliser des variables desession Une fois ces variables de session initialiseacutees au retour de lrsquoappel du sous-programmeil faudra extraire chaque valeur agrave lrsquoaide drsquoun SELECT dans une requecircte simple

Le code suivant (procedureCat2php) deacutecrit lrsquoappel de la proceacutedure leNomCompa-gnieEst (deacutecrite au chapitre 8 section Proceacutedures catalogueacutees) ayant deux paramegravetres Le

Web

Tableau 9-15 Appel drsquoune proceacutedure catalogueacutee (paramegravetres drsquoentreacutee)

Code PHP Commentaires

if (($service = mysqli_connect(localhost soutou iut bdsoutou)) gt 0)

Connexion

$nb = 50 $comp = AF if ($result = gt 0) print ltBRgtProceacutedure reacutealiseacutee correctement else print ltBRgtLa proceacutedure est un eacutechec mysqli_close($service)

Initialisation des variables PHP drsquoappel

Appel de la proceacutedure

else print ltBRgtLa connexion est un eacutechec

Fermeture de la connexion

Web

mysqli_multi_query($servicecall bdsoutouaugmenteCap($nb$comp))

mysqli_error($service)

4055_09_C09 Page 339 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

340 copy Eacuteditions Eyrolles

premier (en entreacutee) indique lrsquoavion de la compagnie rechercheacute le second (en sortie) contientle nom de la compagnie

Notez lrsquoutilisation de

la fonction mysqli_multi_query pour appeler la proceacutedure catalogueacutee

la variable de session v_retour pour reacutecupeacuterer le paramegravetre en sortie

la fonction mysqli_query pour extraire la valeur de la variable de session (contenue agravelrsquoindice 0 du tableau reacutesultat car il nrsquoy a ici qursquoune valeur retourneacutee dans le SELECT)

Meacutetadonneacutees

Plusieurs fonctions permettent drsquoextraire des informations en provenance du dictionnaire desdonneacutees (meta data) agrave partir drsquoune instruction SQL Par exemple mysqli_stmt_result_metadata retourne un identifiant de reacutesultat permettant drsquoextraire des meacutetadonneacutees agrave partirdrsquoune requecircte preacutepareacutee La fonction mysqli_fetch_field retourne un objet qui contientles meacutetadonneacutees des colonnes concerneacutees par une requecircte

Citons drsquoautres fonctions comme mysqli_fetch_field_direct et mysqli_fetch_fields qui sont similaires agrave mysqli_fetch_field Une fois lrsquoobjet retourneacute par cettefonction il faut extraire certains de ces champs agrave la demande

Tableau 9-16 Appel drsquoune proceacutedure catalogueacutee (paramegravetre de sortie)

Code PHP Commentaires

if ( ($service = mysqli_connect(localhost soutou iut bdsoutou)) gt 0)

Connexion

$immat = F-GAFU if ($result = gt 0) if ($result2 = ) $ligne = if ($ligne[0] == null) print ltBRgtDeacutesoleacute lavion $immat na pas de compagnie else print ltBRgtLa compagnie de lavion $immat est $ligne[0] mysqli_free_result($result2) else print ltBRgtProblegraveme au retour du paramegravetre mysqli_error($service) else print ltBRgtLa proceacutedure est un eacutechec mysqli_error($service)$result

Initialisation de la variable PHP drsquoappelAppel de la proceacutedure

Extraction de la variable de session

Affichage du reacutesultat

Gestion des erreurs

mysqli_close($service)else print ltBRgtLa connexion est un eacutechec

Fermeture de la connexion

Web

mysqli_multi_query$servicecall bdsoutouleNomCompagnieEst

($immatv_retour))mysqli_query($service

SELECT v_retour)mysqli_fetch_array($result2 MYSQLI_NUM)

4055_09_C09 Page 340 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 341

chapitre ndeg 9 Utilisation avec PHP

Tableau 9-17 Fonctions pour les meacutetadonneacutees

Nom de la fonction Paramegravetres

ressourcemysqli_stmt_result_metadata(ressource ordreSQL)

Le paramegravetre est lrsquoidentifiant drsquoeacutetat obtenu apregravesprepare

object mysqli_fetch_field(ressource ordreSQL)

Le paramegravetre est lrsquoidentifiant de reacutesultat obtenuapregraves mysqli_query ou FALSE si aucune infor-mation nrsquoest renvoyeacutee pour lrsquoordre SQL concerneacute

int mysqli_num_fields(ressource ordreSQL)

Retourne le nombre de colonnes concerneacutees parlrsquoordre SQL Le paramegravetre est lrsquoidentifiant de reacutesul-tat obtenu apregraves mysqli_query

Tableau 9-18 Champs de lrsquoobjet retourneacute par mysqli_fetch_field

Nom du champ Signification

name Nom de la colonne

table Nom de la table agrave laquelle la colonne appartient (si elle nrsquoa pas eacuteteacute calculeacutee)

def Valeur par deacutefaut de la colonne

max_length Taille maximale de la colonne pour le jeu de reacutesultats retourneacute par la requecircte

flags Entier repreacutesentant le bit-flags pour la colonne (codage des contraintes)

type Code du type de donneacutees de la colonne

decimals Nombre de deacutecimales de la colonne

Tableau 9-19 Code du type de donneacutees

Type MySQL Code eacutequivalent

DECIMAL 0

TINYINT 1

SMALLINT 2

INT 3

FLOAT 4

DOUBLE 5

TIMESTAMP 7

BIGINT 8

MEDIUMINT 9

DATE 10

TIME 11

DATETIME 12

YEAR 13

TEXT TINYBLOB TINYTEXT BLOB MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT

252

VARBINARY VARCHAR 253

CHAR BINARY ENUM SET 254

4055_09_C09 Page 341 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

342 copy Eacuteditions Eyrolles

Fonction mysqli_fetch_field

Le programme suivant (meta1php) utilise la fonction mysqli_fetch_field afindrsquoextraire la structure complegravete (en termes de colonnes) drsquoune table

Le reacutesultat est le suivant

Quelques explications

La taille vaut 2 pour la colonne compa car seule la compagnie de code AF est repreacutesen-teacutee dans mon jeu drsquoessai

Tableau 9-20 Extraction de la structure drsquoune table

Code PHP Commentaires

if ( ($res = mysqli_query ($service SELECT FROM bdsoutouAvion)) gt 0) $ncols = print ltH4gtStructure de la table Avion ($ncols colonnes)ltH4gt print lttable border=1gt print lttrgtltthgtNomltthgtltthgtTypeltthgtltthgtTailleltthgt ltthgtFlagltthgtlttrgt

Requecircte

Extraction du nombre decolonnes

while ($obj= ) print lttrgtlttdgt lttdgt lttdgt lttdgt lttdgt lttdgt lttdgt lttdgtlttrgt print lttablegtn

Affichage du nom codedu type taille maximaleet contraintes de chaquecolonne extraite

else print ltBRgtLa requete est un eacutechecmysqli_close($service)

Web

mysqli_num_fields($res)

mysqli_fetch_field($res)$obj-gtname$obj-gttype$obj-gtmax_length$obj-gtflags

Figure 9-5 Extraction de la structure drsquoune table

4055_09_C09 Page 342 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 343

chapitre ndeg 9 Utilisation avec PHP

(rootlocalhost) [bdsoutou] mysqlgt select from avion

+--------+-----------+----------+-------+

| immat | typeAvion | capacite | compa |

+--------+-----------+----------+-------+

| F-GAFU | A320 | 160 | AF |

| F-GLFS | A320 | 170 | AF |

| F-WOWW | A380 | NULL | AF |

| F-WTSS | Concorde | 90 | AF |

+--------+-----------+----------+-------+

Le flag vaut 16 387 pour la colonne immat car cette colonne est une cleacute primaire(ajouter 1) et non nulle (ajouter 2) et elle fait partie drsquoune cleacute (ici primaire ajouter16 384) Ci-apregraves un extrait du fichier mysql_confh Le flag vaut 16 392 pour lacolonne compa car elle fait partie drsquoune cleacute (ici eacutetrangegravere ajouter 16 384) et crsquoest une cleacuteeacutetrangegravere (ajouter 8) etc

Field cant be NULL

Field is part of a primary key define UNIQUE_KEY_FLAG 4 Field is part of a unique key

Field is part of a key define BLOB_FLAG 16 Field is a blob define UNSIGNED_FLAG 32 Field is unsigned define ZEROFILL_FLAG 64 Field is zerofill define BINARY_FLAG 128 Field is binary define ENUM_FLAG 256 field is an enum define AUTO_INCREMENT_FLAG 512 field is a autoincrement field define TIMESTAMP_FLAG 1024 Field is a timestamp define SET_FLAG 2048 field is a set define NO_DEFAULT_VALUE_FLAG 4096 Field doesnt have default value

Intern Part of some key define NUM_FLAG 32768 Field is num (for clients)

Fonction mysqli_stmt_result_metadata

Peu de changements par rapport au programme preacuteceacutedent La fonction mysqli_stmt_result_metadata suppose qursquoon travaille avec un eacutetat preacutepareacute Elle sert agrave affecter un iden-tifiant de reacutesultat qui passe en paramegravetre de mysqli_fetch_field comme vu preacuteceacutedem-ment

$requete = SELECT FROM bdsoutouAvion

$ordre = mysqli_prepare($service$requete)

if (($res = ) gt 0)

while ($obj= )

print lttdgt$obj-gtnamelttdgt

define NOT_NULL_FLAG 1

define PRI_KEY_FLAG 2

define MULTIPLE_KEY_FLAG 8

define PART_KEY_FLAG 16384

mysqli_stmt_result_metadata($ordre)

mysqli_fetch_field($res)

4055_09_C09 Page 343 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

344 copy Eacuteditions Eyrolles

Exercices

Lrsquoobjectif de ces exercices est de compleacuteter des progammes PHP pour extraire et mettre agrave jourdes donneacutees de certaines des tables du scheacutema Parc informatique

91 Extraction preacutepareacutee

Eacutecrire le programme exo1suitephp qui devra retrouver le nom du logiciel le numeacutero de poste ladate drsquoinstallation et la date drsquoachat du logiciel pour toutes les installations drsquoune salle donneacutee Ceprogramme sera appeleacute agrave partir du programme exo1debutphp composant un formulaire de saisie

lthtmlgt ltheadgt lttitlegtInstallations dune sallelttitlegt ltheadgt

ltbodygt

ltform method=POSTgtltpgt

ltH4gtRecherche des installations dune salleltH4gtltPgt

Numeacutero de salle ltinput type=text name=ns maxlength=7gtltBRgt

ltinput type=submit value=Cherchergt

ltformgt

ltbodygt lthtmlgt

Vous utiliserez

bull $_POST[lsquonsrsquo] pour reacutecupeacuterer la valeur du numeacutero de salle saisi dans le formulaire

bull mysqli_prepare mysqli_stmt_execute et mysqli_stmt_bind_result pour preacutepa-rer exeacutecuter et lier des variables PHP en sortie

bull Un affichage simple de type laquo Aucune installation dans la salle si la salle ne contient aucun postesur lequel un logiciel est installeacute raquo (exemple pour s12)

Votre programme doit produire un reacutesultat analogue agrave lrsquoeacutecran suivant

Figure 9-6 Formulaire de saisie

action=exo1suitephp

4055_09_C09 Page 344 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 345

chapitre ndeg 9 Utilisation avec PHP

92 Appel drsquoun sous-programme

Utiliser de nouveau la proceacutedure catalogueacutee supprimeSalle(IN ns VARCHAR(7)OUT resTINYINT) deacutecrite agrave lrsquoexercice du chapitre 8 Cette proceacutedure supprime une salle dont le numeacutero estpasseacute en premier paramegravetre et retourne en second paramegravetre

bull 0 si la suppression srsquoest deacuterouleacutee correctement

bull ndash 1 si le code de la salle est inconnu

bull ndash 2 si la suppression est impossible (contraintes reacutefeacuterentielles)

Eacutecrire le programme exo2suitephp qui agrave partir drsquoune saisie du numeacutero de salle (programmeexo2debutphp similaire agrave exo1debutphp) appelle le sous-programme supprimeSalle

lthtmlgt ltheadgt lttitlegtSuppression dune sallelttitlegt ltheadgt

ltbodygt

ltform action method=POSTgtltpgt

ltH3gtSalle agrave supprimerltH3gtltPgt

Numeacutero de salle ltinput type=text name=ns maxlength=7gtltBRgt

ltinput type=submit value=Supprimergt

ltinput type=reset value=Resetgt

ltformgt

ltbodygt lthtmlgt

Figure 9-7 Extraction preacutepareacutee

Figure 9-8 Formulaire de saisie

=exo2suitephp

4055_09_C09 Page 345 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

346 copy Eacuteditions Eyrolles

Tracez les diffeacuterents cas drsquoerreurs (numeacutero de salle reacutefeacuterenceacute par un poste de travail puis numeacutero desalle inexistant) Pensez agrave donner agrave lrsquoutilisateur le privilegravege en exeacutecution sur cette proceacutedure

93 Insertion preacutepareacutee

Eacutecrire le programme PHP exo3suitephp qui agrave partir drsquoune saisie des paramegravetres neacutecessairespour enregistrer une nouvelle installation agrave la date du jour drsquoun logiciel sur un poste de travail reacutealiselrsquoinsertion dans la table Installer Cette saisie sera reacutealiseacutee dans le programme exo3debutphpci-apregraves

lthtmlgt ltheadgt lttitlegtNouvelle installations de logiciel sur un

postelttitlegt ltheadgt

ltbodygt

lt method=POSTgtltpgt

ltphp

$format=j-n-Y

$datej = date($format)

print ltH4gtInstallation dun logiciel agrave la date du $datejltH4gtltPgt

gt

Numeacutero de poste ltinput type=text name=np maxlength=7gt

Code du logiciel ltinput type=text name=nl maxlength=5gtltBRgt

ltinput type=submit value=Enregistrergt

ltinput type=reset value=Resetgt

ltformgt

ltbodygt lthtmlgt

Pour tester une eacuteventuelle erreur de compatibiliteacute entre le type du poste et celui du logiciel (voir ledeacuteclencheur de lrsquoexercice en fin de chapitre 7) vous afficherez le message drsquoerreur (avec mysqli_stmt_error) et le code drsquoerreur si lrsquoinsertion se passe mal Tester une insertion correcte (p10log1) et une insertion incorrecte du fait des types diffeacuterents (p8 log7)

Figure 9-9 Saisie du formulaire

form action=exo3suitephp

4055_09_C09 Page 346 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 347

chapitre ndeg 9 Utilisation avec PHP

Figure 9-10 Insertion correcte

Figure 9-11 Erreur apregraves insertion

4055_09_C09 Page 347 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

4055_09_C09 Page 348 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

349

Chapitre 10

Outils graphiques

MySQL AB fournit gratuitement plusieurs outils graphiques afin drsquoadministrer de manipulerdrsquointerroger et de faire migrer une base de donneacutees Ce sont

MySQL Administrator

MySQLQuery Browser

et

MySQL Migration Toolkit

Lrsquoutilisation de cet outil de migration sort ducadre de cet ouvrage nous ne lrsquoeacutetudierons donc pas

Par ailleurs il existe drsquoautres consoles graphiques drsquoadministration que nous allons observersommairement agrave savoir le ceacutelegravebre

phpMyAdmin

(interface Web eacutecrite en PHP)

Toad

forMySQL

(plus connu pour sa version Oracle)

Navicat

et

EMS SQL Manager

Ce chapitre survole les principales fonctionnaliteacutes de ces logiciels Nrsquoy voyez pas ici un guidede reacutefeacuterence

MySQL Administrator

MySQL Administrator

est un outil drsquoadministration (bases tables utilisateurs) de sauvegarde(

backup

) de restauration (

restore

recovery

) et de surveillance (

database

monitoring

)

SousWindows il se preacutesente sous la forme drsquoun

Package Windows Installer

(extension

msi

) Soninstallation ne pose aucun problegraveme Vous trouverez la documentation officielle surhttpdevmysqlcomdocadministratorenindexhtml

Connexion

La console se lance sous Windows agrave partir de

Deacutemarrer

Programmes

MySQLMySQLAdministrator

Apparaicirct ensuite lrsquoeacutecran ci-apregraves pour lequel dans notre cas il faut saisirle mode de passe de

root

sur le serveur local

4055_10_C10 Page 349 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

350

copy Eacuteditions Eyrolles

Connexion nommeacutee

Lrsquoeacutecran suivant deacutecrit lrsquointerface accessible (choix laquo hellip raquo agrave cocircteacute de

Stored Connection

)pour preacutedeacutefinir une connexion Ici elle se nomme

cxSoutouLocal

et correspondra agrave laconnexion de

soutou

sur la base

bdsoutou

situeacutee sur le serveur local

Une fois la connexion choisie il faut srsquoidentifier au niveau de la base de donneacutees cible

Figure 10-1

Connexion agrave un serveur

Figure 10-2

Creacuteation drsquoune connexion nommeacutee

4055_10_C10 Page 350 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

351

chapitre ndeg 10 Outils graphiques

Liste des accegraves utilisateur

Lorsque la connexion est eacutetablie pour lrsquoutilisateur choisi il est possible de geacuterer une basetout en respectant ses propres preacuterogatives Ici nous choisissons sous

root

en local delister les accegraves utilisateur En seacutelectionnant un accegraves utilisateur (ici

root

sur

localhost

)il est possible de modifier ces caracteacuteristiques et ces privilegraveges

Quand vous ajoutez un nouvel utilisateur pensez agrave autoriser sa connexion agrave partir de chaquemachine cliente Clic droit sur lrsquoutilisateur dans la fenecirctre principale

Add Host FromWhich The User Can Connect

Ensuite il faudra lui allouer des privilegraveges sur chaquebase de donneacutees autoriseacutee

Gestion des privilegraveges

En seacutelectionnant un utilisateur lrsquoonglet

Schema Privileges

permet graphiquementdrsquoaffecter ou de reacutevoquer tout privilegravege sur toute base Dans lrsquoeacutecran suivant

root

affecte agravelrsquoaccegraves utilisateur

soutou

en local le privilegravege

SELECT

sur la base

mysql

Figure 10-3

Liste des utilisateurs

4055_10_C10 Page 351 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

352

copy Eacuteditions Eyrolles

Caracteacuteristiques systegraveme

Le choix

Health

de la fenecirctre principale renseigne les occupations meacutemoire des process encours sur le serveur MySQL ainsi que la valeur des variables systegraveme Lrsquoeacutecran suivant affichepar exemple le format par deacutefaut de repreacutesentation des colonnes de type date-heure

Figure 10-4

Caracteacuteristiques drsquoun utilisateur

Figure 10-5

Variables systegraveme

4055_10_C10 Page 352 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

353

chapitre ndeg 10 Outils graphiques

Options scripts SQL

Lrsquooption

ToolsOptions

(choix

Editors

) permet de personnaliser les scripts SQL quiseront automatiquement geacuteneacutereacutes suite agrave des modifications structurelles drsquoune base (ajout drsquounetable drsquoune contrainte etc) Lrsquoeacutecran suivant preacutesente les options par deacutefaut Par exemple lacontrainte de cleacute primaire si elle est une seacutequence de la table

Etudiant

se nommera automa-tiquement

idEtudiant

Figure 10-6

Options par deacutefaut des scripts SQL

4055_10_C10 Page 353 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

354

copy Eacuteditions Eyrolles

Composition drsquoune base

Le choix

Catalogs

de la fenecirctre principale donne des informations sur les tables index vueset proceacutedures catalogueacutees drsquoune base Lrsquoeacutecran suivant preacutesente la liste des tables de la base

bdsoutou

Figure 10-7

Liste des tables drsquoune base

4055_10_C10 Page 354 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

355

chapitre ndeg 10 Outils graphiques

Composition drsquoune table

En double-cliquant sur le nom drsquoune table on obtient le deacutetail des colonnes (la compositiondes cleacutes eacutetrangegraveres eacutegalement) ainsi que les caracteacuteristiques systegraveme relatives au mode destockage Lrsquoeacutecran suivant nous reacutevegravele la structure de la table

Poste

situeacutee dans la base

bdsoutou

Figure 10-8

Deacutetail des colonnes drsquoune table

4055_10_C10 Page 355 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

356

copy Eacuteditions Eyrolles

Composition des index

Lrsquoonglet

Shema Indices

deacutetaille les index preacutesents dans une base Lrsquoeacutecran suivant nousmontre les trois index de la table

Poste

situeacutee dans la base

bdsoutou

Modification drsquoun scheacutema

Eacutetudions agrave preacutesent la modification drsquoun scheacutema par le fait drsquoajouter une table puis unenouvelle contrainte agrave une table existante

Creacuteation drsquoune table

Lrsquoeacutecran suivant illustre la creacuteation de la table

Aeroport

dont les colonnes

codeOACI

et

compa

composent la cleacute primaire

Agrave lrsquoissue de cette creacuteation apregraves avoir cliqueacute sur

Apply Changes

arrive lrsquoeacutecran qui deacutecrit lasyntaxe SQL geacuteneacutereacutee Si vous deacutesirez conserver une trace de ce script pensez agrave copier-collerle contenu de la fenecirctre

Figure 10-9

Deacutetail des index

4055_10_C10 Page 356 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

357

chapitre ndeg 10 Outils graphiques

Figure 10-10

Creacuteation drsquoune table

Figure 10-11

Script SQL de creacuteation de table geacuteneacutereacute

4055_10_C10 Page 357 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

358

copy Eacuteditions Eyrolles

Ajout contrainte

Inseacuterons agrave preacutesent la cleacute eacutetrangegravere reliant la table

Aeroport

agrave la table

Compagnie

(laquo pegravere raquo) Dans lrsquoordre ajouter le nom de la contrainte laquo + raquo choisir la table cible puis lacolonne de la table laquo fils raquo (ici

compa

) Enfin vous pouvez restreindre les actions en cascade

Agrave lrsquoissue de cette modification arrive lrsquoeacutecran qui deacutecrit la syntaxe SQL geacuteneacutereacutee Si vousdeacutesirez conserver une trace de ce script pensez agrave copier-coller le contenu de la fenecirctre

Restriction

Pour toute modification dans quelque fenecirctre que ce soit il nrsquoest pas possible drsquoextraire lacommande SQL geacuteneacutereacutee automatiquement (sauf pour la creacuteation et la modification de tables)Cette option est tregraves preacutecieuse pour les administrateurs qui deacutesirent archiver les sources de

toutes leurs opeacuterations pour les reacuteutiliser agrave la demande si neacutecessaire

Figure 10-12

Ajout drsquoune cleacute eacutetrangegravere

Figure 10-13 Script SQL drsquoajout drsquoune cleacute eacutetrangegravere

4055_10_C10 Page 358 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 359

chapitre ndeg 10 Outils graphiques

MySQL Query Browser

MySQL Query Browser est un outil graphique composeacute drsquoune interface pour creacuteer exeacutecuter etoptimiser des instructions SQL (LDD LMD LID et LCD) Bien que toutes les instructionsgeacuteneacutereacutees par le biais de cet outil soient exeacutecutables en ligne de commande (crsquoest une chancepour vous qui avez ingurgiteacute toute la syntaxe SQLhellip) la documentation affirme que certainesrequecirctes peuvent y ecirctre composeacutees graphiquement de maniegravere plus intuitive (ce nrsquoest quandmecircme pas le QBE drsquoAccess)

MySQL Query Browser convient agrave des bases MySQL de version posteacuterieure agrave 40 SousWindows il se preacutesente sous la forme drsquoun Package Windows Installer (extension msi) Soninstallation ne pose aucun problegraveme Vous trouverez la documentation officielle surhttpdevmysqlcomdocquery-browserenindexhtml

Une fois connecteacute avec la mecircme interface que MySQL Administrator (dans laquelle vouschoisissez lrsquoutilisateur le serveur la base et saisissez le mot de passe) arrive la fenecirctreprincipale

Fenecirctre principale

Lrsquointerface inclut la palette drsquooutils suivante

Query Toolbar (zone de texte en haut au centre) pour creacuteer et eacutexeacutecuter des instructions(requecirctes et tout ordre de creacuteation ou de manipulation) et naviguer (avec Next et Goback) dans lrsquohistorique de ces commandes

Resultset qui affiche le reacutesultat drsquoune requecircte avec en bas un bandeau pour les onglets decontrocircle et lrsquoaffichage drsquoeacuteventuelles erreurs

Script Editor (onglets Edit Apply changes Discard changes First Last etSearch qui se trouvent en bas de la fenecirctre de reacutesultats) vous donne le controcircle pour creacuteermodifier et rechercher manuellement des donneacutees parmi les enregistrements extraits parune requecircte

Object Browser vous permet de seacutelectionner les colonnes des tables des bases qui voussont accessibles Vous pouvez double-cliquer ou faire des glisser-deacuteposer de colonnes(mecircme de diffeacuterentes tables pour composer des jointures) dans la zone de commande Lesbookmarks et les historiques sont aussi geacutereacutes agrave ce niveau

Inline Help (zone de texte en bas agrave droite) vous donne un acceacutes direct agrave lrsquoaide de toutescommandes SQL et fonctions La syntaxe srsquoaffiche dans le Resultset

4055_10_C10 Page 359 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

360 copy Eacuteditions Eyrolles

Extraction

Lrsquoeacutecran suivant illustre une jointure composeacutee agrave lrsquoaide drsquoun glisser-deacuteposer des colonnesconcerneacutees Toute la requecircte ne se compose pas automatiquement (jrsquoai ducirc eacutecrire manuelle-ment le signe laquo = raquo du preacutedicat de jointure et la condition du deuxiegraveme preacutedicat)

Je ne suis pas un professionnel de cette interface qui a quand mecircme agrave mon sens encore desprogregraves agrave faire pour faciliter vraiment lrsquoeacutecriture des requecirctes (notamment pour les jointuresavec sous-requecirctes) Notez que crsquoest lrsquoeacutecriture relationnelle de la jointure qui est choisie parlrsquooutil (ce qui confirme mes dires au chapitre 4 section Jointure relationnelle)

Figure 10-14 Fenecirctre principale de MySQL Query Browser

4055_10_C10 Page 360 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 361

chapitre ndeg 10 Outils graphiques

Modification

Lrsquoeacutecran suivant illustre une requecircte (monotable) dont le reacutesultat permet de modifier toutecolonne de la table en seacutelectionnnant lrsquoonglet Edit puis Apply changes

On peut eacutegalement ajouter un enregistrement (eacutequivalent agrave INSERT) en se positionnant surlrsquoenregistrement vide en fin de reacutesultat puis faire un clic droit sur le choix Add Row Poursupprimer un enregistrement (eacutequivalent agrave DELETE) le seacutelectionner puis faire un clic droitsur le choix Delete Row(s) Toute modification devra bien sucircr respecter les eacuteventuellescontraintes drsquouniciteacute de non nulliteacute et drsquointeacutegriteacute reacutefeacuterentielle

Figure 10-15 Jointure (requecircte multitable)

4055_10_C10 Page 361 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

362 copy Eacuteditions Eyrolles

phpMyAdmin

phpMyAdmin est un outil drsquoadministration drsquoun ou de plusieurs serveurs MySQL Les fonc-tionnaliteacutes principales de cet outil sont

de creacuteer modifier et supprimer des bases de donneacutees et des tables de geacuterer les utilisateurset leurs privilegraveges

drsquoexeacutecuter toute instruction SQL mecircme les requecirctes par lot de proposer Query By Examplepour eacutecrire des requecirctes complexes

drsquoimporter des donneacutees provenant de fichiers texte ou drsquoexporter des donneacutees aux formatsCSV XML et Latex

de creacuteer des graphiques PDF du scheacutema de votre base de donneacutees de geacuterer mysqli la derniegravere API PHP pour MySQL

Plusieurs installations sont possibles individuellement avec Apache et PHP avec WAMPavec EasyPHP (mais la version actuelle ne reconnaicirct pas encore MySQL 5) Vous trouverez ladocumentation officielle sur httpwwwphpmyadminnetpma_localized_docsfr

Une fois installeacute et configureacute avec Apache arrive la fenecirctre principale qui permet de seacutelectionnerles principales fonctionnaliteacutes Ici je seacutelectionne la base bdsoutou

Figure 10-16 Modification drsquoun enregistrement

4055_10_C10 Page 362 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 363

chapitre ndeg 10 Outils graphiques

Composition de la base

Les tables et vues (quinze en tout) apparaissent sur lesquelles diffeacuterentes actions sont possibles viales icocircnes dans la colonne Action (afficher structurer rechercher inseacuterer vider et supprimer)

Figure 10-17 phpMyAdmin

Figure 10-18 Composition de la base

4055_10_C10 Page 363 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

364 copy Eacuteditions Eyrolles

Structure drsquoune table

En seacutelectionnant la structure drsquoune table (ou vue) il est possible drsquoajouter de modifier ou desupprimer une colonne ou une contrainte de cleacute (primaire ou eacutetrangegravere)

Administrer une table

Lrsquoonglet Opeacuterations au niveau drsquoune table permet de modifier les caracteacuteristiques drsquounetable agrave lrsquoeacutechelle de la database

Figure 10-19 Structure drsquoune table

4055_10_C10 Page 364 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 365

chapitre ndeg 10 Outils graphiques

Extractions

Lrsquoonglet SQL permet de saisir une instruction SQL (LDD LMD LID ou LCD) Ici jrsquoai fait un copier-coller de la requecircte de division de lrsquoexercice du chapitre 4 Malheureusement jrsquoobtiens une erreurdans cette interface alors qursquoen ligne de commande deux lignes sont retourneacutees (postes 6 et 8)

Figure 10-20 Administrer une table

Figure 10-21 Requecircte SQL

4055_10_C10 Page 365 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

366 copy Eacuteditions Eyrolles

Lrsquoonglet Requecircte aide agrave la construction de requecirctes SQL (de type QBE) Dans lrsquoeacutecransuivant on compose une jointure entre les tables installer et logiciel Notez que laclause de jointure doit ecirctre saisie explicitement Ici on affiche le nom et la date drsquoinstallationdes logiciels existant sur des postes de travail

Rechercher

Lrsquoonglet Rechercher permet de rechercher des valeurs dans une ou plusieurs tables (ou vues)Ici on recherche les tables qui contiennent un enregistrement dont une colonne contient le motlaquo Oracle raquo Il est ensuite possible drsquoafficher ou drsquoeffacer chacune des occurrences veacuterifiant cettecondition

Figure 10-22 Assistant QBE

4055_10_C10 Page 366 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 367

chapitre ndeg 10 Outils graphiques

Exporter

Lrsquoonglet Exporter permet de transfeacuterer des donneacutees (et des structures) drsquoune ou de plusieurstables sous diffeacuterents formats (voir lrsquoeacutecran ci-apregraves)

Figure 10-23 Recherche dans plusieurs tables

Figure 10-24 Exportation au format Word

4055_10_C10 Page 367 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

368 copy Eacuteditions Eyrolles

Utilisateurs

Lrsquoonglet Privilegraveges autorise la gestion des accegraves utilisateur avec leur privilegraveges En seacutelec-tionnant un utilisateur existant il est aussi possible de modifier ses caracteacuteristiques

Le message en rouge en bas de page vous invite agrave modifier le mot de passe de root Jrsquoai eudes mauvaises surprises suite agrave plusieurs tentatives de modification Meacutefiancehellip

TOAD for MySQL

Toad for MySQL est un outil graphique drsquoadministration et de deacuteveloppement qui estdisponible gratuitement dans une version Preview Release Toutefois ce statut de freewaresemble temporaire et le produit doit ecirctre reteacuteleacutechargeacute tous les 60 jours (httpwwwtoad-softcomtoadmysqltoad_mysqlhtm)

Sous Windows il se preacutesente sous la forme drsquoune archive drsquoun installeur (fichier agrave extensionmsi) dont lrsquoexeacutecution ne pose aucun problegraveme Quand la grenouille coasse TOAD est precirctpour vous Au premier deacutemarrage des choix de mode drsquoaffichage vous seront demandeacutes Parla suite vous devrez vous connecter en donnant tous les paramegravetres neacutecessaires

Figure 10-25 Gestion des utilisateurs

4055_10_C10 Page 368 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 369

chapitre ndeg 10 Outils graphiques

Une fois connecteacute arrive une interface agrave partir de laquelle par le menu Tools et Views desonglets se composent dans la fenecirctre principale Lrsquoaffichage de ces onglets qui sont constitueacutesde boutons listes deacuteroulantes choix etc est controcircleacute par le menu Window

Administration

Le choix ToolsDatabase Browser en seacutelectionnant une base de donneacutees renseigne lestables index vues proceacutedures catalogueacutees privilegraveges des utilisateurs etc Tout objet relatif agravela base se retrouve ici

Lrsquoeacutecran suivant preacutesente les onglets disponibles pour la base bdsoutou On srsquointeacuteresse ici agravela composition de la table Installer Toute modification de cette table au niveau de lastructure est possible (sous reacuteserve de maintenir lrsquointeacutegriteacute des donneacutees via drsquoeacuteventuellescontraintes reacutefeacuterentielles)

Lrsquoonglet Data extrait les lignes drsquoune table Lrsquoonglet Indexes deacutecrit les index preacutesents dansla table Lrsquoonglet Constraints liste les contraintes reacutefeacuterentielles Lrsquoonglet Informationeacutenumegravere les caracteacuteristiques physiques de la table Lrsquoonglet Script restitue le script SQL decreacuteation que vous pouvez sauvegarder sous la forme drsquoun fichier texte

Figure 10-26 Connexion via TOAD

4055_10_C10 Page 369 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

370 copy Eacuteditions Eyrolles

Instructions en ligne

Le choix ToolsEditor de la fenecirctre principale ouvre plusieurs fenecirctres dont la plus impor-tante est une zone de texte contenant une instruction SQL Lrsquoeacutecran suivant preacutesente une requecirctequi reacutealise une division (voir chapitre 4) Lrsquoonglet Result Sets contient le(s) reacutesultat(s) delrsquoextraction Lrsquoonglet Explain Plan permet de visualiser le plan drsquoexeacutecution

Figure 10-27 Composition drsquoune base

Figure 10-28 Extraction de donneacutees

4055_10_C10 Page 370 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 371

chapitre ndeg 10 Outils graphiques

Toute autre instruction SQL (LMD LDD et LCD) peut ecirctre exeacutecuteacutee dans ce mode Le menuCreate geacutenegravere automatiquement le deacutebut de la syntaxe SQL adeacutequate (creacuteation drsquoune basetable vue index ou proceacutedure catalogueacutee)

Deacuteveloppement

Le choix ToolsDatabase Browser ensuite lrsquoonglet Procedure en seacutelectionnant uneproceacutedure (clic droit puis Alter Procedure) permet de modifier puis de recompiler(EditorExecute SQL Statement) une proceacutedure existante Pour en creacuteer une nouvellevous avez le choix entre le clic droit puis Create Procedure ou passer par le menu geacuteneacuteralCreateProcedure

Creacuteation drsquoobjets

Le menu geacuteneacuteral Create permet de creacuteer des tables bases vues index et fonctions ou proceacute-dures catalogueacutees En seacutelectionnant le choix Table une fenecirctre srsquoouvre deacutecouvrant troisonglets pour caracteacuteriser la table Le premier onglet permet entre autres de deacutefinir le moteur destockage le nom la base et drsquoautres informations que lrsquoeacutecran suivant illustre

Figure 10-29 Modification drsquoun sous-programme

4055_10_C10 Page 371 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

372 copy Eacuteditions Eyrolles

Le second onglet donne la possibiliteacute de structurer la table (description de chaque colonne etdes contraintes en ligne)

Figure 10-30 Creacuteation drsquoune table (onglet Table)

Figure 10-31 Creacuteation drsquoune table (onglet Columns)

4055_10_C10 Page 372 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 373

chapitre ndeg 10 Outils graphiques

Le dernier onglet permet de deacutefinir les eacuteventuelles cleacutes eacutetrangegraveres de la table Jrsquoavoue avoir eudes problegravemes pour en creacuteer une qui soit impleacutementeacutee dans la basehellip Vous essayerez vous-mecircme

Recherche drsquoobjets

Une fonctionnaliteacute inteacuteressante concerne la recherche drsquoobjets (choix ToolsObjectSearch) Dans lrsquoexemple suivant on extrait tous les objets de la base de donneacutees mysql dontle nom contient la chaicircne laquo user raquo Notez aussi la possibiliteacute de chercher un identifiant (parexemple le nom drsquoune table) au sein du corps de proceacutedures fonctions ou vues (les deacuteclen-cheurs ne sont pas ici pris en compte visiblement)

Figure 10-32 Creacuteation drsquoune table (onglet Constraints)

4055_10_C10 Page 373 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

374 copy Eacuteditions Eyrolles

Exportations

Le choix ToolsExport Wizard lance un assistant (un peu semblable agrave celui drsquoAccess)seacutelectionnant une (ou plusieurs) table(s) ou une (ou plusieurs) base(s) de donneacutees afindrsquoexporter les donneacutees sous diffeacuterents formats Sont permis notamment les fichiers texte(avec seacuteparateurs entre colonnes) fichiers XML ou html insertion INSERT preacuteeacutecrites

La partie de code suivante preacutesente les deux premiegraveres lignes du fichier Installerxmlgeacuteneacutereacute suite agrave lrsquoexportation dans ce format de la table de mecircme nom

ltInstallergtltNPOSTEgtp2ltNPOSTEgtltNLOGgtlog1ltNLOGgtltNUMINSgt1ltNUMINSgt

ltDATEINSgt15052003 000000ltDATEINSgtltDELAIgt292400ltDELAIgt

ltInstallergt

ltInstallergtltNPOSTEgtp2ltNPOSTEgtltNLOGgtlog2ltNLOGgtltNUMINSgt2ltNUMINSgt

ltDATEINSgt17092003 000000ltDATEINSgtltDELAIgt146300ltDELAIgt

ltInstallergt

hellip

Navicat

Navicat est un outil assez simple et intuitif Il ravira ceux qui appreacutecient concevoir des requecirctesgraphiquement Ici le QBE est bien supeacuterieur agrave celui de phpMyAdmin La documentationofficielle se trouve agrave httpsupportnavicatcom

Figure 10-33 Recherche drsquoobjets

4055_10_C10 Page 374 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 375

chapitre ndeg 10 Outils graphiques

Sous Windows il se preacutesente sous la forme drsquoun exeacutecutable dont lrsquoinstallation ne pose aucunproblegraveme Au premier deacutemarrage vous devez vous connecter en donnant tous les paramegravetresneacutecessaires La fenecirctre principale srsquoaffiche

Creacuteation drsquoune table

Apregraves avoir opteacute pour le choix Design Table lrsquoonglet Fields permet de deacutefinir facilementpar listes deacuteroulantes les diffeacuterentes colonnes de la nouvelle table

Figure 10-34 Accueil de Navicat

Figure 10-35 Creacuteation des colonnes

4055_10_C10 Page 375 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

376 copy Eacuteditions Eyrolles

Deacutefinition drsquoune contrainte

Lrsquoonglet Foreign Key permet de creacuteer aiseacutement par listes deacuteroulantes les cleacutes eacutetrangegraveres(une fois que les colonnes sont creacuteeacutees)

Figure 10-36 Deacutefinition drsquoune cleacute eacutetrangegravere

4055_10_C10 Page 376 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 377

chapitre ndeg 10 Outils graphiques

Creacuteation drsquoune requecircte

Lagrave je dis laquo bravo raquo Vous allez vous reacutegaler agrave composer vos jointures en seacutelectionnant unecolonne puis en la glissant au niveau de la cleacute de la table associeacutee Vous verrez votre requecirctesrsquoeacutecrire au fur et agrave mesure que vous agirez sur le diagramme Vous pourrez eacutegalement agir auniveau de la requecircte en cliquant aux diffeacuterents endroits indiqueacutes

Figure 10-37 Creacuteation drsquoune requecircte

4055_10_C10 Page 377 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

378 copy Eacuteditions Eyrolles

Importation

Au niveau drsquoune table drsquoune base de donneacutees lrsquoonglet Import Wizard lance un assistant quicomporte huit eacutetapes et permet de charger la table en enregistrements pouvant provenir de dixformats diffeacuterents

Lrsquoassistant drsquoexportation comporte cinq eacutetapes et reconnaicirct une vingtaine de formats dedonneacutees cibles

Gestion des utilisateurs

Le choix Manage Users offre une maniegravere simple et efficace pour creacuteer modifier supprimerdes accegraves utilisateurs et les privilegraveges associeacutes agrave tous les niveaux (global database tablecolumn et procedure)

Figure 10-38 Importation de donneacutees

4055_10_C10 Page 378 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 379

chapitre ndeg 10 Outils graphiques

Enfin il est aussi possible drsquoeacutecrire des proceacutedures catalogueacutees de composer des rapportsdrsquoimpression et de programmer des tacircches drsquoadministration

MySQL Manager

MySQL Manager (socieacuteteacute EMS) est un outil payant puissant intuitif et posseacutedant denombreuses fonctionnaliteacutes Il ravira ceux qui appreacutecient le QBE qui est ici aussi bien supeacute-rieur agrave celui de phpMyAdmin La documentation officielle se trouve agrave httpwwwsqlmana-gernetfrproductsmysqlmanagerdocumentation

Sous Windows il se preacutesente sous la forme drsquoune archive contenant un exeacutecutable dontlrsquoinstallation ne pose aucun problegraveme Au premier deacutemarrage des choix de modes drsquoaffichagevous seront demandeacutes Par la suite vous devrez vous connecter en donnant tous les paramegravetresneacutecessaires La fenecirctre principale apparaicirct

Figure 10-39 Gestion des accegraves et des privilegraveges

4055_10_C10 Page 379 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

380 copy Eacuteditions Eyrolles

Creacuteation drsquoune table

Plusieurs chemins existent pour lancer lrsquoassistant de creacuteation drsquoune table qui ressemble agrave ceuxdeacutejagrave eacutetudieacutes pour les preacuteceacutedents outils On retrouvera les diffeacuterents onglets permettant demodifier les colonnes index cleacutes eacutetrangegraveres et donneacutees Lrsquoonglet DDL contient lrsquoinstructionSQL geacuteneacutereacutee

Figure 10-40 Accueil de SQL Manager

Figure 10-41 Creacuteation drsquoune table

4055_10_C10 Page 380 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 381

chapitre ndeg 10 Outils graphiques

Les cleacutes eacutetrangegraveres se rajoutent apregraves creacuteation de la structure totale de la table

Figure 10-42 Ajout drsquoune cleacute eacutetrangegravere

4055_10_C10 Page 381 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

382 copy Eacuteditions Eyrolles

Creacuteation drsquoune requecircte

Comme pour Navicat laquo bravo raquo eacutegalement Vous trouverez un outil efficace (plus encore quecelui de Navicat) pour eacutecrire vos requecirctes Lrsquoeacutecran suivant illustre une jointure (geacuteneacutereacutee commepour Navicat sous la forme drsquoune eacutecriture SQL2 avec INNER JOIN) affichant quatre champs

Le reacutesultat peut srsquoexploiter de maniegravere tregraves efficace (en tant que grille ou sous forme imprimable)

Proceacutedures catalogueacutees

Un bon point pour cet outil pour pouvoir geacuterer les proceacutedures en modification ou creacuteation etpour pouvoir les recompiler et affecter des privilegraveges drsquoexeacutecution

Figure 10-43 Construction graphique drsquoune requecircte

Figure 10-44 Proceacutedure catalogueacutee

4055_10_C10 Page 382 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 383

chapitre ndeg 10 Outils graphiques

Gestion des utilisateurs

Lrsquoassistant graphique est tregraves clair

Gestion des privilegraveges

Lrsquoonglet Gestionnaire de droits permet drsquoattribuer des privilegraveges agrave tous les niveauxLrsquoeacutecran suivant illustre lrsquoautorisation drsquoexeacutecution de deux proceacutedures et lrsquoautorisation demodification de deux autres agrave lrsquoaccegraves utilisateur Paul agrave partir de la machine 1921684173

Cet outil offre eacutegalement drsquoautres fonctionnaliteacutes comme la gestion des variables systegravemeassistants drsquoexportation etc

Figure 10-45 Gestion des utilisateurs

4055_10_C10 Page 383 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

384 copy Eacuteditions Eyrolles

Bilan

Les avantages des outils deacutedieacutes et professionnels (comme Navicat TOAD et EMS MySQLManager) reacutesident dans le fait qursquoils sont fiables et permettent de garder une configuration detravail De plus ils peuvent ecirctre facilement installeacutes sur une autre machine que le serveurMySQL

Pour les deacutebutants je leur conseille de commencer agrave travailler avec les deux outils de MySQLagrave savoir MySQL Administrator et MySQL Query Browser qui sont sucircrs et simples drsquoutilisationPhpMyAdmin sera preacutefeacutereacute par les connaisseurs et plutocirct reacuteserveacute aux configurations de typeapplication PHP heacutebergeacutees car il est le plus reacutepandu Neacuteanmoins les nombreuses configura-tions possibles entre les diffeacuterentes versions des acteurs concerneacutes (Apache PHP MySQL etphpMyAdmin) font que des mauvaises surprises peuvent facilement arriverhellip

Figure 10-46 Privilegraveges au niveau routine

4055_10_C10 Page 384 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

385

Annexe

Bibliographie et webographie

Magazines papiers et en ligne

Programmez

(wwwprogrammezcom)

Database Journal

(wwwdatabasejournalcom)

Livres

F B

ROUARD

C S

OUTOU

SQL

Pearson Education 2005

E D

ASPET

CP

DE

G

EYER

PHP 5 avanceacute

Eyrolles 2005

P D

ELMAL

SQL2-SQL3 Applications agrave Oracle

De Boeck Universiteacute 2000

M K

OFLER

MySQL 5

Eyrolles 2005

C S

OUTOU

De UML agrave SQL

Eyrolles 2002

Sites Web

Eyrolles

Eacutediteur wwweditions-eyrollescom

Compleacutements en ligne sur la fiche de lrsquoouvrage sur wwweditions-eyrollescom ou

httpicareiut-blagnacfrsoutoupersoSQLpourMySQLComplementshtml

MySQL

httpwwwmysqlcom

httpmysqldeveloppezcom

httpdevmysqlcomtech-resourcesfaqhtml

4055_11_Biblio Page 385 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

386

copy Eacuteditions Eyrolles

PHP

httpfrphpnetmanualfrindexphp

httpwwwnexennetdocs

SQL et bases de donneacutees

httpsqlprodeveloppezcom

httpfadacedeveloppezcom

Outils

MySQL Administrator MySQL Query Browser

httpwwwmysqlcomproductstools

phpMyAdmin

httpwwwphpmyadminnethome_pageindexphp

Navicat

httpwwwnavicatcom

TOAD

httpwwwtoadsoftcomtoadmysqltoad_mysqlhtm

EMS SQL Manager

httpwwwsqlmanagernet

4055_11_Biblio Page 386 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

387

Index

Symboles

$_POST 344 154amp 100ltlt 100gtgt 100^ 100| 100~ 100

A

ABS 99absolute 304Access 294ACOS 99ACTION_CONDITION 273ACTION_ORIENTATION 273ACTION_REFERENCE_NEW_ROW 273ACTION_REFERENCE_NEW_TABLE 273ACTION_REFERENCE_OLD_ROW 273ACTION_REFERENCE_OLD_TABLE 273ACTION_STATEMENT 273ACTION_TIMING 272ADD CONSTRAINT 72ADD INDEX 72ADDDATE 101ADDTIME 101AFTER 265afterLast 304ALGORITHM=MERGE 176ALGORITHM=TEMPTABLE 176ALGORITHM=UNDEFINED 176alias

colonne 87en-tecircte 89table 87

vue 178WHERE 95

ALL 134ALL PRIVILEGES 166alpha 4ALTER

COLUMN 70DATABASE 158FUNCTION 243PROCEDURE 243ROUTINE 234VIEW 188

ALTER TABLEADD 68ADD CONSTRAINT 72ADD INDEX 72ALTER COLUMN 70CHANGE 69DISABLE KEYS 75DROP 70DROP FOREIGN KEY 74DROP PRIMARY KEY 74ENABLE KEYS 77MODIFY 69

Alter_priv 161Alter_routine_priv 162AND 93ANY 134Apache 327API 5AS SELECT 90ASC 89ASCII 96association 24ATAN 99AUTO_INCREMENT 44 196autojointure 125AVG 110AVG_ROW_LENGTH 196

4055_12_Indexfm Page 387 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

388

copy Eacuteditions Eyrolles

B

batch 13BEFORE 265beforeFirst 304begin 210beta 4BETWEEN 93BIGINT 27BIN 100BINARY 27BINARY() 21 106BIT 27 40BIT_LENGTH 101BLOB 29block label 214BOOL 27BOOLEAN 27

C

CallableStatement 318cancelRowUpdates 308CASCADE 34CASCADED 176CASE 218casse 20 211CAST 106CATALOG_NAME 195CEIL 99CHAR 26CHAR() 96CHARACTER SET 156CHARACTER_OCTET_LENGTH 197CHARACTER_SET_NAME 198CHECK 24 273CHECK_OPTION 193ClassforName 295CLASSPATH 292cleacute

candidate 3eacutetrangegravere 3primaire 3

client-serveur 209CLOSE 245

COLLATE 156COLLATION_NAME 198colonne 2COLUMN_COMMENT 198COLUMN_DEFAULT 197COLUMN_KEY 197COLUMN_NAME 197 203Column_name 168Column_priv 159 168COLUMN_PRIVILEGES 194 203COLUMNS 194 196COMMENT 20 235commentaire 212

MySQL 21COMMIT 228comparaisons 106CONCAT 89 96concateacutenation 89Connection 295CONSTRAINT_NAME 199CONSTRAINT_SCHEMA 198CONSTRAINT_TYPE 199CONTAINS SQL 235CONTINUE 249contrainte 23

CHECK 24FOREIGN KEY 24in-line 23out-of-line 23PRIMARY KEY 23reacutefeacuterentielle 56UNIQUE 23

conventions 24conversions 105CONVERT 106COS 99COT 99COUNT 110CREATE 19

DATABASE 156FUNCTION 235INDEX 32ROUTINE 234SCHEMA 156

4055_12_Indexfm Page 388 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

389

Index Apprendre SQL avec MySQL

TABLE 19TRIGGER 263USER 153VIEW 176

Create_priv 161Create_routine_priv 162CREATE_TIME 195Create_tmp_table_priv 163Create_user_priv 161Create_view_priv 161CREATED 201 273createStatement 295CROSS JOIN 141CURDATE 101CURRENT_DATE 44 101CURRENT_TIME 44CURRENT_TIMESTAMP 44 101CURRENT_USER() 187curseur 244CURSOR 245CURTIME 188

D

data dictionary 190Data Source Name 294DATA_LENGTH 196DATA_TYPE 197database 6 13 155DatabaseMetaData 314DATE 28 42DATE() 101DATE_ADD 51 101DATE_FORMAT 53 101 188DATE_SUB 101DATEDIFF 51 101DATETIME 28 42DAY 101DAY_MINUTE 51DAYNAME 101DAYOFMONTH 101DAYOFYEAR 101Db 167DBA 152

DEALLOCATE 279DEC 28DECIMAL 27DECLARE 213

CONDITION 260deacuteclencheur 262DEFAULT 20 38 213DEFAULT() 108DEFAULT_CHARACTER_SET_NAME 195DEFAULT_COLLATION_NAME 195DEFINER 201definer 201DEGREES 99DELAYED 37DELETE 54Delete_priv 160deleteRow 308delimiter 15 20DESC 89DESCRIBE 29DETERMINISTIC 235dictionnaire des donneacutees 190DISABLE KEYS 75DISTINCT 87DISTINCTROW 87division 142DO 279DOUBLE 27DOUBLE PRECISION 28DriverManager 293DROP 70

FOREIGN KEY 74PRIMARY KEY 74TABLE 33TRIGGER 278USER 155VIEW 189

Drop_priv 161

E

ELSEIF 218ENABLE KEYS 77END 210

4055_12_Indexfm Page 389 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

390

copy Eacuteditions Eyrolles

ENGINE 196ENUM 29 40 107equals 309eacutequijointure 123ERROR

1045 1541046 2501048 391054 951062 39 49 2851172 223 2521263 491265 40 411288 1791303 2431326 2451363 2701369 181 1871394 1821395 1831422 2751424 2421442 2771451 55 611452 39 49 59 285

eacutetiquette 214EVENT_MANIPULATION 272EVENT_OBJECT_CATALOG 273EVENT_OBJECT_SCHEMA 272EVENT_OBJECT_TABLE 272exception 248

JDBC 322EXECUTE 239 279execute 297 316 319Execute_priv 162executeQuery 297 319executeUpdate 297 316 319EXISTS 139EXIT 249exit 15EXP 100expression 88EXTRACT 53 102

F

FALSE 218FETCH 245FIELD 96FIELDS

ENCLOSED BY 63 146ESCAPED BY 63 146TERMINATED BY 63 146

FILE 146File_priv 163first 304FIXED 28FLOAT 27FLOOR 100FLUSH PRIVILEGES 154fonction catalogueacutee 233FOR EACH ROW 265FOR UPDATE 247FOREIGN KEY 56FORMAT 108FROM 85FROM_DAYS 53 102FROM_UNIXTIME 102FULL OUTER JOIN 131

G

gamma 4GET_FORMAT 53getClass 300getColumnCount 313getColumnName 313getColumns 314getColumnType 313getColumnTypeName 313getConcurrency 308getConnection 297getDatabaseProductName 314getDatabaseProductVersion 314getErrorCode 322getFetchDirection 304getGeneratedKeys 312getMessage 322getMetaData 302

4055_12_Indexfm Page 390 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

391

Index Apprendre SQL avec MySQL

getName 300getNextException 322getObject 300getPrecision 313getResultSetConcurrency 308getResultSetType 308getSavepointId 321getSavepointName 321getScale 313getSchemaName 313getSQLState 322getTableName 313getTables 315getter methods 297getType 308getUpdateCount 297getUserName 315GOTO 222GRANT 164

OPTION 164 165Grant_priv 161GRANTEE 202Grantor 168 169GREATEST 108GROUP BY 109GROUP_CONCAT 110

H

HANDLER 249handler 248HAVING 109help 13HEX 101host 7 13HOUR 102html 13 145

I

identificateur 212IDENTIFIED BY 153IF 217

EXISTS 34 158 189NOT EXISTS 19 156

IFNULL 109IGNORE 47 54 63IN 94 134index 30

B-tree 32FULLTEXT 32SPATIAL 32UNIQUE 32

Index_priv 161ineacutequijointure 127INFORMATION_SCHEMA 190INNER JOIN 124InnoDB 20INOUT 237INSERT 37INSERT() 96Insert_priv 160insertRow 308instead of 179INSTR 96INT 28INTEGER 27inteacutegriteacute reacuteferentielle 56INTO OUTFILE 146invoker 201IS NULL 94 214IS_GRANTABLE 202IS_NULLABLE 197isAfterLast 304isBeforeFirst 304isFirst 304isLast 304isNullable 313ITERATE 221

J

JCreator 293JDBC 289JOIN 124jointure 121

eacutequi join 123externe 128inner join 123

4055_12_Indexfm Page 391 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

392

copy Eacuteditions Eyrolles

mixte 136naturelle 140outer join 128proceacutedurale 132relationnelle 122self join 125SQL2 122

K

key preserved 184KEY_COLUMN_USAGE 194 199

L

LANGUAGE SQL 234last 304LAST_ALTERED 201LAST_DAY 102LAST_INSERT_ID() 44LEAST 109LEAVE 221LEFT 97LENGTH 97LIKE 94LIMIT 48 54 90LINES 63 146LMD 37LN 100LOAD DATA INFILE 62LOB (Large Object Binary) 2LOCAL 176localhost 154LOCALTIME 102LOCALTIMESTAMP 102LOCATE 97Lock_tables_priv 163LOG 100LONGBLOB 29LONGTEXT 27LOOP 221LOW_PRIORITY 37 47 54LOWER 97lower_case_table_names 21

LPAD 97LTRIM 99

M

MAKEDATE 102MAKETIME 102MAX 110max_connections 162MAX_CONNECTIONS_PER_HOUR 165MAX_QUERIES_PER_HOUR 165max_questions 162max_updates 162MAX_UPDATES_PER_HOUR 165MAX_USER_CONNECTIONS 165max_user_connections 162MEDIUMBLOB 29MEDIUMINT 27MEDIUMTEXT 27MEMORY 20metadata 190MICROSECOND 102MIN 110MINUTE 102MOD 100MODIFIES SQL DATA 235MODIFY 69MONTH 102MONTHNAME 102moveToCurrentRow 308moveToInsertRow 308msqli_prepare 330mutating tables 277myini 15 21 157MyISAM 20MySQL

sous-programme 233mysql 10MySQL AB 3MySQL Administrator 349MySQL Manager 379MySQL Query Browser 359mysqlcolumns_priv 168mysqldb 159 167

4055_12_Indexfm Page 392 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

393

Index Apprendre SQL avec MySQL

mysqlhost 173mysqlprocs_priv 168mysqltables_priv 168mysqluser 153 159mysql_confh 343mysqli 327MYSQLI_ASSOC 332MYSQLI_BOTH 332mysqli_change_user 330mysqli_close 330mysqli_commit 331mysqli_connect 330mysqli_errno 338mysqli_error 338mysqli_fetch_array 332 333mysqli_fetch_assoc 333 334mysqli_fetch_field 342mysqli_fetch_object 333mysqli_fetch_row 333mysqli_free_result 334mysqli_insert_id 337mysqli_multi_query 339MYSQLI_NUM 332mysqli_num_fields 333 341mysqli_num_rows 334mysqli_query 332mysqli_rollback 331mysqli_select_db 330mysqli_stmt_bind_param 335mysqli_stmt_bind_result 335mysqli_stmt_close 336mysqli_stmt_errno 338mysqli_stmt_error 338mysqli_stmt_execute 330mysqli_stmt_fetch 330 336mysqli_stmt_free_result 333mysqli_stmt_result_metadata 343

N

NATURAL JOIN 140Navicat 374NEW 267next 302

NO SQL 235NOT 92

DETERMINISTIC 235EXISTS 139FOUND 249IN 134NULL 20 23

NOW 28 101 102NULL 20 38NULLIF 109NUMERIC 28NUMERIC_PRECISION 198NUMERIC_SCALE 198

O

OCT 101OCTET_LENGTH 101ODBC 290 294OLD 265ON DELETE

CASCADE 60SET NULL 60

ON UPDATECASCADE 60SET NULL 60

OPEN 245OR 93

REPLACE 176ORDER BY 48 55 89ORDINAL_POSITION 197 199OUTER JOIN 129

P

paquetage 244password 13PASSWORD() 154PERIOD_DIFF 102PHP 327phpMyAdmin 362PI() 99placeholder 279 336POSITION_IN_UNIQUE_CONSTRAINT 199

4055_12_Indexfm Page 393 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

394

copy Eacuteditions Eyrolles

POW 100PREPARE 279prepareCall 295 318prepared statement 278prepareStatement 295 316previous 304privilegravege 158PRIVILEGE_TYPE 202Proc_priv 169proceacutedure catalogueacutee 233Process_priv 163procs_priv 160 168production 4produit carteacutesien 119 141prompt 13 15

Q

QUICK 55quit 15

R

RADIANS 100RAISE 250RAND 100READS SQL DATA 235REAL 28reacutecursiviteacute 241REFERENCED_COLUMN_NAME 200REFERENCED_TABLE_NAME 200REFERENCED_TABLE_SCHEMA 200References_priv 163registerOutParameter 319relative 304releaseSavepoint 321RENAME 67

TO 67USER 154

REPEAT 220Repl_client_priv 163Repl_slave_priv 163REPLACE 54 62 97requecircte 83

RESIGNAL 250RESTRICT 34ResultSet 301ResultSetMetaData 313RETURNS 235REVERSE 98REVOKE 170

ALL PRIVILEGES 171ROLLBACK 228

TO SAVEPOINT 230root 153ROUND 100ROUTINE_COMMENT 201ROUTINE_DEFINITION 201ROUTINE_NAME 201Routine_name 169ROUTINE_SCHEMA 201ROUTINE_TYPE 201Routine_type 169ROUTINES 200row 2row trigger 265RPAD 98RTRIM 98 99

S

Savepoint 321savepoint

JDBC 321MYSQL 230

scheacutema 6SCHEMA_PRIVILEGES 194 202SCHEMATA 194SEC_TO_TIME 52 53 102SECOND 102SECURITY_TYPE 201SELECT 84

fonctions 95SELECT INTO 223Select_priv 160SEQUEL 1seacutequence 44 196

JDBC 311

4055_12_Indexfm Page 394 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

395

Index Apprendre SQL avec MySQL

SERIAL 28SET 29 47 107SET AUTOCOMMIT 228SET FOREIGN_KEY_CHECKS 75 77setAutoCommit 295setFetchDirection 304setMaxRows 297setNull 316setSavepoint 321setter methods 296SHOW 190

COLUMNS 204CREATE DATABASE 204CREATE TABLE 204CREATE VIEW 189DATABASES 204ENGINES 204ERRORS 204 239GRANTS 204GRANTS FOR 165INDEX 204PRIVILEGES 204TABLE STATUS 204TABLES 204TRIGGERS 204

Show_db_priv 161Show_view_priv 161Shutdown_priv 163SIGN 100silent 13SIN 100SINH 100skip-column-names 13SLEEP() 232SMALLINT 27SOUNDEX 98source 15sous-interrogation 133

dans le FROM 137synchroniseacutee 137

sous-programme 210SQL dynamique 278SQL SECURITY 235SQL_PATH 195

SQL2 1SQL3 1SQLEXCEPTION 250SQLException 322SQLSTATE 249SQLWARNING 249SQRT 100Statement 297STATISTICS 194STDDEV 110stored procedures 233stored routines 233STR_TO_DATE 53 102SUBDATE 102SUBSTR 98SUBTIME 102SUM 110SUPER 263 278Super_priv 163supportsSavepoints 315supportsTransactions 315SYSDATE 28 88 102

T

table 2 19dominante 128fils 56key preserved 184pegravere 56subordonneacutee 128TEMPORARY 19

TABLE_COLLATION 196TABLE_COMMENT 196TABLE_CONSTRAINTS 194 198TABLE_NAME 193Table_name 168Table_priv 168TABLE_PRIVILEGES 194 202TABLE_ROWS 196TABLE_SCHEMA 193 202TABLE_TYPE 195TABLES 195tables_priv 159 168

4055_12_Indexfm Page 395 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

396

copy Eacuteditions Eyrolles

TAN 100tee 13 15TEMPORARY 19TEXT 27TIME 28 42 52 53 102TIME_FORMAT 53TIME_TO_SEC 53 103TIMEDIFF 103TIMESTAMP 28 103TIMESTAMPADD 103TIMESTAMPDIF 103TIMESTAMPDIFF 51TINYBLOB 29TINYINT 27TINYTEXT 27TO_DAYS 103TOAD 368transaction 227TRIGGER_CATALOG 273TRIGGER_NAME 272TRIGGER_SCHEMA 272TRIGGERS 272TRIM 99TRUE 218TRUNCATE 55 100

U

UNDO 249UNHEX 101UNION 116

ALL 116UNIX_TIMESTAMP 53 103UNSIGNED 28UNTIL 220UPDATE 47 54Update_priv 160updater methods 297updateRow 308UPPER 99USAGE 164USE 157use 15user 6 13 152

variables 215

USER_PRIVILEGES 194 201user-defined function 277USING 141UTC_DATE 103UTC_TIME 44 103UTC_TIMESTAMP 103

V

VALUES 54VARBINARY 27VARCHAR 26variable

session 215VARIANCE 110verbose 13version 13VERSION() 12vertical 13VIEW_DEFINITION 191VIEWS 194vue 175vue monotable 177

W

wasNull 319WEEKDAY 103WEEKOFYEAR 103WHERE 48 55WHILE 220WITH CHECK OPTION 176

X

xml 13 145

Y

YEAR 28

Z

ZEROFILL 28

4055_12_Indexfm Page 396 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

  • Table des matiegraveres
  • Remerciements
  • Avant-propos
    • Guide de lecture
      • Premiegravere partie SQL de base
      • Deuxiegraveme partie programmation proceacutedurale
      • Troisiegraveme partie langages et outils
      • Annexe
        • Typographie
        • Contact avec lrsquoauteur ndash Corrigeacutes des exercices
          • Introduction
            • SQL une norme un succegraves
            • Modegravele de donneacutees
              • Tables et donneacutees
              • Les cleacutes
                • MySQL
                  • Un peu drsquohistoire
                  • Offre du moment
                  • Licences
                  • Et la concurrence
                  • Notion de scheacutema (database)
                  • Notion drsquohocircte
                  • Aspects eacutetudieacutes
                    • Mise en oeuvre de MySQL (sous Windows)
                      • Installation
                      • Deacutesinstallation
                      • Reconfiguration
                        • Premiers pas
                          • Lrsquointerface de commande
                          • Creacuteation drsquoun utilisateur
                          • Connexion au serveur
                          • Veacuterification de la version
                          • Options de base
                          • Batch
                          • Votre prompt et vite
                          • Commandes de base
                              • Partie I SQL de base
                                • Chapitre 1 Deacutefinition des donneacutees
                                  • Tables relationnelles
                                    • Creacuteation drsquoune table (CREATE TABLE)
                                    • Deacutelimiteurs
                                    • Sensibiliteacute agrave la casse
                                    • Commentaires
                                    • Premier exemple
                                    • Contraintes
                                    • Conventions recommandeacutees
                                    • Types des colonnes
                                    • Structure drsquoune table (DESCRIBE)
                                    • Restrictions
                                      • Index
                                        • Arbres balanceacutes
                                        • Creacuteation drsquoun index (CREATE INDEX)
                                        • Bilan
                                          • Destruction drsquoun scheacutema
                                            • Suppression drsquoune table (DROP TABLE)
                                            • Ordre des suppressions
                                              • Exercices
                                                • Chapitre 2 Manipulation des donneacutees
                                                  • Insertions drsquoenregistrements (INSERT)
                                                    • Syntaxe
                                                    • Renseigner toutes les colonnes
                                                    • Renseigner certaines colonnes
                                                    • Plusieurs enregistrements
                                                    • Ne pas respecter des contraintes
                                                    • Donneacutees binaires
                                                    • Eacutenumeacuterations
                                                    • Dates et heures
                                                      • Seacutequences
                                                        • Utilisation en tant que cleacute primaire
                                                        • Modification drsquoune seacutequence
                                                        • Utilisation en tant que cleacute eacutetrangegravere
                                                          • Modifications de colonnes
                                                            • Syntaxe (UPDATE)
                                                            • Modification drsquoune colonne
                                                            • Modification de plusieurs colonnes
                                                            • Modification de plusieurs enregistrements
                                                            • Ne pas respecter les contraintes
                                                            • Restrictions
                                                            • Dates et intervalles
                                                              • Remplacement drsquoun enregistrement
                                                              • Suppressions drsquoenregistrements
                                                                • Instruction DELETE
                                                                • Instruction TRUNCATE
                                                                  • Inteacutegriteacute reacutefeacuterentielle
                                                                    • Syntaxe
                                                                    • Coheacuterences assureacutees
                                                                    • Contraintes cocircteacute laquo pegravere raquo
                                                                    • Contraintes cocircteacute laquo fils raquo
                                                                    • Cleacutes composites et nulles
                                                                    • Coheacuterence du fils vers le pegravere
                                                                    • Coheacuterence du pegravere vers le fils
                                                                    • En reacutesumeacute
                                                                      • Insertions agrave partir drsquoun fichier
                                                                      • Exercices
                                                                        • Chapitre 3 Eacutevolution drsquoun scheacutema
                                                                          • Renommer une table (RENAME)
                                                                          • Modifications structurelles (ALTER TABLE)
                                                                            • Ajout de colonnes
                                                                            • Renommer des colonnes
                                                                            • Modifier le type des colonnes
                                                                            • Valeurs par deacutefaut
                                                                            • Supprimer des colonnes
                                                                              • Modifications comportementales
                                                                                • Ajout de contraintes
                                                                                • Suppression de contraintes
                                                                                • Deacutesactivation des contraintes
                                                                                • Reacuteactivation des contraintes
                                                                                • Contraintes diffeacutereacutees
                                                                                  • Exercices
                                                                                    • Chapitre 4 Interrogation des donneacutees
                                                                                      • Geacuteneacuteraliteacutes
                                                                                        • Syntaxe (SELECT)
                                                                                        • Pseudotable
                                                                                          • Projection (eacuteleacutements du SELECT)
                                                                                            • Extraction de toutes les colonnes
                                                                                            • Extraction de certaines colonnes
                                                                                            • Alias
                                                                                            • Duplicatas
                                                                                            • Expressions et valeurs nulles
                                                                                            • Ordonnancement
                                                                                            • Concateacutenation
                                                                                            • Insertion multiligne
                                                                                            • Limitation du nombre de lignes
                                                                                              • Restriction (WHERE)
                                                                                                • Opeacuterateurs de comparaison
                                                                                                • Opeacuterateurs logiques
                                                                                                • Opeacuterateurs inteacutegreacutes
                                                                                                • Alias
                                                                                                  • Fonctions
                                                                                                    • Caractegraveres
                                                                                                    • Numeacuteriques
                                                                                                    • Fonction pour les bits
                                                                                                    • Dates
                                                                                                    • Conversions
                                                                                                    • Comparaisons
                                                                                                    • Eacutenumeacuterations
                                                                                                    • Autres fonctions
                                                                                                      • Regroupements
                                                                                                        • Fonctions de groupe
                                                                                                        • Eacutetude du GROUP BY et HAVING
                                                                                                          • Opeacuterateurs ensemblistes
                                                                                                            • Restrictions
                                                                                                            • Exemple
                                                                                                            • Intersection
                                                                                                            • Opeacuterateurs UNION et UNION ALL
                                                                                                            • Diffeacuterence
                                                                                                            • Ordonner les reacutesultats
                                                                                                            • Produit carteacutesien
                                                                                                            • Bilan
                                                                                                              • Jointures
                                                                                                                • Classification
                                                                                                                • Jointure relationnelle
                                                                                                                • Jointures SQL2
                                                                                                                • Types de jointures
                                                                                                                • Eacutequijointure
                                                                                                                • Autojointure
                                                                                                                • Ineacutequijointure
                                                                                                                • Jointures externes
                                                                                                                • Jointures proceacutedurales
                                                                                                                • Jointures mixtes
                                                                                                                • Sous-interrogations synchroniseacutees
                                                                                                                • Autres directives SQL2
                                                                                                                  • Division
                                                                                                                    • Deacutefinition
                                                                                                                    • Classification
                                                                                                                    • Division inexacte
                                                                                                                    • Division exacte
                                                                                                                      • Reacutesulats en HTML ou XML
                                                                                                                      • Eacutecriture dans un fichier
                                                                                                                      • Exercices
                                                                                                                        • Chapitre 5 Controcircle des donneacutees
                                                                                                                        • Gestion des utilisateurs
                                                                                                                          • Classification
                                                                                                                          • Creacuteation drsquoun utilisateur (CREATE USER)
                                                                                                                          • Modification drsquoun utilisateur
                                                                                                                          • Renommer un utilisateur (RENAME USER)
                                                                                                                          • Suppression drsquoun utilisateur (DROP USER)
                                                                                                                            • Gestion des bases de donneacutees
                                                                                                                              • Creacuteation drsquoune base (CREATE DATABASE)
                                                                                                                              • Seacutelection drsquoune base de donneacutees (USE)
                                                                                                                              • Modification drsquoune base (ALTER DATABASE)
                                                                                                                              • Suppression drsquoune base (DROP DATABASE)
                                                                                                                                • Privilegraveges
                                                                                                                                  • Niveaux de privilegraveges
                                                                                                                                  • Tables de la base mysql
                                                                                                                                  • Table mysqluser
                                                                                                                                  • Attribution de privilegraveges (GRANT)
                                                                                                                                  • Table mysqldb
                                                                                                                                  • Table mysqlhost
                                                                                                                                  • Table mysqltables_priv
                                                                                                                                  • Table mysqlcolumns_priv
                                                                                                                                  • Table mysqlprocs_priv
                                                                                                                                  • Reacutevocation de privilegraveges (REVOKE)
                                                                                                                                  • Attributions et reacutevocations laquo sauvages raquo
                                                                                                                                    • Accegraves distants
                                                                                                                                      • Connexion par lrsquointerface de commande
                                                                                                                                      • Table mysqlhost
                                                                                                                                        • Vues
                                                                                                                                          • Creacuteation drsquoune vue (CREATE VIEW)
                                                                                                                                          • Classification
                                                                                                                                          • Vues monotables
                                                                                                                                          • Vues complexes
                                                                                                                                          • Autres utilisations de vues
                                                                                                                                          • Transmission de droits
                                                                                                                                          • Modification drsquoune vue (ALTER VIEW)
                                                                                                                                          • Visualisation drsquoune vue (SHOW CREATE VIEW)
                                                                                                                                          • Suppression drsquoune vue (DROP VIEW)
                                                                                                                                            • Dictionnaire des donneacutees
                                                                                                                                              • Constitution
                                                                                                                                              • Modegravele graphique du dictionnaire des donneacutees
                                                                                                                                              • Deacutemarche agrave suivre
                                                                                                                                              • Classification des vues
                                                                                                                                              • Bases de donneacutees du serveur
                                                                                                                                              • Composition drsquoune base
                                                                                                                                              • Deacutetail de stockage drsquoune base
                                                                                                                                              • Structure drsquoune table
                                                                                                                                              • Recherche des contraintes drsquoune table
                                                                                                                                              • Composition des contraintes drsquoune table
                                                                                                                                              • Recherche du code source drsquoun sous-programme
                                                                                                                                              • Privilegraveges des utilisateurs drsquoune base de donneacutees
                                                                                                                                              • Commande SHOW
                                                                                                                                                • Exercices
                                                                                                                                                  • Partie II Programmation proceacutedurale
                                                                                                                                                    • Chapitre 6 Bases du langage de programmation
                                                                                                                                                      • Geacuteneacuteraliteacutes
                                                                                                                                                        • Environnement client-serveur
                                                                                                                                                        • Avantages
                                                                                                                                                        • Structure drsquoun bloc
                                                                                                                                                        • Porteacutee des objets
                                                                                                                                                        • Casse et lisibiliteacute
                                                                                                                                                        • Identificateurs
                                                                                                                                                        • Commentaires
                                                                                                                                                          • Variables
                                                                                                                                                            • Variables scalaires
                                                                                                                                                            • Affectations
                                                                                                                                                            • Restrictions
                                                                                                                                                            • Reacutesolution de noms
                                                                                                                                                            • Opeacuterateurs
                                                                                                                                                            • Variables de session
                                                                                                                                                            • Conventions recommandeacutees
                                                                                                                                                              • Test des exemples
                                                                                                                                                              • Structures de controcircle
                                                                                                                                                                • Structures conditionnelles
                                                                                                                                                                • Structures reacutepeacutetitives
                                                                                                                                                                  • Interactions avec la base
                                                                                                                                                                    • Extraire des donneacutees
                                                                                                                                                                    • Manipuler des donneacutees
                                                                                                                                                                      • Transactions
                                                                                                                                                                        • Caracteacuteristiques
                                                                                                                                                                        • Deacutebut et fin drsquoune transaction
                                                                                                                                                                        • Mode de validation
                                                                                                                                                                        • Votre premiegravere transaction
                                                                                                                                                                        • Controcircle des transactions
                                                                                                                                                                        • Transactions imbriqueacutees
                                                                                                                                                                          • Exercices
                                                                                                                                                                            • Chapitre 7 Programmation avanceacutee
                                                                                                                                                                              • Sous-programmes
                                                                                                                                                                                • Geacuteneacuteraliteacutes
                                                                                                                                                                                • Proceacutedures catalogueacutees
                                                                                                                                                                                • Fonctions catalogueacutees
                                                                                                                                                                                • Structure drsquoun sous-programme
                                                                                                                                                                                • Exemples
                                                                                                                                                                                • Fonction nrsquointeragissant pas avec la base
                                                                                                                                                                                • Compilation
                                                                                                                                                                                • Appel drsquoun sous-programme
                                                                                                                                                                                • Reacutecursiviteacute
                                                                                                                                                                                • Sous-programmes imbriqueacutes
                                                                                                                                                                                • Modification drsquoun sous-programme
                                                                                                                                                                                • Destruction drsquoun sous-programme
                                                                                                                                                                                • Restrictions
                                                                                                                                                                                  • Curseurs
                                                                                                                                                                                    • Geacuteneacuteraliteacutes
                                                                                                                                                                                    • Instructions
                                                                                                                                                                                    • Parcours drsquoun curseur
                                                                                                                                                                                    • Accegraves concurrents (FOR UPDATE)
                                                                                                                                                                                    • Restrictions
                                                                                                                                                                                      • Exceptions
                                                                                                                                                                                        • Geacuteneacuteraliteacutes
                                                                                                                                                                                        • Restrictions
                                                                                                                                                                                        • Exceptions avec EXIT
                                                                                                                                                                                        • Exceptions avec CONTINUE
                                                                                                                                                                                        • Gestion des autres erreurs (SQLEXCEPTION)
                                                                                                                                                                                        • Mecircme erreur sur diffeacuterentes instructions
                                                                                                                                                                                        • Exceptions nommeacutees
                                                                                                                                                                                          • Deacuteclencheurs
                                                                                                                                                                                            • Geacuteneacuteraliteacutes
                                                                                                                                                                                            • Agrave quoi sert un deacuteclencheur
                                                                                                                                                                                            • Meacutecanisme geacuteneacuteral
                                                                                                                                                                                            • Syntaxe
                                                                                                                                                                                            • Deacuteclencheurs LMD (de lignes)
                                                                                                                                                                                            • Appel de sous-programmes
                                                                                                                                                                                            • Dictionnaire des donneacutees
                                                                                                                                                                                            • Programmation drsquoune contrainte de veacuterification
                                                                                                                                                                                            • Invalidation dans le deacuteclencheur
                                                                                                                                                                                            • Tables mutantes
                                                                                                                                                                                            • Restrictions
                                                                                                                                                                                            • Suppression drsquoun deacuteclencheur
                                                                                                                                                                                              • SQL dynamique
                                                                                                                                                                                                • Syntaxe
                                                                                                                                                                                                • Exemples
                                                                                                                                                                                                • Restrictions
                                                                                                                                                                                                  • Exercices
                                                                                                                                                                                                      • Partie III Langages et outils
                                                                                                                                                                                                        • Chapitre 8 Utilisation avec Java
                                                                                                                                                                                                          • JDBC avec ConnectorJ
                                                                                                                                                                                                            • Classification des pilotes (drivers)
                                                                                                                                                                                                            • Le paquetage javasql
                                                                                                                                                                                                            • Structure drsquoun programme
                                                                                                                                                                                                            • Test de votre configuration
                                                                                                                                                                                                              • Connexion agrave une base
                                                                                                                                                                                                                • Base Access
                                                                                                                                                                                                                • Base MySQL
                                                                                                                                                                                                                • Interface Connection
                                                                                                                                                                                                                  • Eacutetats drsquoune connexion
                                                                                                                                                                                                                    • Interfaces disponibles
                                                                                                                                                                                                                    • Meacutethodes geacuteneacuteriques pour les paramegravetres
                                                                                                                                                                                                                    • Eacutetats simples (interface Statement)
                                                                                                                                                                                                                    • Meacutethodes agrave utiliser
                                                                                                                                                                                                                      • Correspondances de types
                                                                                                                                                                                                                      • Manipulations avec la base
                                                                                                                                                                                                                        • Suppression de donneacutees
                                                                                                                                                                                                                        • Ajout drsquoenregistrements
                                                                                                                                                                                                                        • Modification drsquoenregistrements
                                                                                                                                                                                                                          • Extraction de donneacutees
                                                                                                                                                                                                                            • Curseurs statiques
                                                                                                                                                                                                                            • Curseurs navigables
                                                                                                                                                                                                                              • Curseurs modifiables
                                                                                                                                                                                                                                • Suppressions
                                                                                                                                                                                                                                • Modifications
                                                                                                                                                                                                                                • Insertions
                                                                                                                                                                                                                                  • Gestion des seacutequences
                                                                                                                                                                                                                                    • Meacutethode getGeneratedKeys
                                                                                                                                                                                                                                    • Curseur modifiable
                                                                                                                                                                                                                                      • Interface ResultSetMetaData
                                                                                                                                                                                                                                      • Interface DatabaseMetaData
                                                                                                                                                                                                                                      • Instructions parameacutetreacutees (PreparedStatement)
                                                                                                                                                                                                                                        • Extraction de donneacutees (executeQuery)
                                                                                                                                                                                                                                        • Mises agrave jour (executeUpdate)
                                                                                                                                                                                                                                        • Instruction LDD (execute)
                                                                                                                                                                                                                                          • Proceacutedures catalogueacutees
                                                                                                                                                                                                                                            • Exemple
                                                                                                                                                                                                                                              • Transactions
                                                                                                                                                                                                                                                • Points de validation
                                                                                                                                                                                                                                                  • Traitement des exceptions
                                                                                                                                                                                                                                                    • Affichage des erreurs
                                                                                                                                                                                                                                                    • Traitement des erreurs
                                                                                                                                                                                                                                                      • Exercices
                                                                                                                                                                                                                                                        • Chapitre 9 Utilisation avec PHP
                                                                                                                                                                                                                                                          • Configuration adopteacutee
                                                                                                                                                                                                                                                            • Logiciels
                                                                                                                                                                                                                                                            • Fichiers de configuration
                                                                                                                                                                                                                                                            • Test drsquoApache et de PHP
                                                                                                                                                                                                                                                            • Test drsquoApache de PHP et de MySQL
                                                                                                                                                                                                                                                              • API de PHP pour MySQL
                                                                                                                                                                                                                                                                • Connexion
                                                                                                                                                                                                                                                                • Interactions avec la base
                                                                                                                                                                                                                                                                • Extractions
                                                                                                                                                                                                                                                                • Instructions parameacutetreacutees
                                                                                                                                                                                                                                                                • Gestion des seacutequences
                                                                                                                                                                                                                                                                • Traitement des erreurs
                                                                                                                                                                                                                                                                • Proceacutedures catalogueacutees
                                                                                                                                                                                                                                                                • Meacutetadonneacutees
                                                                                                                                                                                                                                                                  • Exercices
                                                                                                                                                                                                                                                                    • Chapitre 10 Outils graphiques
                                                                                                                                                                                                                                                                      • MySQL Administrator
                                                                                                                                                                                                                                                                        • Connexion
                                                                                                                                                                                                                                                                        • Connexion nommeacutee
                                                                                                                                                                                                                                                                        • Liste des accegraves utilisateur
                                                                                                                                                                                                                                                                        • Gestion des privilegraveges
                                                                                                                                                                                                                                                                        • Caracteacuteristiques systegraveme
                                                                                                                                                                                                                                                                        • Options scripts SQL
                                                                                                                                                                                                                                                                        • Composition drsquoune base
                                                                                                                                                                                                                                                                        • Composition drsquoune table
                                                                                                                                                                                                                                                                        • Composition des index
                                                                                                                                                                                                                                                                        • Modification drsquoun scheacutema
                                                                                                                                                                                                                                                                        • Restriction
                                                                                                                                                                                                                                                                          • MySQL Query Browser
                                                                                                                                                                                                                                                                            • Fenecirctre principale
                                                                                                                                                                                                                                                                            • Extraction
                                                                                                                                                                                                                                                                            • Modification
                                                                                                                                                                                                                                                                              • phpMyAdmin
                                                                                                                                                                                                                                                                                • Composition de la base
                                                                                                                                                                                                                                                                                • Structure drsquoune table
                                                                                                                                                                                                                                                                                • Administrer une table
                                                                                                                                                                                                                                                                                • Extractions
                                                                                                                                                                                                                                                                                • Rechercher
                                                                                                                                                                                                                                                                                • Exporter
                                                                                                                                                                                                                                                                                • Utilisateurs
                                                                                                                                                                                                                                                                                  • TOAD for MySQL
                                                                                                                                                                                                                                                                                    • Administration
                                                                                                                                                                                                                                                                                    • Instructions en ligne
                                                                                                                                                                                                                                                                                    • Deacuteveloppement
                                                                                                                                                                                                                                                                                    • Creacuteation drsquoobjets
                                                                                                                                                                                                                                                                                    • Recherche drsquoobjets
                                                                                                                                                                                                                                                                                    • Exportations
                                                                                                                                                                                                                                                                                      • Navicat
                                                                                                                                                                                                                                                                                        • Creacuteation drsquoune table
                                                                                                                                                                                                                                                                                        • Deacutefinition drsquoune contrainte
                                                                                                                                                                                                                                                                                        • Creacuteation drsquoune requecircte
                                                                                                                                                                                                                                                                                        • Importation
                                                                                                                                                                                                                                                                                        • Gestion des utilisateurs
                                                                                                                                                                                                                                                                                          • MySQL Manager
                                                                                                                                                                                                                                                                                            • Creacuteation drsquoune table
                                                                                                                                                                                                                                                                                            • Creacuteation drsquoune requecircte
                                                                                                                                                                                                                                                                                            • Proceacutedures catalogueacutees
                                                                                                                                                                                                                                                                                            • Gestion des utilisateurs
                                                                                                                                                                                                                                                                                            • Gestion des privilegraveges
                                                                                                                                                                                                                                                                                              • Bilan
                                                                                                                                                                                                                                                                                                  • Annexe Bibliographie et webographie
                                                                                                                                                                                                                                                                                                  • Index
Page 2: CHEZ LE MÊME ÉDITEUR

EacuteDITIONS EYROLLES61 bd Saint-Germain75240 Paris Cedex 05

wwweditions-eyrollescom

Le code de la proprieacuteteacute intellectuelle du 1er juillet 1992 interdit en effet expresseacutement la photocopie agrave usage collectif sans autorisation des ayants droit Or cette pratique srsquoest geacuteneacuteraliseacutee notamment dans les eacutetablissements drsquoenseignement provoquant une baisse brutale des achats de livres au point que la possibiliteacute mecircme pour les auteurs de creacuteer des œuvres nouvelles et de les faire eacutediter correctement est aujourdrsquohui menaceacuteeEn application de la loi du 11 mars 1957 il est interdit de reproduire inteacutegralement ou partiellement le

preacutesent ouvrage sur quelque support que ce soit sans autorisation de lrsquoeacutediteur ou du Centre Franccedilais drsquoExploitation du Droit de Copie 20 rue des Grands-Augustins 75006 Pariscopy Groupe Eyrolles 2006 ISBN 2-212-11915-1

Pour Aureacutelia mon chat aux yeux si bleus si verts si gris

Pour Reneacute et Lydie Jean et Denise qui sont devenus mes parents

4055_00a_Dedi Page V Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

4055_00a_Dedi Page VI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

VII

Table des matiegraveres

Remerciements XVII

Avant-propos XIX

Guide de lecture

XXPremiegravere partie SQL de base XXDeuxiegraveme partie programmation proceacutedurale XXTroisiegraveme partie langages et outils XXAnnexe XX

Typographie

XXI

Contact avec lrsquoauteur ndash Corrigeacutes des exercices

XXII

Introduction 1

SQL une norme un succegraves

1

Modegravele de donneacutees

2Tables et donneacutees 2Les cleacutes 3

MySQL

3Un peu drsquohistoire 4Offre du moment 5Licences 6Et la concurrence 6Notion de scheacutema (database) 6Notion drsquohocircte 7Aspects eacutetudieacutes 8

Mise en œuvre de MySQL (sous Windows)

9Installation 9Deacutesinstallation 10Reconfiguration 10

Premiers pas

10Lrsquointerface de commande 10Creacuteation drsquoun utilisateur 11Connexion au serveur 12Veacuterification de la version 12Options de base 13Batch 14Votre prompt et vite 14Commandes de base 15

4055_00b_TDMfm Page VII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

VIII

copy Eacuteditions Eyrolles

Partie I SQL de base 17

1 Deacutefinition des donneacutees 19

Tables relationnelles

19Creacuteation drsquoune table (

CREATE TABLE

) 19Deacutelimiteurs 20Sensibiliteacute agrave la casse 20Commentaires 21Premier exemple 22Contraintes 23Conventions recommandeacutees 24Types des colonnes 26Structure drsquoune table (

DESCRIBE

) 29Restrictions 30

Index

30Arbres balanceacutes 31Creacuteation drsquoun index (

CREATE INDEX

) 32Bilan 33

Destruction drsquoun scheacutema

33Suppression drsquoune table (

DROP TABLE

) 33Ordre des suppressions 34

Exercices

35

2 Manipulation des donneacutees 37

Insertions drsquoenregistrements (

INSERT

)

37Syntaxe 37Renseigner toutes les colonnes 38Renseigner certaines colonnes 38Plusieurs enregistrements 39Ne pas respecter des contraintes 39Donneacutees binaires 40Eacutenumeacuterations 40Dates et heures 41

Seacutequences

44Utilisation en tant que cleacute primaire 44Modification drsquoune seacutequence 45Utilisation en tant que cleacute eacutetrangegravere 46

Modifications de colonnes

47Syntaxe (

UPDATE

) 47Modification drsquoune colonne 48Modification de plusieurs colonnes 48Modification de plusieurs enregistrements 48Ne pas respecter les contraintes 48

4055_00b_TDMfm Page VIII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

IX

Table des matiegraveres Apprendre SQL avec MySQL

Restrictions 50Dates et intervalles 50

Remplacement drsquoun enregistrement

54

Suppressions drsquoenregistrements

54Instruction

DELETE

54Instruction

TRUNCATE

55

Inteacutegriteacute reacutefeacuterentielle

56Syntaxe 56Coheacuterences assureacutees 56Contraintes cocircteacute laquo pegravere raquo 57Contraintes cocircteacute laquo fils raquo 58Cleacutes composites et nulles 58Coheacuterence du fils vers le pegravere 59Coheacuterence du pegravere vers le fils 60En reacutesumeacute 62

Insertions agrave partir drsquoun fichier

62

Exercices

64

3 Eacutevolution drsquoun scheacutema 67

Renommer une table (

RENAME

)

67

Modifications structurelles (

ALTER TABLE

)

68Ajout de colonnes 68Renommer des colonnes 69Modifier le type des colonnes 69Valeurs par deacutefaut 70Supprimer des colonnes 70

Modifications comportementales

71Ajout de contraintes 71Suppression de contraintes 73Deacutesactivation des contraintes 75Reacuteactivation des contraintes 77Contraintes diffeacutereacutees 79

Exercices

80

4 Interrogation des donneacutees 83

Geacuteneacuteraliteacutes

83Syntaxe (

SELECT

) 84Pseudotable 84

Projection (eacuteleacutements du

SELECT

)

85Extraction de toutes les colonnes 86Extraction de certaines colonnes 86Alias 87Duplicatas 87

4055_00b_TDMfm Page IX Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

X

copy Eacuteditions Eyrolles

Expressions et valeurs nulles 88Ordonnancement 89Concateacutenation 89Insertion multiligne 90Limitation du nombre de lignes 90

Restriction (

WHERE

)

91Opeacuterateurs de comparaison 92Opeacuterateurs logiques 93Opeacuterateurs inteacutegreacutes 93Alias 95

Fonctions

95Caractegraveres 95Numeacuteriques 99Fonction pour les bits 100Dates 101Conversions 105Comparaisons 106Eacutenumeacuterations 107Autres fonctions 108

Regroupements

109Fonctions de groupe 110Eacutetude du

GROUP BY

et

HAVING

111

Opeacuterateurs ensemblistes

114Restrictions 114Exemple 115Intersection 115Opeacuterateurs

UNION

et

UNION ALL

116Diffeacuterence 117Ordonner les reacutesultats 118Produit carteacutesien 119Bilan 120

Jointures

121Classification 121Jointure relationnelle 122Jointures SQL2 122Types de jointures 123Eacutequijointure 123Autojointure 125Ineacutequijointure 127Jointures externes 128Jointures proceacutedurales 132Jointures mixtes 136Sous-interrogations synchroniseacutees 137Autres directives SQL2 140

4055_00b_TDMfm Page X Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XI

Table des matiegraveres Apprendre SQL avec MySQL

Division

142Deacutefinition 143Classification 143Division inexacte 144Division exacte 144

Reacutesulats en HTML ou XML

145

Eacutecriture dans un fichier

146

Exercices

147

5 Controcircle des donneacutees 151

Gestion des utilisateurs

152Classification 152Creacuteation drsquoun utilisateur (

CREATE USER

) 152Modification drsquoun utilisateur 154Renommer un utilisateur (

RENAME USER

) 154Suppression drsquoun utilisateur (

DROP USER

) 155

Gestion des bases de donneacutees

155Creacuteation drsquoune base (

CREATE DATABASE

) 156Seacutelection drsquoune base de donneacutees (

USE

) 157Modification drsquoune base (

ALTER DATABASE

) 158Suppression drsquoune base (

DROP DATABASE

) 158

Privilegraveges

158Niveaux de privilegraveges 159Tables de la base

mysql

159Table

mysqluser

160Attribution de privilegraveges (

GRANT

) 163Table

mysqldb

167Table

mysqlhost

167Table

mysqltables_priv

168Table

mysqlcolumns_priv

168Table

mysqlprocs_priv

168Reacutevocation de privilegraveges (

REVOKE

) 170Attributions et reacutevocations laquo sauvages raquo 172

Accegraves distants

172Connexion par lrsquointerface de commande 173Table

mysqlhost

173

Vues

175Creacuteation drsquoune vue (

CREATE VIEW

) 176Classification 177Vues monotables 177Vues complexes 181Autres utilisations de vues 185Transmission de droits 188Modification drsquoune vue (

ALTER VIEW

) 188

4055_00b_TDMfm Page XI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

XII

copy Eacuteditions Eyrolles

Visualisation drsquoune vue (

SHOW CREATE VIEW

) 189Suppression drsquoune vue (

DROP VIEW

) 189

Dictionnaire des donneacutees

190Constitution 190Modegravele graphique du dictionnaire des donneacutees 191Deacutemarche agrave suivre 191Classification des vues 193Bases de donneacutees du serveur 194Composition drsquoune base 195Deacutetail de stockage drsquoune base 195Structure drsquoune table 196Recherche des contraintes drsquoune table 198Composition des contraintes drsquoune table 199Recherche du code source drsquoun sous-programme 200Privilegraveges des utilisateurs drsquoune base de donneacutees 201Commande

SHOW

203

Exercices

205

Partie II Programmation proceacutedurale 207

6 Bases du langage de programmation 209Geacuteneacuteraliteacutes 209

Environnement client-serveur 209Avantages 210Structure drsquoun bloc 210Porteacutee des objets 211Casse et lisibiliteacute 211Identificateurs 212Commentaires 212

Variables 212Variables scalaires 213Affectations 213Restrictions 213Reacutesolution de noms 214Opeacuterateurs 214Variables de session 215Conventions recommandeacutees 215

Test des exemples 216Structures de controcircle 217

Structures conditionnelles 217Structures reacutepeacutetitives 219

Interactions avec la base 222Extraire des donneacutees 223Manipuler des donneacutees 224

4055_00b_TDMfm Page XII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles XIII

Table des matiegraveres Apprendre SQL avec MySQL

Transactions 227Caracteacuteristiques 227Deacutebut et fin drsquoune transaction 228Mode de validation 228Votre premiegravere transaction 228Controcircle des transactions 229Transactions imbriqueacutees 230

Exercices 231

7 Programmation avanceacutee 233

Sous-programmes 233Geacuteneacuteraliteacutes 233Proceacutedures catalogueacutees 234Fonctions catalogueacutees 235Structure drsquoun sous-programme 236Exemples 236Fonction nrsquointeragissant pas avec la base 238Compilation 239Appel drsquoun sous-programme 239Reacutecursiviteacute 241Sous-programmes imbriqueacutes 242Modification drsquoun sous-programme 243Destruction drsquoun sous-programme 243Restrictions 244

Curseurs 244Geacuteneacuteraliteacutes 244Instructions 245Parcours drsquoun curseur 246Accegraves concurrents (FOR UPDATE) 247Restrictions 248

Exceptions 248Geacuteneacuteraliteacutes 248Restrictions 250Exceptions avec EXIT 250Exceptions avec CONTINUE 254Gestion des autres erreurs (SQLEXCEPTION) 255Mecircme erreur sur diffeacuterentes instructions 257Exceptions nommeacutees 260

Deacuteclencheurs 262Geacuteneacuteraliteacutes 262Agrave quoi sert un deacuteclencheur 262Meacutecanisme geacuteneacuteral 263Syntaxe 263Deacuteclencheurs LMD (de lignes) 264

4055_00b_TDMfm Page XIII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

XIV copy Eacuteditions Eyrolles

Appel de sous-programmes 271Dictionnaire des donneacutees 272Programmation drsquoune contrainte de veacuterification 273Invalidation dans le deacuteclencheur 275Tables mutantes 277Restrictions 278Suppression drsquoun deacuteclencheur 278

SQL dynamique 278Syntaxe 279Exemples 280Restrictions 281

Exercices 284

Partie III Langages et outils 287

8 Utilisation avec Java 289

JDBC avec ConnectorJ 289Classification des pilotes (drivers) 290Le paquetage javasql 291Structure drsquoun programme 291Test de votre configuration 292

Connexion agrave une base 293Base Access 294Base MySQL 295Interface Connection 295

Eacutetats drsquoune connexion 296Interfaces disponibles 296Meacutethodes geacuteneacuteriques pour les paramegravetres 296Eacutetats simples (interface Statement) 297Meacutethodes agrave utiliser 298

Correspondances de types 298Manipulations avec la base 300

Suppression de donneacutees 300Ajout drsquoenregistrements 301Modification drsquoenregistrements 301

Extraction de donneacutees 301Curseurs statiques 302Curseurs navigables 303

Curseurs modifiables 307Suppressions 309Modifications 310Insertions 310

4055_00b_TDMfm Page XIV Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles XV

Table des matiegraveres Apprendre SQL avec MySQL

Gestion des seacutequences 311Meacutethode getGeneratedKeys 312Curseur modifiable 312

Interface ResultSetMetaData 313Interface DatabaseMetaData 314Instructions parameacutetreacutees (PreparedStatement) 316

Extraction de donneacutees (executeQuery) 316Mises agrave jour (executeUpdate) 317Instruction LDD (execute) 317

Proceacutedures catalogueacutees 318Exemple 319

Transactions 320Points de validation 321

Traitement des exceptions 322Affichage des erreurs 323Traitement des erreurs 323

Exercices 325

9 Utilisation avec PHP 327Configuration adopteacutee 327

Logiciels 327Fichiers de configuration 327Test drsquoApache et de PHP 328Test drsquoApache de PHP et de MySQL 329

API de PHP pour MySQL 329Connexion 330Interactions avec la base 330Extractions 332Instructions parameacutetreacutees 335Gestion des seacutequences 337Traitement des erreurs 337Proceacutedures catalogueacutees 339Meacutetadonneacutees 340

Exercices 344

10 Outils graphiques 349MySQL Administrator 349

Connexion 349Connexion nommeacutee 350Liste des accegraves utilisateur 351Gestion des privilegraveges 351Caracteacuteristiques systegraveme 352Options scripts SQL 353Composition drsquoune base 354

4055_00b_TDMfm Page XV Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

XVI copy Eacuteditions Eyrolles

Composition drsquoune table 355Composition des index 356Modification drsquoun scheacutema 356Restriction 358

MySQL Query Browser 359Fenecirctre principale 359Extraction 360Modification 361

phpMyAdmin 362Composition de la base 363Structure drsquoune table 364Administrer une table 364Extractions 365Rechercher 366Exporter 367Utilisateurs 368

TOAD for MySQL 368Administration 369Instructions en ligne 370Deacuteveloppement 371Creacuteation drsquoobjets 371Recherche drsquoobjets 373Exportations 374

Navicat 374Creacuteation drsquoune table 375Deacutefinition drsquoune contrainte 376Creacuteation drsquoune requecircte 377Importation 378Gestion des utilisateurs 378

MySQL Manager 379Creacuteation drsquoune table 380Creacuteation drsquoune requecircte 382Proceacutedures catalogueacutees 382Gestion des utilisateurs 383Gestion des privilegraveges 383

Bilan 384

Annexe bibliographie et webographie 385

Index 387

4055_00b_TDMfm Page XVI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XVII

Remerciements

Je nrsquoai que deux personnes agrave remercier Il srsquoagit de deux jeunes informaticiens rencontreacutes auhasard drsquoun forum Ils sont talentueux et deacutesinteacuteresseacutes ce qui devient tellement rare dans cemonde drsquoindividualisme exacerbeacute Le premier recherchait un emploi agrave la peacuteriode de la reacutedac-tion souhaitons qursquoil trouve clavier agrave ses mains Le second dirige la rubrique MySQL du siteDeveloppezcom

Merci Pierre Caboche pour la lecture de la premiegravere moitieacute de lrsquoouvrage pour tes remarquesque jrsquoai (presque) toutes prises en compte pour les compleacutements en ligne agrave propos des opeacutera-teurs ensemblistes dans les requecirctes

Merci Guillaume Lebur pour tous tes commentaires de qualiteacute et pour tes corrections agravepropos de la programmation sous MySQL Merci pour ton activiteacute et tes tutoriels mis en lignesur le site de Developpezcom

4055_00c_Lim Page XVII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

4055_00c_Lim Page XVIII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XIX

Avant-propos

Nombre drsquoouvrages traitent de SQL et de MySQL certains reacutesultent drsquoune traduction hasar-deuse et sans vocation peacutedagogique drsquoautres ressemblent agrave des Bottin teacuteleacutephoniques ouproviennent de la traduction de la documentation officielle en moins bien Les survivants nesont peut-ecirctre plus vraiment agrave jour

Ce livre a eacuteteacute reacutedigeacute avec une volonteacute de concision et de progression dans sa deacutemarche il estillustreacute par ailleurs de nombreux exemples et figures Bien que la source principale drsquoinforma-tions fucirct la documentation officielle de MySQL (httpdevmysqlcomdoc) lrsquoouvrage neconstitue pas un condenseacute de commandes SQL Chaque notion importante est introduite parun exemple simple et que jrsquoespegravere deacutemonstratif En fin de chaque chapitre des exercices vouspermettront de tester vos connaissances

La documentation en ligne de MySQL (

MySQL 5 Reference Manual

) repreacutesente une dizainede meacutegaoctets au format HTML Tous les concepts srsquoy trouvant ne pourraient pas ecirctre icideacutecemment expliqueacutes sauf peut-ecirctre si cet ouvrage ressemblait agrave un annuaire Jrsquoai tenteacute drsquoenextraire seulement les aspects fondamentaux sous la forme drsquoune synthegravese

Vous nrsquoy trouverez donc pas des consideacuterations agrave propos drsquoaspects avanceacutes du langage ou duserveur comme lrsquooptimisation de requecirctes la restauration drsquoune base la reacuteplication la versiondu serveur agrave partir de laquelle telle ou telle fonction est apparue etc

Ce livre reacutesulte de mon expeacuterience de lrsquoenseignement dans le domaine des bases de donneacuteesen premier deuxiegraveme et troisiegraveme cycles universitaires dans des cursus drsquoinformatique agravevocation professionnelle (IUT licences et masters professionnels)

Cet ouvrage srsquoadresse principalement aux novices deacutesireux de deacutecouvrir SQL en program-mant sous MySQL

Les eacutetudiants et enseignants trouveront des exemples peacutedagogiques pour chaque conceptabordeacute ainsi que des exercices theacutematiques

Les deacuteveloppeurs PHP ou Java deacutecouvriront des moyens de stocker leurs donneacutees

4055_00c_Lim Page XIX Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

XX

copy Eacuteditions Eyrolles

Guide de lecture

Ce livre srsquoorganise autour de trois parties distinctes mais compleacutementaires La premiegravere inteacute-ressera le lecteur deacutebutant en la matiegravere car elle concerne les instructions SQL et les notionsde base de MySQL La deuxiegraveme partie deacutecrit la programmation avec le langage proceacuteduralde MySQL La troisiegraveme partie attirera lrsquoattention des programmeurs qui envisagent drsquoutiliserMySQL agrave lrsquoaide drsquooutils natifs ou tout en programmant avec des langages eacutevolueacutes ou via desinterfaces Web (PHP ou Java)

Premiegravere partie SQL de base

Cette partie preacutesente les diffeacuterents aspects du langage SQL de MySQL en eacutetudiant en deacutetailles instructions de base Agrave partir drsquoexemples jrsquoexplique notamment comment deacuteclarer mani-puler faire eacutevoluer et interroger des tables avec leurs diffeacuterentes caracteacuteristiques et leurseacuteleacutements associeacutes (contraintes index vues seacutequences) Nous eacutetudions aussi SQL dans uncontexte multi-utilisateur (droits drsquoaccegraves) et au niveau du dictionnaire de donneacutees

Deuxiegraveme partie programmation proceacutedurale

Cette partie deacutecrit les caracteacuteristiques du langage proceacutedural de MySQL Le chapitre 6 traitedes eacuteleacutements de base (structure drsquoun programme variables structures de controcircle interactionsavec la base et transactions) Le chapitre 7 traite des sous-programmes des curseurs de lagestion des exceptions des deacuteclencheurs et de lrsquoutilisation du SQL dynamique

Troisiegraveme partie langages et outils

Cette partie inteacuteressera les programmeurs qui envisagent drsquoexploiter une base MySQL enutilisant un langage de programmation Le chapitre 8 deacutetaille lrsquoAPI JDBC 30 qui permet demanipuler une base MySQL 5 par lrsquointermeacutediaire drsquoun programme Java Le chapitre 9 deacutecritles principales fonctions de lrsquoAPI

mysqli

qui permet drsquointerfacer un programme PHP 5 avecune base MySQL 5

Le chapitre 10 syntheacutetise les fonctionnaliteacutes de plusieurs outils graphiques tels que

MySQLAdministrator

MySQL Query Browser

et

phpMyAdmin

Drsquoautres consoles graphiquesdrsquoadministration sont eacutetudieacutees agrave savoir

Toad

for MySQL

Navicat

et

EMS SQL Manager

Annexe

Lrsquoannexe contient une bibliographie et des adresses Web

4055_00c_Lim Page XX Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XXI

Avant-propos

Typographie

La police

courrier

est utiliseacutee pour souligner les instructions SQL noms de types tablescontraintes etc (ex

SELECT nom FROM Pilote

)

Les majuscules sont employeacutees pour les directives SQL et les minuscules pour les autreseacuteleacutements Les noms des tables index vues fonctions proceacutedureshellip sont preacuteceacutedeacutes drsquounemajuscule (exemple la table

CompagnieAerienne

contient la colonne

nomComp

)

Les termes de MySQL (bien souvent traduits litteacuteralement de lrsquoanglais) sont noteacutes en italiqueexemple

trigger

table

column

etc

Dans une instruction SQL les symboles deacutesignent une liste drsquoeacuteleacutements et le symbole laquo | raquoun choix (exemple

CREATE

TABLE

|

VIEW

Les symboles laquo [ raquo et laquo ] raquo preacutecisent le carac-tegravere optionnel drsquoune directive au sein drsquoune commande (exemple

CREATE[UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ONtable_name (index_col_namehellip)

)

Ce sigle introduit une deacutefinition un concept ou une remarque importante Il apparaicirct soit dansune partie theacuteorique soit dans une partie technique pour souligner des instructions importantes

ou la marche agrave suivre avec SQL

Ce sigle annonce soit une impossibiliteacute de mise en œuvre drsquoun concept soit une mise en gardeIl est principalement utiliseacute dans la partie consacreacutee agrave SQL

Jrsquoen profite pour faire passer le message suivant si vous travaillez en version 4 de MySQLcertaines instructions deacutecrites dans ce livre ne fonctionneront pas Cet ouvrage nrsquoest pas unguide de reacutefeacuterence Vous trouverez sur le Web des ressources pour connaicirctre la compatibiliteacute

de telle ou telle fonction SQL

Ce sigle indique que le code source est teacuteleacutechargeable agrave partir du site des eacuteditions Eyrolles(wwweyrollescom) Cela est valable pour les exercices corrigeacutes mais aussi pour tous les

exemples du livre

Ce sigle signale une astuce ou un conseil personnel

Web

4055_00c_Lim Page XXI Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

XXII

copy Eacuteditions Eyrolles

Contact avec lrsquoauteur ndash Corrigeacutes des exercices

Si vous avez des remarques agrave formuler sur le contenu de cet ouvrage nrsquoheacutesitez pas agrave mrsquoeacutecrireagrave lrsquoadresse

soutouiut-blagnacfr

Ne me demandez pas de deacuteboguer votre proceacutedurecatalogueacutee ou drsquooptimiser une de vos requecircteshellip Seules les remarques relatives agrave lrsquoouvragetrouveront une reacuteponse

Par ailleurs un site drsquoaccompagnement de lrsquoouvrage (

errata

corrigeacutes des exercices sourcedes exemples et compleacutements) est en ligne et accessible via wwweditions-eyrollescom

4055_00c_Lim Page XXII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

1

Introduction

Dans cette introduction nous preacutesentons tout drsquoabord le cadre geacuteneacuteral dans lequel cetouvrage se positionne (SQL le modegravele de donneacutees et lrsquooffre MySQL) Nous deacutecrivons pourfinir la proceacutedure drsquoinstallation de MySQL sous Windows et lrsquoutilisation de lrsquointerface decommande en ligne pour que vous puissiez programmer en SQL degraves le chapitre 1

SQL une norme un succegraves

Crsquoest IBM

agrave tout seigneur tout honneur

qui avec System-R a implanteacute le modegravele relationnelau travers du langage SEQUEL (

Stuctured English as QUEry Language

) rebaptiseacute par lasuite SQL (

Structured Query Language

)

La premiegravere norme (SQL1) date de 1987 Elle eacutetait le reacutesultat de compromis entre construc-teurs mais elle eacutetait fortement influenceacutee par le dialecte drsquoIBM SQL2 a eacuteteacute normaliseacutee en1992 Elle deacutefinit quatre niveaux de conformiteacute le niveau drsquoentreacutee (

entry level

) les niveauxintermeacutediaires (

transitional

et

intermediate levels

) et le niveau supeacuterieur (

full level

) Leslangages SQL des principaux eacutediteurs sont tous conformes au premier niveau et ont beaucoupde caracteacuteristiques relevant des niveaux supeacuterieurs Depuis 1999 la norme est appeleacutee SQL3Elle comporte de nombreuses parties (concepts objets entrepocircts de donneacutees seacuteries temporel-les accegraves agrave des sources non SQL reacuteplication des donneacutees etc)

Le succegraves que connaissent les eacutediteurs de SGBD relationnels a plusieurs origines et reposenotamment sur SQL

Le langage est une norme depuis 1986 qui srsquoenrichit au fil du temps

SQL peut srsquointerfacer avec des langages de troisiegraveme geacuteneacuteration comme C ou Cobol maisaussi avec des langages plus eacutevolueacutes comme C++ Java ou C Certains considegraverent ainsique le langage SQL nrsquoest pas assez complet (le dialogue entre la base et lrsquointerface nrsquoestpas direct) et la litteacuterature parle de laquo deacutefaut drsquoimpeacutedance raquo (

impedance mismatch

)

Les SGBD rendent indeacutependants programmes et donneacutees (la modification drsquoune structure dedonneacutees nrsquoentraicircne pas forceacutement une importante refonte des programmes drsquoapplication)

Ces systegravemes sont bien adapteacutes aux grandes applications informatiques de gestion (archi-tectures type client-serveur et Internet) et ont acquis une maturiteacute sur le plan de la fiabiliteacuteet des performances

Ils integravegrent des outils de deacuteveloppement comme les preacutecompilateurs les geacuteneacuterateurs decode drsquoeacutetats de formulaires

4055_00d_Intro Page 1 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

2

copy Eacuteditions Eyrolles

Ils offrent la possibiliteacute de stocker des informations non structureacutees (comme le textelrsquoimage etc) dans des champs appeleacutes LOB (

Large Object Binary

)

Nous eacutetudierons les principales instructions SQL de MySQL qui sont classifieacutees dans letableau suivant

Modegravele de donneacutees

Le modegravele de donneacutees relationnelles repose sur une theacuteorie rigoureuse bien qursquoadoptant desprincipes simples La table relationnelle (

relational table

) est la structure de donneacutees de basequi contient des enregistrements appeleacutes aussi laquo lignes raquo (

rows

) Une table est composeacutee decolonnes (

columns

) qui deacutecrivent les enregistrements

Tables et donneacutees

Consideacuterons la figure suivante qui preacutesente deux tables relationnelles permettant de stockerdes compagnies des pilotes et le fait qursquoun pilote soit embaucheacute par une compagnie

Tableau 0-1 Classification des ordres SQL

Ordres SQL Aspect du langage

CREATE ndash ALTER ndash DROP - RENAME ndash TRUNCATE

Deacutefinition des donneacutees (LDD)

INSERT ndash UPDATE ndash DELETE - LOCK TABLE

Manipulation des donneacutees (LMD)

SELECT

Interrogation des donneacutees (LID)

GRANT ndash REVOKE ndash COMMIT ndash ROLLBACK ndash SAVEPOINT - SET TRANSACTION

Controcircle des donneacutees (LCD)

Figure 0-1

Deux tables

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

4055_00d_Intro Page 2 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

3

Introduction

Les cleacutes

La cleacute primaire (

primary key

) drsquoune table est lrsquoensemble minimal de colonnes qui permet

drsquoidentifier de maniegravere unique chaque enregistrement

Dans la figure preacuteceacutedente les colonnes laquo cleacutes primaires raquo sont noteacutees en gras La colonne

comp

repreacutesente le code de la compagnie et la colonne

brevet

deacutecrit le numeacutero du brevet

Une cleacute est dite laquo candidate raquo (

candidate key

) si elle peut se substituer agrave la cleacute primaire agrave tout

instant Une table peut contenir plusieurs cleacutes candidates ou aucune

Dans notre exemple les colonnes

nomComp

et

nom

peuvent ecirctre des cleacutes candidates si onsuppose qursquoaucun homonyme nrsquoest permis

Une cleacute eacutetrangegravere (

foreign key

) reacutefeacuterence dans la majoriteacute des cas une cleacute primaire drsquoune autretable (sinon une cleacute candidate sur laquelle un index unique aura eacuteteacute deacutefini) Une cleacute eacutetrangegravereest composeacutee drsquoune ou de plusieurs colonnes Une table peut contenir plusieurs cleacutes eacutetrangegrave-

res ou aucune

Dans notre exemple la colonne

compa

(noteacutee en italique dans la figure) est une cleacute eacutetrangegraverecar elle permet de reacutefeacuterencer un enregistrement unique de la table

Compagnie

via la cleacuteprimaire

comp

Le modegravele relationnel est ainsi fondamentalement baseacute sur les valeurs Les associations entretables sont toujours binaires et assureacutees par les cleacutes eacutetrangegraveres Les theacuteoriciens considegraverentcelles-ci comme des pointeurs logiques Les cleacutes primaires et eacutetrangegraveres seront deacutefinies dansles tables en SQL agrave lrsquoaide de contraintes

MySQL

MySQL est agrave la fois le nom du SGBD et le nom de la socieacuteteacute (qui se nomme en faitMySQL AB deacutecrite sur httpwwwmysqlcom) dont le siegravege se trouve en Suegravede agrave Uppsala ndashcompter une cinquantaine de kilomegravetres au nord de Stockholm Selon leurs dires leur serveurde donneacutees qui est eacutecrit en C et C++ serait installeacute de faccedilon opeacuterationnelle sur plus de sixmillions de sites Drsquoun point de vue coucirct lrsquoutilisation du SGBD sur des projets importants(entre 250 000

euro

et 500 000

euro

) ferait eacuteconomiser 90 sur le prix des licences du serveur60 sur les ressources systegraveme 70 sur le prix du mateacuteriel 50 sur les tacircches drsquoadminis-tration et de support

4055_00d_Intro Page 3 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

4

copy Eacuteditions Eyrolles

Par analogie avec les systegravemes drsquoexploitation depuis 1999 MySQL connaicirct le succegraves deLinux Teacuteleacutechargeacutee pregraves drsquoun million de fois en trois semaines (en octobre 2005) la version

production

de MySQL doit sa populariteacute du fait de son caractegravere

open source

de ses fonction-naliteacutes de plus en plus riches de ses performances de son ouverture agrave tous les principauxlangages du marcheacute de son fonctionnement sur les systegravemes les plus courants (les distribu-tions classiques de Linux Windows Mac OS BSD Novell et les deacuteriveacutes drsquoUnix) et de safaciliteacute drsquoutilisation pour des applications Web de taille moyenne

Un peu drsquohistoire

Le tableau suivant reacutesume lrsquohistorique des fonctionnaliteacutes importantes du serveur de donneacuteesMySQL Une version majeure comme 323 se deacutecline au fil des mois en diffeacuterentes sous-versions en fonction des diverses phases de deacuteveloppement

alpha

correspond agrave la phase active de nouvelles fonctionnaliteacutes sont ajouteacutees

becircta

correspond agrave lrsquoimpleacutementation des nouvelles fonctionnaliteacutes de la phase

alpha

sansapport important de code

gamma

correspond au terme

release candidate

(apregraves reacutesolution des bugs de la version

becircta

)

production

est lrsquoeacutetape suivante aussi appeleacutee GA (

Generally Available

) Les bugs sontreacutesolus srsquoils ne modifient pas le comportement geacuteneacuteral du serveur

old

correspond agrave la preacuteceacutedente version de production (par rapport agrave la courante)

Ainsi en septembre 2005 la version 4114 eacutetait mise en production et en octobre 2005 laversion 50 lrsquoeacutetait aussi

Ce qui est planifieacute agrave moyen terme concerne un enrichissement geacuteneacuteral des commandes SQLla prise en compte des types manquants de SQL2 et de ODBC3 la programmation des requecirc-tes hieacuterarchiques (interrogation de structures en arbres) en srsquoinspirant de ce qursquoa fait Oracle enla matiegravere (directive

CONNECT BY

dans un

SELECT

)

Tableau 0-2 Dates importantes pour MySQL

Anneacutee ndash versions Caracteacuteristiques principales

1999 ndash 323

x

Reacuteplication ndash Recherches textuelles ndash Transactions et Inteacutegriteacute reacutefeacuterentielle tables InnoDB (2002 ndash 32344)

2001 ndash 40

x

Cache de requecirctes ndash Seacutecurisation SSL ndash Sauvegarde agrave chaud

2003 ndash 41

x

Support de Unicode ndash Donneacutees geacuteographiques ndash SQL dynamique

2004 ndash 50

x

Vues ndash Curseurs ndash Proceacutedures catalogueacutees ndash Deacuteclencheurs ndash Dictionnaire des donneacutees ndash Transactions distribueacutees (XA)

Agrave venir ndash 51

x

Jointure externe ndash Contraintes

CHECK

ndash Sauvegarde agrave chaud et Inteacutegriteacute reacutefeacuterentielle tables MyISAM

4055_00d_Intro Page 4 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

5

Introduction

Ce qui nrsquoest pas encore planifieacute reste la prise en charge du stockage de donneacutees au formatXML et les extensions objets de SQL3 (principalement les types abstraits les heacuteritage et lesmeacutethodes)

Les changements opeacutereacutes sont preacutesenteacutes en deacutetail et par version agrave lrsquoadresse httpdevmysqlcomdocrefman

xy

ennewshtml (

xy

eacutetant le numeacutero de version majeure parexemple actuellement 51)

Offre du moment

La figure suivante (merci au passage agrave httpwwwiconarchivecom) preacutesente la majeurepartie des fonctionnaliteacutes de MySQL qui se positionnent au sein du serveur de donneacutees(SGBD)

Les API permettent drsquointeacutegrer SQL dans des programmes de diffeacuterents langages Le langageSQL sera utiliseacute par tous ceux (manuellement ou par un outil) travaillant sur la base dedonneacutees (administrateur deacuteveloppeur utilisateur) Le langage proceacutedural de MySQL permetdrsquoincorporer nativement tout ordre SQL dans un programme

Concregravetement une fois teacuteleacutechargeacute et installeacute vous avez accegraves agrave un SGBD un client en modetexte (interface de commande) Les pilotes ODBC JDBC API pour les langages C et C++ etles outils

MySQL Administrator

MySQL Query Browser

et

MySQL Migration Toolkit

sont agraveteacuteleacutecharger puis agrave installer seacutepareacutement

Figure 0-2

Offre MySQL

API C JDBC ODBC NET PHP Python Perl Ruby Microsoft VB

Pool de connexions Authentification ndash Reacuteutilisation de processus ndash Cache ndash hellip

Utilitaires Sauvegarde Restauration Reacuteplication Migrat ion Cluster hellip

SQL LDD ndash LMD LCD - Vues Proceacutedures Deacuteclencheurs hellip

Analyseur Requecirctes Privilegraveges

Optimiseur Accegraves Statistiques

Cache Buffers

Moteurs de stockage Meacutemoire - Index

MyISAM InnoDB Archive Cluster Federated

Serveur MysQL

Systegraveme de fichiers NTFS ndash NFS ndash SAN - NAS

Fichiers et logs Donneacutees ndash index - hellip

4055_00d_Intro Page 5 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

6

copy Eacuteditions Eyrolles

Licences

Deux types de licences sont proposeacutes par MySQL commerciale et GPL Dans le cadre drsquoundeacuteveloppement drsquoapplication entiegraverement sous licence GPL MySQL est gratuit Il en va demecircme srsquoil nrsquoest pas copieacute modifieacute distribueacute ou employeacute pour une utilisation en combinaisonavec un serveur Web (si vous deacuteveloppez lrsquoapplication Web vous-mecircme)

Dans tous les autres cas il est neacutecessaire drsquoobtenir une licence commerciale Par exemple sivous incluez un serveur MySQL ou des pilotes MySQL dans une application non

open source

Et la concurrence

Elle fait rage Deux types de concurrents ceux qui sont dans le domaine de lrsquo

open source

etceux qui engrangent des dollars agrave tour de bras

Dans la premiegravere cateacutegorie citons principalement Interbase 6 et Firebird de BorlandPostgreSQL et Berkeley DB

Dans la seconde on trouvera 4D Filemaker IBM (

DB2 UDB

) Informix Microsoft (

SQLServer Access

) Oracle et Sybase (

Adaptive Server SQL Anywhere Studio

) Depuis peu lesgrands eacutediteurs srsquoouvrent agrave la distribution gratuite Ces produits neacutecessitent de solides confi-gurations ce que nrsquoexigent pas les eacutediteurs de la premiegravere cateacutegorie

Fin 2004 Microsoft proposait

SQL Server 2005 Express Edition

qui est limiteacute drsquoun seulCPU 1 Go de meacutemoire et 4 Go de donneacutees

Fin 2004 Sybase offrait

ASE Express Edition

Plusieurs instances peuvent cohabiter surune machine tout en nrsquoutilisant pas plus drsquoun processeur moins de 2 Go de RAM et pasplus de 5 Go de donneacutees

Oracle annonccedilait en novembre 2005 une version gratuite avec

Oracle Database XE

(

Express Edition

) Version toutefois laquo limiteacutee raquo agrave un processeur moins de 1 Go de RAMune seule instance par systegraveme et pas plus de 4 Go de donneacutees

Peu de temps avant IBM avait aussi annonceacute une licence gratuite de

DB2 Express

Pasplus de deux processeurs et moins de 4 Go de RAM

Tout le monde est donc sur les rangs La guerre des versions nrsquoest donc pas finie Bien malinqui pourra preacutedire qui gagnera sur ce terrain

Notion de scheacutema (database)

MySQL appelle

database

un regroupement logique drsquoobjets (tables index vues deacuteclen-cheurs proceacutedures catalogueacutees etc) pouvant ecirctre stockeacutes agrave diffeacuterents endroits de lrsquoespacedisque Je ferai donc souvent reacutefeacuterence au terme laquo base de donneacutees raquo pour parler de cettenotion

On peut aussi assimiler ce concept agrave la notion de scheacutema pour ceux qui connaissent OracleLagrave ougrave MySQL et drsquoautres SGBD diffegraverent crsquoest sur la notion drsquoutilisateur (

user

)

4055_00d_Intro Page 6 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

7

Introduction

Pour tous un utilisateur sera associeacute agrave un mot de passe pour pouvoir se connecter et mani-puler des tables (srsquoil en a le droit bien sucircr)

Pour MySQL il nrsquoy a pas de notion drsquoappartenance drsquoun objet (table index etc) agrave unutilisateur Un objet appartient agrave son scheacutema (

database

) Ainsi deux utilisateurs distincts(

Jules

et

Paul) se connectant sur la mecircme base (database) ne pourront pas creacuteer chacunune table de nom Compagnie Srsquoils doivent le faire ce sera dans deux bases diffeacuterentes(bdjules et bdpaul)

Pour Oracle ou drsquoautres SGBD chaque objet appartient agrave un scheacutema (user) Ainsi deuxutilisateurs distincts Jules et Paul se connectant agrave la base (qui est un ensemble de scheacute-mas) pourront creacuteer chacun une table de nom Compagnie (la premiegravere sera reacutefeacuterenceacuteeJulesCompagnie la seconde PaulCompagnie)

La figure suivante illustre deux utilisateurs travaillant sur diffeacuterentes bases par une interfacequi peut ecirctre la fenecirctre de commande en ligne (dans la majeure partie des enseignements) ouun langage de programmation comme C Java ou PHP (utilisation drsquoune API) Notez deacutejagravelrsquoexistence de trois bases initiales (mysql test et information_schema) que nousdeacutetaillerons au chapitre 5

Notion drsquohocircte

MySQL deacutenomme host la machine heacutebergeant le SGBD MySQL diffegravere aussi agrave ce niveau desautres SGBD car il est possible de distinguer des accegraves drsquoun mecircme utilisateur suivant qursquoil seconnecte agrave partir drsquoune machine ou drsquoune autre La notion drsquoidentiteacute est baseacutee sur le couplenom drsquoutilisateur MySQL (user) cocircteacute serveur machine cliente

Identiteacutes

Ainsi lrsquoutilisateur Paul se connectant depuis la machine camparols peut ne pas ecirctre lemecircme que celui se connectant depuis la machine gambetta Srsquoil srsquoagit du mecircme il faudra auniveau du serveur eacuteventuellement composer un ensemble de preacuterogatives eacutequivalent pour lesdeux accegraves (voir le chapitre 5) Srsquoil srsquoagit de deux personnes diffeacuterentes il faudra distinguer

Figure 0-3 Notions de base et drsquoutilisateur MySQL

Interface

MySQL

Jules Paul

mysql test

information_schema

bdjules bdpaul

4055_00d_Intro Page 7 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

8 copy Eacuteditions Eyrolles

les attributions des diffeacuterents droits La figure suivante illustre le fait que deux utilisateurspeuvent se connecter par deux accegraves diffeacuterents Trois identiteacutes seront donc agrave preacutevoir cocircteacuteserveur

Nous verrons au chapitre 5 comment configurer le serveur et les clients Nous eacutetudierons auchapitre 9 des outils graphiques drsquoaide agrave lrsquoadministration

Accegraves agrave MySQL

Une fois que vous aurez installeacute MySQL sur votre ordinateur vous serez libre de choisirlrsquoaccegraves qui vous convient Ce livre utilise essentiellement lrsquointerface de commande en lignefournie avec le SGBD mais aussi Java via JDBC et le navigateur Web au travers de PHP

Aspects eacutetudieacutes

Nous nrsquoeacutetudierons pas tous les eacuteleacutements drsquoune base car certains sont assez speacutecifiques etsortent du cadre traditionnel de lrsquoenseignement mecircme supeacuterieur Le tableau suivant indiquedans quel chapitre du livre les principaux eacuteleacutements drsquoun scheacutema sont eacutetudieacutes

Figure 0-4 Notion drsquohocircte MySQL

brassens

Jules

Paul

mysql test

julesgambetta

paulcamparols

camparols

gambetta

Paul paulgambetta

TCP-IP

Tableau 0-3 Eacuteleacutements drsquoune base MySQL

Eacuteleacutements eacutetudieacutes ndash Chapitre Aspects non eacutetudieacutes

Deacuteclencheurs (triggers) ndash 7Fonctions et proceacutedures ndash 7Tables et index ndash 1Seacutequences ndash 2 5Vues (views) et utilisateurs ndash 5

Clusters ndash Moteurs de stockage (storage engine) ndash Partitionnement ndash Donneacutees spatiales

4055_00d_Intro Page 8 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 9

Introduction

Mise en œuvre de MySQL (sous Windows)

Si tout se passe bien comptez quelques minutes pour installer MySQL Je vous conseilletoutefois de creacuteer un point de restauration Windows pour pouvoir revenir agrave votre derniegraverebonne configuration connue Extraire lrsquoarchive teacuteleacutechargeacutee sur le site officiel de MySQL AB(httpdevmysqlcomdownloads) dans un reacutepertoire temporaire (exemple CTemp) puisexeacutecuter Setupexe

Installation

Le premier choix est donneacute pour le type drsquoinstallation typique complegravete et personnaliseacutee ndashchoisir typique dans un premier temps

Le deuxiegraveme eacutecran vous invite agrave vous enregistrer ndash ce nrsquoest pas obligatoire mais conseilleacutetoutefois pour saluer lrsquoeacutenorme travail fait par ces jeunes informaticiens de geacutenie (voilagrave lapommade est passeacutee)

La suite concerne la configuration du serveur de donneacutees (choisir la configuration deacutetailleacuteepour suivre les diffeacuterentes eacutetapes et mieux comprendre le parameacutetrage de votre serveur)

Lrsquoassistant propose en premier lieu de deacuteterminer le type de votre serveur (machine dedeacuteveloppement serveur ou machine deacutedieacutee) Jrsquoai opteacute pour le premier choix

Choissisez ensuite le type de base de donneacutees que vous comptez exploiter (multifonctionmode transactionnel seulement ou jamais transactionnel) Jrsquoai opteacute pour le premier choix

Deacuteterminez ensuite le reacutepertoire qui contiendra les donneacutees des bases InnoDB (crsquoest letype de tables que nous utiliserons dans cet ouvrage car eacutetant le seul dans cette version agraveprendre en charge les cleacutes eacutetrangegraveres) Jrsquoai opteacute pour le choix par deacutefaut

Choissisez ensuite lrsquooption qui convient agrave votre utilisation (en fonction du nombre deconnexions) Jrsquoai opteacute pour le premier choix (vingt connexions maximum)

Il est ensuite possible de modifier le port UDP drsquoeacutecoute (par deacutefaut 3306) et le modecomportemental du serveur par rapport agrave la syntaxe des instructions SQL Jrsquoai opteacute pour lepremier choix (mode strict)

Attention agrave ne pas seacutelectionner un jeu de caractegraveres japonais dans lrsquoeacutecran qui arrive Jrsquoaiopteacute pour les choix par deacutefaut (West European et latin1)

Lrsquoeacutecran suivant permet de deacuteclarer MySQL comme un service Windows (qursquoon pourraarrecircter via le panneau de configuration plutocirct qursquoavec une belle commande en ligne ou parun Ctrl-Alt-Suppr bien connu des bidouilleurshellip) Penser aussi agrave inclure dans le path lechemin de lrsquoexeacutecutable mysql de maniegravere agrave pouvoir lancer une connexion en ligne decommande Il vous suffit de cocher la case approprieacutee

Saisissez un mot de passe pour root vous pouvez aussi creacuteer un compte anonyme(connexion fantocircme sans utilisateur ni mot de passe)

4055_00d_Intro Page 9 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

10 copy Eacuteditions Eyrolles

Apregraves avoir valideacute la demande drsquoexeacutecution (bouton Execute) quelques secondes vontsrsquoeacutecouler avant qursquoon vous invite agrave terminer lrsquoinstallation

Voilagrave MySQL est installeacute Si ce nrsquoest pas le cas la section suivante vous aidera sucircrementDerniegravere chose si vous nrsquoutilisez pas souvent MySQL pensez agrave arrecircter et agrave positionner surManuel le service (ce nrsquoest pas pour lrsquoespace qursquoil occupe 10 Mo en RAM)

Pour modifier une configuration existante vous trouverez un assistant dans DeacutemarrerMySQLhellipMySQL Server Instance Wizard

Deacutesinstallation

Pour supprimer une configuration vous trouverez un assistant dans DeacutemarrerTous lesprogrammesMySQLhellipMySQL Server Instance Wizard choix Remove InstanceCependant le reacutepertoire installeacute par deacutefaut dans Program Files reste sur le disque (compterune centaine de meacutega-octets) De mecircme qursquoen ce qui concerne les entreacutees dans le menu Deacutemar-rer je ne parle pas de la base de registres qui est inchangeacuteehellip

Dans Panneau de configuration AjoutSuppression de programmes supprimerMySQL Server Il reste encore des choses dans la base de registres Le reacutepertoire MySQL sousProgram Files a diminueacute de taille mais il est toujours preacutesent Une fois que tout est faitredeacutemarrez votre machine et reprenez lrsquoinstallation initiale Prudence si vous modifiez leschemins des reacutepertoires des donneacutees entre plusieurs installations

Reconfiguration

En relanccedilant une installation il vous est donneacute drsquoajouter des composants (option Modify) sivous nrsquoavez pas fait une installation complegravete au deacutebut Vous avez aussi la possibiliteacute delaquo reacuteparer raquo (option Repair) une configuration existante

Premiers pas

La proceacutedure suivante va guider vos premiers pas pour travailler sous cette interface drsquounemaniegravere laquo professionnelle raquo Il srsquoagit de stocker vos fichiers de commande qui pourront serviragrave diffeacuterentes actions (creacuteations de tables de vues ou drsquoutilisateurs insertions modificationsou suppressions drsquoenregistrements eacutelaboration de requecirctes de proceacutedures catalogueacutees etc)

Lrsquointerface de commande

Lrsquointerface de commande en ligne porte le nom du SGBD (mysql) Cette interface ressembleagrave une fenecirctre DOS ou telnet et permet de dialoguer de la plus simple faccedilon avec la base dedonneacutees Lrsquoutilisation peut ecirctre interactive ou laquo batch raquo Quand lrsquoutilisation est interactive

4055_00d_Intro Page 10 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 11

Introduction

(crsquoest le mode le plus courant) le reacutesultat des extractions est preacutesenteacute sous une forme tabulaireau format ASCII

Vous verrez qursquoil est notamment possible

drsquoexeacutecuter des instructions SQL (creacuteeacuter des tables manipuler des donneacutees extraire desinformations etc)

de compiler des proceacutedures catalogueacutees et des deacuteclencheurs

de reacutealiser des tacircches drsquoadministration (creacuteation drsquoutilisateurs attribution de privilegravegesetc)

Le principe geacuteneacuteral de lrsquointerface est le suivant apregraves une connexion locale ou distante desinstructions sont saisies et envoyeacutees agrave la base qui retourne des reacutesultats afficheacutes dans la mecircmefenecirctre de commande

Nrsquoayez pas honte de bien maicirctriser cette interface au lieu de connaicirctre toutes les options drsquounoutil graphique (comme PhpMyAdmin MySQL Administrator ou autre) Il vous sera toujoursplus facile de vous adapter aux diffeacuterents boutons et menus tout en connaissant les instruc-tions SQL que lrsquoinverse

Imaginez-vous un jour agrave Singapour sur une machine ne disposant pas drsquooutils graphiques quele client vous demande la reacuteduction que vous pouvez lui faire sur la vente drsquoune piscine inteacute-rieure drsquoun Airbus A380 et que vous devez interroger (ou mettre agrave jour) une table sur leserveur du siegravege social agrave Blagnac Vous ne savez pas vous servir de lrsquointerface en ligne vousnrsquoecirctes pas un vrai informaticien

Creacuteation drsquoun utilisateur

Vous allez maintenant creacuteer un utilisateur MySQL Ouvrez le fichier premierPassql qui setrouve dans le reacutepertoire Introduction agrave lrsquoaide du bloc-notes (ou drsquoun eacutediteur de texte de votre

Figure 0-5 Principe geacuteneacuteral de lrsquointerface de commande en ligne

mysql [options] [nomBase] [entreacutees-sorties]

quit ou exit

mysqlgt INSERT hellip

mysqlgt CREATE hellip

mysqlgt SELECT hellip

hellip

mysqlgt

mysql

Systegraveme drsquoexploitation

nomBase

Web

4055_00d_Intro Page 11 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

12 copy Eacuteditions Eyrolles

choix) Changez laquo util raquo par le nom de lrsquoutilisateur agrave creacuteer (modifiez aussi le nom de la base) Vouspouvez changer le mot de passe si vous voulez Enregistrez ce fichier dans un de vos reacutepertoires

Connexion au serveur

Dans une fenecirctre de commande Windows Linux (ou autre) lancer lrsquointerface en ligne enconnectant lrsquoutilisateur root avec le mot de passe que vous avez donneacute lors de lrsquoinstallation

mysql --user=root -p

Une fois connecteacute par copier-coller (en effectuant un clic droit dans la fenecirctre de commandeMySQL) exeacutecutez une agrave une les diffeacuterentes instructions (creacuteation de la base de lrsquoutilisateurdes privilegraveges et deacuteconnexion de root) Nous eacutetudierons au chapitre 5 les notions eacuteleacutementai-res de droits et de seacutecuriteacute Les lignes preacuteceacutedeacutees de laquo -- raquo sont des commentaires

Voilagrave votre utilisateur (util) est creacuteeacute il peut se connecter et il possegravede toutes les preacuterogatives sur labase (bdutil) pour exeacutecuter les instructions deacutecrites dans cet ouvrage Pour tester votre connexionlancez la commande suivante qui se connecte au serveur sur la base bdutil sous lrsquoutilisateur util

mysql --user=util --host=localhost -p --database=bdutil

Veacuterification de la version

Pour controcircler la version du serveur sur lequel vous ecirctes connecteacute exeacutecutez la connexion-deacuteconnexion suivante dans une fenecirctre de commande Windows Linux (ou autre)

mysql --version

Si vous ecirctes deacutejagrave connecteacute la commande laquo SELECT VERSION() raquo vous renseignera eacutegale-ment agrave propos de la version du SGBD Si vous nrsquoecirctes pas en version 5 il vous sera impossiblede travailler avec des proceacutedures catalogueacutees vues et deacuteclencheurs Pour ma part lors de lareacutedaction de cet ouvrage cette commande a renvoyeacute le reacutesultat suivant

Figure 0-6 Interface en mode ligne de commande

4055_00d_Intro Page 12 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 13

Introduction

+-----------+

| VERSION() |

+-----------+

| 5015-nt |

+-----------+

Options de base

Les principales options au lancement de mysql sont reacutesumeacutees dans le tableau suivant

Tableau 0-4 Principales options de la commande mysql

Option Commentaire

--help ou - Affiche les options disponibles lrsquoeacutetat des variables drsquoenvironnement etrend la main

--batch ou -B Toute commande SQL peut ecirctre lanceacutee dans la fenecirctre de commandesystegraveme sans pour autant voir lrsquoinvite les reacutesultats (colonnes) sontseacutepareacutes par des tabulations

--database=nomBD ou ndashD nomBD

Seacutelection de la base de donneacutees agrave utiliser apregraves la connexion

--host=nomServeur ou -h nomServeur

Deacutesignation du serveur

--html ou -H Formate le reacutesultat des extractions en HTML

--one-database ou -O Restreint les instructions agrave la base de donneacutees speacutecifieacutee initialement

-p Demande le mot de passe sans lrsquoemployer en tant que paramegravetre

--password=motdePasse Transmission du mot de passe de lrsquoutilisateur agrave connecter Eacutevitez cetteoption et preacutefeacuterez la preacuteceacutedentehellip

--prompt=parametre Personnalise lrsquoinvite de commande (par deacutefaut mysqlgt)

--silent ou -s Configure le mode silence pour reacuteduire les messages de MySQL

--skip-column-names ou -N

Nrsquoeacutecrit aucun en-tecircte de colonne pour les reacutesultats drsquoextraction

--table ou -t Formate le reacutesultat des extractions en tables agrave en-tecircte de colonne (pardeacutefaut dans le mode interactif)

--tee=cheminNomFichier Copie la trace de toute la session dans le fichier que vous indiquez

--user=utilisateur ou -u utilisateur

Deacutesigne lrsquoutilisateur devant se connecter

--verbose ou -v Mode verbeux pour avoir davantage de messages du serveur

--version ou -V Affiche la version du serveur et rend la main

--vertical ou -E Affiche les reacutesultats des extractions verticalement (non plus en ligneshorizontales)

--xml ou -X Formate le reacutesultat des extractions en XML Les noms de balisesgeacuteneacutereacutees sont ltresultsetgt pour la table reacutesultat ltrowgtpour chaque ligne et ltfieldgt pour les colonnes

4055_00d_Intro Page 13 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

14 copy Eacuteditions Eyrolles

Ces options peuvent se combiner en les seacuteparant simplement par un espace (exemple mysql--tee=Ddevsortiemysqltxt --database=bdsoutou va se connecteranonymement agrave la base bdsoutou en inscrivant le contenu de la trace de la session dans lefichier sortiemysqltxt situeacute dans le reacutepertoire Ddev)

Le tableau suivant reacutesume les principaux paramegravetres pour afficher les invites de commande(relatives agrave lrsquooption prompt)

Batch

Pour lancer plusieurs commandes regroupeacutees dans un fichier agrave extension laquo sql raquo il fautpreacuteciser le chemin du fichier et celui qui contiendra les eacuteventuels reacutesultats (crsquoest du laquo brut dedeacutecoffrage raquo ) Ainsi lrsquoinstruction suivante exeacutecute dans la base bdsoutou sous lrsquoautoriteacutede lrsquoutilisateur soutou les commandes contenues dans le fichier Testbatchsql situeacutedans le reacutepertoire Ddev (notez lrsquoutilisation du double back-slash pour deacutesigner une arbo-rescence Windows) Le reacutesultat sera consigneacute dans le fichier sortietxt du mecircme reacuteper-toire

mysql --user=soutou --password=iut bdsoutou

Votre prompt et vite

Lrsquoexeacutecution de lrsquoinstruction laquo mysql --prompt=(uh) [d]gt --user=root ndashp raquodans une fenecirctre de commande shell ou DOS connectera lrsquoutilisateur root en lui demandantson mot de passe Lrsquoinvite de commande agrave lrsquoaffichage sera de la forme suivante

Tableau 0-5 Principales options de lrsquoinvite de commandes

Option Commentaire

v Version du serveur

d Base de donneacutees en cours drsquoutilisation

h Nom du serveur

u Nom drsquoutilisateur

U Nom drsquoutilisateur long (au format nomserveur)

_ Un espace

R Heure (0 agrave 23)

m Minutes

s Secondes

Y Anneacutee sur quatre chiffres

D Date en cours

c Compteur drsquoinstructions

ltDdevTestbatchsql gtDdevsortietxt

4055_00d_Intro Page 14 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 15

Introduction

(rootlocalhost) [bdsoutou]gt une fois que root aura seacutelectionneacute la base bdsou-tou (par la commande laquo use nombase raquo)

Configurez votre invite de commande SQL dans le fichier de configuration myini situeacute enprincipe dans le reacutepertoire CProgram FilesMySQLMySQL Server xx de la maniegravere quivous convient le plus

Pour ma part jrsquoai ajouteacute les deux lignes suivantes sous la section [mysql] elle-mecircme situeacuteesous lrsquoeacutetiquette [client]

mon prompt

prompt=(uh) [d]_mysqlgt_

Une fois le serveur redeacutemarreacute en consideacuterant que votre compte srsquoappelle util toutes voscommandes SQL devraient en principe ecirctre preacutefixeacutees de la syntaxe suivante

(utillocalhost) [bdutil] mysqlgt

Commandes de base

Une fois connecteacute vous pouvez utiliser des commandes ou faire des copier-coller drsquoun eacutediteurde texte dans lrsquointerface mysql (ce moyen de faire correspond plus agrave un environnement detest qui conviendra agrave lrsquoapprentissage) Le tableau suivant reacutesume les principales instructionspour manipuler le buffer drsquoentreacutee de lrsquointerface

La commande source est tregraves utile pour eacuteviter les copier-coller de trop nombreuses instructions

Tableau 0-6 Commandes de base du buffer drsquoentreacutee

Commande Commentaire

Affichage des commandes disponibles

delimiter chaicircne Modifie le deacutelimiteur (par deacutefaut laquo raquo)

use nomBase Rend une base de donneacutees courante

prompt chaicircne Modifie lrsquoinvite de commande avec les paramegravetres vus preacuteceacutedemment

quit ou exit Quitte lrsquointerface

source cheminNomFichiersql Charge et exeacutecute dans le buffer le contenu du cheminNomFichiersql (ex source DdevTestbatchsql exeacutecutera le script Testbatchsql situeacute dans Ddev)

tee nomFichierSortie Creacuteation nomFichierSortie dans le reacutepertoire CProgram FilesMySQLMySQL Server nnbin qui contiendra la trace de la session

4055_00d_Intro Page 15 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

4055_00d_Intro Page 16 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Partie I

SQL de base

4055_00e_P01 Page 17 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

4055_00e_P01 Page 18 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

19

Chapitre 1

Deacutefinition des donneacutees

Ce chapitre deacutecrit les instructions SQL qui constituent lrsquoaspect LDD (langage de deacutefinitiondes donneacutees) Agrave cet effet nous verrons notamment comment deacuteclarer une table avec ses eacuteven-tuels index et contraintes

Tables relationnelles

Une table est creacuteeacutee en SQL par lrsquoinstruction

CREATE TABLE

modifieacutee au niveau de sa struc-ture par lrsquoinstruction

ALTER TABLE

et supprimeacutee par la commande

DROP TABLE

Creacuteation drsquoune table (

CREATE TABLE

)

Pour pouvoir creacuteer une table dans votre base il faut que vous ayez reccedilu le privilegravege

CREATE

Le meacutecanisme des privilegraveges est deacutecrit au chapitre 5

La syntaxe SQL simplifieacutee est la suivante

CREATE

[TEMPORARY]

TABLE

[IF NOT EXISTS] [

nomBase

]

nomTable

(

colonne1 type1

[NOT NULL | NULL] [DEFAULT

valeur1

] [COMMENT

chaine1

]

[

colonne2 type2

[NOT NULL | NULL] [DEFAULT

valeur2

] [COMMENT

chaine2

] ]

[CONSTRAINT

nomContrainte1 typeContrainte1

]

)

[ENGINE= InnoDB | MyISAM |

]

TEMPORARY

pour creacuteer une table qui nrsquoexistera que durant la session courante (la tablesera supprimeacutee agrave la deacuteconnexion) Deux connexions peuvent ainsi creacuteer deux tablestemporaires de mecircme nom sans risquer de conflit Il faut posseacuteder le privilegravege

CREATETEMPORARY TABLES

IF NOT EXISTS

permet drsquoeacuteviter qursquoune erreur se produise si la table existe deacutejagrave (sicrsquoest le cas elle nrsquoest aucunement affecteacutee par la tentative de creacuteation)

nomBase

(jusqursquoagrave 64 caractegraveres permis dans un nom de reacutepertoire ou de fichier sauflaquo

raquo laquo

raquo et laquo

raquo) srsquoil est omis il sera assimileacute agrave la base connecteacutee Srsquoil est preacuteciseacute il

4055_01_C01 Page 19 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

20

copy Eacuteditions Eyrolles

deacutesigne soit la base connecteacutee soit une autre base (dans ce cas il faut que lrsquoutilisateurcourant ait le droit de creacuteeacuter une table dans lrsquoautre base) Nous aborderons ces points dansle chapitre Controcircle des donneacutees et nous consideacutererons jusque-lagrave que nous travaillons dansla base courante (ce sera votre configuration la plupart du temps)

nomTable

mecircmes limitations que pour le nom de la base

colonnei typei

nom drsquoune colonne (mecircmes caracteacuteristiques que pour les noms destables) et son type (

INTEGER

CHAR

DATE

hellip) Nous verrons quels types sont disponiblessous MySQL La directive

DEFAULT

fixe une valeur par deacutefaut La directive

NOT NULL

interdit que la valeur de la colonne soit nulle

NULL

repreacutesente une valeur qursquoon peut consideacuterer comme non disponible non affecteacutee incon-nue ou inapplicable Elle est diffeacuterente drsquoun espace pour un caractegravere ou drsquoun zeacutero pour un

nombre

COMMENT

(jusqursquoagrave 60 caractegraveres) permet de commenter une colonne Ce texte seraensuite automatiquement afficheacute agrave lrsquoaide des commandes

SHOW CREATE TABLE

et

SHOWFULL COLUMNS

(voir le chapitre 5)

nomContraintei typeContraintei

nom de la contrainte et son type (cleacute primairecleacute eacutetrangegravere etc) Nous allons deacutetailler dans le paragraphe suivant les diffeacuterentescontraintes possibles

ENGINE

deacutefinit le type de table (par deacutefaut

InnoDB

bien adapteacute agrave la programmation detransactions et adopteacute dans cet ouvrage)

MyISAM

correspond au type par deacutefaut desversions 3 parfaitement robuste mais ne supportant pas pour lrsquoheure lrsquointeacutegriteacute reacutefeacuteren-tielle Drsquoautres types existent citons

MEMORY

pour les tables temporaires

ARCHIVE

etc

laquo

raquo symbole par deacutefaut qui termine une instruction MySQL en mode ligne decommande (en lrsquoabsence drsquoun autre deacutelimiteur)

Deacutelimiteurs

En mode ligne de commande il est possible (par la directive

delimiter

) de choisir lesymbole qui terminera chaque instruction Dans lrsquoexemple suivant on choisit le dollar aucours de lrsquoouvrage nous resterons avec le symbole par deacutefaut de MySQL agrave savoir laquo raquo

delimiter $

CREATE TABLE Test (t CHAR(8))$

Sensibiliteacute agrave la casse

Alors que MySQL est sensible par deacutefaut agrave la casse (au niveau des noms de base et de table)dans la plupart des distributions Unix il ne lrsquoest pas pour Windows En revanche concernantles noms de colonnes index alias de colonnes deacuteclencheurs et proceacutedures catalogueacutees

4055_01_C01 Page 20 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

21

chapitre ndeg 1 Deacutefinition des donneacutees

MySQL nrsquoest pas sensible agrave la casse tous systegravemes confondus En fait tous ces noms sontstockeacutes en minuscules dans le dictionnaire de donneacutees

La variable

lower_case_table_names

permet de forcer la sensibiliteacute agrave la casse pourles noms des tables et des bases de donneacutees (si elle vaut 0 la sensibiliteacute agrave la casse est active etles noms sont stockeacutes en minuscules 1 pas de sensibiliteacute agrave la casse et les noms sontstockeacutes en minuscules 2 pas de sensibiliteacute agrave la casse et les noms sont stockeacutes en respectant lacasse)

Je vous invite agrave positionner cette variable agrave 0 de maniegravere agrave homogeacuteneacuteiser le codage et agravecontrocircler un peu plus lrsquoeacutecriture de vos instructions SQL De plus crsquoest lrsquooption par deacutefaut surLinux Dans le fichier

myini

sous la section serveur identifieacutee par [

mysqld

] ajouter laligne et le commentaire suivants

Rend sensible agrave la CASSE les noms de tables et de database

lower_case_table_names=0

Refusez ce type de programmation (rendue impossible drsquoailleurs si la variable

lower_case_table_names

est positionneacutee agrave 0)

mysqlgt SELECT FROM

Avion

WHERE

AVION

capacite gt 150

Par ailleurs la casse devrait toujours avoir (quel que soit le SGBD concerneacute) une incidencemajeure dans les expressions de comparaison entre colonnes et valeurs que ce soit dans uneinstruction SQL ou un test dans un programme

Ainsi lrsquoexpression laquo

nomComp=Air France

raquo a la mecircme signification que lrsquoexpressionlaquo

nomComp=AIR France

raquo avec MySQL Horreur oui

Donc si vous deacutesirez veacuterifier la casse au sein mecircme des donneacutees il faudra utiliser la fonction

BINARY()

qui convertit en bits une expression En effet laquo

BINARY(AIR France)

raquo est dif-feacuterent de laquo

BINARY(Air France)

raquo et laquo

BINARY(nomComp)=BINARY(Air France)

raquo

renverra vrai en respectant la casse

Commentaires

Dans toute instruction SQL (deacuteclaration manipulation interrogation et controcircle des donneacutees)il est possible drsquoinclure des retours chariot des tabulations espaces et commentaires (sur uneligne preacuteceacutedeacutee de deux tirets laquo

ndash - raquo en fin de ligne agrave lrsquoaide du diegravese laquo raquo au sein drsquouneligne ou sur plusieurs lignes entre laquo raquo et laquo raquo) Les scripts suivants deacutecrivent la deacutecla-ration drsquoune mecircme table en utilisant diffeacuterentes conventions

4055_01_C01 Page 21 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

22 copy Eacuteditions Eyrolles

Comme nous le conseillons dans lrsquoavant-propos il est preacutefeacuterable drsquoutiliser les conventionssuivantes

bull Tous les mots-cleacutes de SQL sont noteacutes en majuscules

bull Les noms de tables sont noteacutes en Minuscules (excepteacute la premiegravere lettre ces noms serontquand mecircme stockeacutes dans le systegraveme en minuscules)

bull Les noms de colonnes et de contraintes en minuscules

Lrsquoadoption de ces conventions rendra vos requecirctes scripts et programmes plus lisibles (un peuagrave la mode Java)

Premier exemple

Le tableau ci-apregraves deacutecrit lrsquoinstruction SQL qui permet de creacuteer la table Compagnie illustreacuteepar la figure suivante dans la base bdsoutou (lrsquoabsence du preacutefixe laquo bdsoutou raquo conduiraitau mecircme reacutesultat si bdsoutou eacutetait la base connecteacutee lors de lrsquoexeacutecution du script)

Tableau 1-1 Diffeacuterentes eacutecritures SQL

Sans commentaire Avec commentaires

CREATE TABLE Test(colonneDECIMAL(388))

CREATE TABLE Test (colonne DECIMAL(388))

CREATE TABLE -- nom de la tableTest( deacutebut de la description COLONNE DECIMAL(388) )-- fin ne pas oublier le point-virguleCREATE TABLE Test ( une plus grande description des colonnes COLONNE type DECIMAL(388))

Figure 1-1 Table agrave creacuteer

Compagnie

comp nrue rue ville nomComp

4055_01_C01 Page 22 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 23

chapitre ndeg 1 Deacutefinition des donneacutees

Contraintes

Les contraintes ont pour but de programmer des regravegles de gestion au niveau des colonnes destables Elles peuvent alleacuteger un deacuteveloppement cocircteacute client (si on deacuteclare qursquoune note doit ecirctrecomprise entre 0 et 20 les programmes de saisie nrsquoont plus agrave tester les valeurs en entreacutee maisseulement le code retour apregraves connexion agrave la base on deacuteporte les contraintes cocircteacute serveur)

Les contraintes peuvent ecirctre deacuteclareacutees de deux maniegraveres

En mecircme temps que la colonne (valable pour les contraintes monocolonnes) ces contrain-tes sont dites laquo en ligne raquo (inline constraints) Lrsquoexemple preacuteceacutedent en deacuteclare deux

Apregraves que la colonne est deacuteclareacutee ces contraintes ne sont pas limiteacutees agrave une colonne etpeuvent ecirctre personnaliseacutees par un nom (out-of-line constraints)

Il est recommandeacute de deacuteclarer les contraintes NOT NULL en ligne les autres peuvent soit ecirctredeacuteclareacutees en ligne soit ecirctre nommeacutees Eacutetudions agrave preacutesent les types de contraintes nommeacutees(out-of-line) Les quatre types de contraintes les plus utiliseacutees sont les suivants

CONSTRAINT nomContrainte

UNIQUE (colonne1 [colonne2])

PRIMARY KEY (colonne1 [colonne2])

FOREIGN KEY (colonne1 [colonne2])

REFERENCES nomTablePere [(colonne1 [colonne2])]

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

CHECK (condition)

La contrainte UNIQUE impose une valeur distincte au niveau de la table (les valeurs nullesfont exception agrave moins que NOT NULL soit aussi appliqueacutee sur les colonnes)

La contrainte PRIMARY KEY deacuteclare la cleacute primaire de la table Un index est geacuteneacutereacute auto-matiquement sur la ou les colonnes concerneacutees Les colonnes cleacutes primaires ne peuventecirctre ni nulles ni identiques (en totaliteacute si elles sont composeacutees de plusieurs colonnes)

Tableau 1-2 Creacuteation drsquoune table et de ses contraintes

Instruction SQL Commentaires

CREATE TABLE bdsoutouCompagnie (comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) DEFAULT Paris COMMENT Par defaut Paris nomComp CHAR(15) NOT NULL)

La table contient cinq colonnes (quatre chaicircnes de caractegraveres et un numeacuterique de trois chiffres) La colonne ville est commenteacuteeLa table inclut en plus deux contraintes bull DEFAULT qui fixe Paris comme valeur par deacutefaut

de la colonne ville bull NOT NULL qui impose une valeur non nulle dans

la colonne nomComp

4055_01_C01 Page 23 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

24 copy Eacuteditions Eyrolles

La contrainte FOREIGN KEY deacuteclare une cleacute eacutetrangegravere entre une table enfant (child) et unetable pegravere (parent) Ces contraintes deacutefinissent lrsquointeacutegriteacute reacutefeacuterentielle que nous aborde-rons plus tard Les directives ON UPDATE et ON DELETE disposent de quatre options quenous deacutetaillerons avec les directives MATCH agrave la section Inteacutegriteacute reacutefeacuterentielle duchapitre 2)

La contrainte CHECK impose un domaine de valeurs ou une condition simple ou complexe entrecolonnes (exemple CHECK (note BETWEEN 0 AND 20) CHECK (grade=Copilote ORgrade=Commandant)) Cette contrainte est prise en charge au niveau de la deacuteclarationmais nrsquoest pas encore opeacuterationnelle mecircme dans la version 51

Il est recommandeacute de ne pas deacutefinir de contraintes sans les nommer (bien que cela soit possi-ble) car il sera difficile de les faire eacutevoluer (deacutesactivation reacuteactivation suppression) et la lisi-biliteacute des programmes en sera affecteacutee

Nous verrons au chapitre 3 comment ajouter supprimer deacutesactiver et reacuteactiver des contraintes(options de la commande ALTER TABLE)

Conventions recommandeacutees

Adoptez les conventions drsquoeacutecriture suivantes pour vos contraintes

bull Preacutefixez par pk_ le nom drsquoune contrainte cleacute primaire fk_ une cleacute eacutetrangegravere ck_ une veacuteri-fication un_ une uniciteacute

bull Pour une contrainte cleacute primaire suffixez du nom de la table la contrainte (exemple pk_Avion)

bull Pour une contrainte cleacute eacutetrangegravere renseignez (ou abreacutegez) les noms de la table source dela cleacute et de la table cible (exemple fk_Pil_compa_Comp)

En respectant nos conventions deacuteclarons les tables de lrsquoexemple suivant (Compagnie avec sacleacute primaire et Avion avec sa cleacute primaire et sa cleacute eacutetrangegravere) Du fait de lrsquoexistence de la cleacuteeacutetrangegravere la table Compagnie est dite laquo parent raquo (ou laquo pegravere raquo) de la table Avion laquo enfant raquo(ou laquo fils raquo) Cela reacutesulte de la traduction drsquoune association un-agrave-plusieurs entre les deuxtables (De UML agrave SQL Eyrolles 2002) Nous reviendrons sur ces principes agrave la section Inteacute-griteacute reacutefeacuterentielle du prochain chapitre

4055_01_C01 Page 24 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 25

chapitre ndeg 1 Deacutefinition des donneacutees

Remarques

bull Lrsquoordre nrsquoest pas important dans la deacuteclaration des contraintes nommeacutees

bull PRIMARY KEY eacutequivaut agrave UNIQUE + NOT NULL + index

bull Lrsquoordre de creacuteation des tables est important quand on deacutefinit les contraintes en mecircme tempsque les tables (on peut diffeacuterer la creacuteation ou lrsquoactivation des contraintes voir le chapitre 3)Il faut creacuteer drsquoabord les tables laquo pegraveres raquo puis les tables laquo fils raquo Le script de destruction destables suit le raisonnement inverse

Figure 1-2 Deux tables relieacutees agrave creacuteer

Tableau 1-3 Contraintes en ligne et nommeacutees

Tables Contraintes

CREATE TABLE Compagnie(comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) DEFAULT Paris COMMENT Par defaut Paris nomComp CHAR(15) NOT NULL CONSTRAINT pk_Compagnie PRIMARY KEY(comp))

Deux contraintes en ligneet une contrainte nommeacuteede cleacute primaire

CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) NOT NULL nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT ck_nbHVol CHECK(nbHVol BETWEEN 0 AND 20000) CONSTRAINT un_nom UNIQUE (nom) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))

Une contrainte en ligneet quatre contraintes nommeacutees bull Cleacute primairebull NOT NULLbull CHECK (nombre drsquoheures de vol

compris entre 0 et 20 000)bull UNIQUE (homonymes interdits)bull Cleacute eacutetrangegravere

Pilote

brevet nom nbHVol compa

Compagnie

comp nrue rue ville nomComp

Web

4055_01_C01 Page 25 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

26 copy Eacuteditions Eyrolles

Types des colonnes

Pour deacutecrire les colonnes drsquoune table MySQL fournit les types preacutedeacutefinis suivants (built-indatatypes)

caractegraveres (CHAR VARCHAR TINYTEXT TEXT MEDIUMTEXT LONGTEXT)

valeurs numeacuteriques (TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINTFLOAT DOUBLE REAL DECIMAL NUMERIC et BIT)

dateheure (DATE DATETIME TIME YEAR TIMESTAMP)

donneacutees binaires (BLOB TINYBLOB MEDIUMBLOB LONGBLOB)

eacutenumeacuterations (ENUM SET)

Deacutetaillons agrave preacutesent ces types Nous verrons comment utiliser les plus courants au chapitre 2et les autres au fil de lrsquoouvrage

Caractegraveres

Le type CHAR permet de stocker des chaicircnes de caractegraveres de taille fixe Les valeurs sontstockeacutees en ajoutant srsquoil le faut des espaces (trailing spaces) agrave concurrence de la tailledeacutefinie Ces espaces ne seront pas consideacutereacutes apregraves extraction agrave partir de la table

Le type VARCHAR permet de stocker des chaicircnes de caractegraveres de taille variable Les valeurssont stockeacutees sans lrsquoajout drsquoespaces agrave concurrence de la taille deacutefinie Depuis la version 503de MySQL les eacuteventuels espaces de fin de chaicircne seront stockeacutes et extraits en conformiteacuteavec la norme SQL Des caractegraveres Unicode (meacutethode de codage universelle qui fournit unevaleur de code unique pour chaque caractegravere quels que soient la plate-forme le programme oula langue) peuvent aussi ecirctre stockeacutes

Tableau 1-4 Types de donneacutees caractegraveres

Type Description Commentaire pour une colonne

CHAR(n) [BINARY | ASCII| UNICODE]

Chaicircne fixe de n octets ou caractegraveres

Taille fixe (maximum de 255 caractegraveres)

VARCHAR(n) [BINARY] Chaicircne variable de n caractegraveres ou octets

Taille variable (maximum de 65 535 caractegraveres)

BINARY(n) Chaicircne fixe de n octets

Taille fixe (maximum de 255 octets)

VARBINARY(n) Chaicircne variable de n octets

Taille variable (maximum de 255 octets)

TINYTEXT(n) Flot de n octets Taille fixe (maximum de 255 octets)

TEXT(n) Flot de n octets Taille fixe (maximum de 65 535 octets)

MEDIUMTEXT(n) Flot de n octets Taille fixe (maximum de 16 meacutegaoctets)

LONGTEXT(n) Flot de n octets Taille fixe (maximum de 429 gigaoctets)

4055_01_C01 Page 26 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 27

chapitre ndeg 1 Deacutefinition des donneacutees

Les types BINARY et VARBINARY sont similaires agrave CHAR et VARCHAR excepteacute par le faitqursquoils contiennent des chaicircnes drsquooctets sans tenir compte drsquoun jeu de caractegraveres en particulier

Les quatre types permettant aussi de stocker du texte sont TINYTEXT TEXT MEDIUMTEXTet LONGTEXT Ces types sont associeacutes agrave un jeu de caractegraveres Il nrsquoy a pas de meacutecanisme desuppression drsquoespaces de fin ni de possibiliteacute drsquoy associer une contrainte DEFAULT

Valeurs numeacuteriques

De nombreux types sont proposeacutes par MySQL pour deacutefinir des valeurs exactes (entiers ou deacutecimauxpositifs ou neacutegatifs INTEGER et SMALLINT) et des valeurs agrave virgule fixe ou flottante (FLOATDOUBLE et DECIMAL) En plus des speacutecifications de la norme SQL MySQL propose les typesdrsquoentiers restreints (TINYINT MEDIUMINT et BIGINT) Le tableau suivant deacutecrit ces types

n indique le nombre de positions de la valeur agrave lrsquoaffichage (le maximum est de 255) Ainsiil est possible de deacuteclarer une colonne TINYINT(4) sachant que seules 3 positions sontneacutecessaires en fonction du domaine de valeurs permises

Tableau 1-5 Types de donneacutees numeacuteriques

Type Description

BIT[(n)] Ensemble de n bits Taille de 1 agrave 64 (par deacutefaut 1)

TINYINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur un octet) de -128 agrave 127 signeacute 0 agrave 255 non signeacute

BOOL et BOOLEAN Synonymes de TINYINT(1) la valeur zeacutero est consideacutereacuteecomme fausse Le non-zeacutero est consideacutereacute comme vrai Dans lesprochaines versions le type boolean comme le preacuteconise lanorme SQL sera reacuteellement pris en charge

SMALLINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 2 octets) de ndash 32 768 agrave 32 767 signeacute 0 agrave 65 535 nonsigneacute

MEDIUMINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 3 octets) de ndash 8 388 608 agrave 8 388 607 signeacute 0 agrave 16 777 215 non signeacute

INTEGER[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 4 octets) de ndash2 147 483 648 agrave 2 147 483 647 signeacute0 agrave 4 294 967 295 non signeacute

BIGINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 8 octets) de ndash 9 223 372 036 854 775 808 agrave 9 223 372 036 854 775 807 signeacute 0 agrave 18 446 744 073 709 551 615 non signeacute

FLOAT[(n[p])] [UNSIGNED] [ZEROFILL]

Flottant (de 4 agrave 8 octets) p deacutesigne la preacutecision simple (jusqursquoagrave7deacutecimales) de -34 10+38 agrave -11 10-38 0 signeacute et de 11 10-38 agrave34 10+38 non signeacute

DOUBLE[(n[p])] [UNSIGNED] [ZEROFILL]

Flottant (sur 8 octets) p deacutesigne la preacutecision double (jusqursquoagrave 15deacutecimales) de -17 10+308 agrave -22 10-308 0 signeacute et de 22 10-308

agrave 17 10+308 non signeacute

DECIMAL[(n[p])] [UNSIGNED] [ZEROFILL]

Deacutecimal agrave virgule fixe p deacutesigne la preacutecision (nombre de chiffresapregraves la virgule maximum 30) Par deacutefaut n vaut 10 p vaut 0

4055_01_C01 Page 27 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

28 copy Eacuteditions Eyrolles

La directive UNSIGNED permet de consideacuterer seulement des valeurs positives

La directive ZEROFILL complegravete par des zeacuteros agrave gauche une valeur (par exemple soit unINTEGER(5) contenant 4 si ZEROFILL est appliqueacute la valeur extraite sera laquo 00004 raquo)En deacuteclarant une colonne ZEROFILL MySQL lrsquoaffecte automatiquement aussi agrave UNSI-GNED

Synonymes et alias

bull INT est synonyme de INTEGER

bull DOUBLE PRECISION et REAL sont synonymes de DOUBLE

bull DEC NUMERIC et FIXED sont synonymes de DECIMAL

bull SERIAL est un alias pour BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE

bull Dans toute instruction SQL eacutecrivez la virgule avec un point (72 retourne 35)

Dates et heures

Les types suivants permettent de stocker des moments ponctuels (dates dates et heuresanneacutees et heures) Les fonctions NOW() et SYSDATE() retournent la date et lrsquoheure courantesDans une proceacutedure ou un deacuteclencheur SYSDATE est reacuteeacutevalueacutee en temps reacuteel alors que NOWdeacutesignera toujours lrsquoinstant de deacutebut de traitement

Tableau 1-6 Types de donneacutees dates et heures

Type Description Commentaire pour une colonne

DATE Dates du 1er janvier de lrsquoan 1000 au 31 deacutecembre 9999 apregraves J-C

Sur 3 octets Lrsquoaffichage est au format lsquoYYYY-MM-DDrsquo

DATETIME Dates et heures (de 0 h de la premiegravere date agrave 23 h 59 minutes 59 secondes de la derniegravere date)

Sur 8 octets Lrsquoaffichage est au format lsquoYYYY-MM-DD HHMMSSrsquo

YEAR[(2|4)] Sur 4 positions de 1901 agrave 2155 (incluant 0000) Sur 2 positions de 70 agrave 69 (deacutesignant 1970 agrave 2069)

Sur 1 octet lrsquoanneacutee est consideacutereacutee sur 2 ou 4 positions (4 par deacutefaut) Le format drsquoaffichage est lsquoYYYYrsquo

TIME Heures de -838 h 59 minutes 59 secondes agrave 838 h 59 minutes 59 secondes

Lrsquoheure au format lsquoHHHMMSSrsquo sur 3 octets

TIMESTAMP Instants du 1er Janvier 1970 0 h 0 minute 0 seconde agrave lrsquoanneacutee 2037

Estampille sur 4 octets (au format lsquoYYYY-MM-DD HHMMSSrsquo) mise agrave jour agrave chaque modification sur la table

4055_01_C01 Page 28 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 29

chapitre ndeg 1 Deacutefinition des donneacutees

Donneacutees binaires

Les types BLOB (Binary Large OBject) permettent de stocker des donneacutees non structureacuteescomme le multimeacutedia (images sons videacuteo etc) Les quatre types de colonnes BLOB sontTINYBLOB BLOB MEDIUMBLOB et LONGBLOB Ces types sont traiteacutes comme des flotsdrsquooctets sans jeu de caractegravere associeacute

Eacutenumeacuteration

Deux types de collections sont proposeacutes par MySQL

Le type ENUM deacutefinit une liste de valeurs permises (chaicircnes de caractegraveres)

Le type SET permettra de comparer une liste agrave une combinaison de valeurs permises agravepartir drsquoun ensemble de reacutefeacuterence (chaicircnes de caractegraveres)

Structure drsquoune table (DESCRIBE)

DESCRIBE (eacutecriture autoriseacutee DESC) est une commande qui vient de SQLPlus drsquoOracle etqui a eacuteteacute reprise par MySQL Elle permet drsquoextraire la structure brute drsquoune table ou drsquounevue

DESCRIBE [nomBase] nomTableouVue [colonne]

Si la base nrsquoest pas indiqueacutee il srsquoagit de celle en cours drsquoutilisation Retrouvons la structuredes tables Compagnie et Pilote preacuteceacutedemment creacuteeacutees Le type de chaque colonneapparaicirct

Tableau 1-7 Types de donneacutees binaires

Type Description Commentaire pour une colonne

TINYBLOB(n)

Flot de n octets

Taille fixe (maximum de 255 octets)

BLOB(n) Taille fixe (maximum de 65 535 octets)

MEDIUMBLOB(n) Taille fixe (maximum de 16 meacutegaoctets)

LONGBLOB(n) Taille fixe (maximum de 429 gigaoctets)

Tableau 1-8 Types de donneacutees eacutenumeacuteration

Type Description

ENUM(valeur1valeur2) Liste de 65 535 valeurs au maximum

SET(valeur1valeur2) Ensemble de reacutefeacuterence (maximum de 64 valeurs)

4055_01_C01 Page 29 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

30 copy Eacuteditions Eyrolles

Restrictions

Les contraintes CHECK deacutefinies ne sont pas encore opeacuterationnelles

La fraction de seconde du type TIME nrsquoest pas encore pris en charge D HHMMSSfrac-tion

Les noms des colonnes doivent ecirctre uniques pour une table donneacutee (il est en revanchepossible drsquoutiliser le mecircme nom de colonne dans plusieurs tables)

Les colonnes de type SET sont eacutevalueacutees par des chaicircnes de caractegraveres seacutepareacutes par des laquo raquo(lsquoAirbus Boeingrsquo) En conseacutequence aucune valeur drsquoun SET ne doit contenir le symbole laquo raquo

Les noms des objets (base tables colonnes contraintes vues etc) ne doivent pas emprunterdes mots-cleacutes de MySQL TABLE SELECT INSERT IFhellip Si vous ecirctes laquo franco-franccedilais raquo celane vous gecircnera pas

Index

Comme lrsquoindex de cet ouvrage vous aide agrave atteindre les pages concerneacutees par un mot recher-cheacute un index MySQL permet drsquoacceacuteleacuterer lrsquoaccegraves aux donneacutees drsquoune table Le but principal

Tableau 1-9 Structure brute des tables

Reacutesultat Commentaires

mysqlgt DESCRIBE Pilote+--------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| brevet | char(6) | NO | PRI | | || nom | char(15) | YES | UNI | NULL | || nbHVol | double(72) | YES | | NULL | || compa | char(4) | YES | MUL | NULL | |+--------+-------------+------+-----+---------+-------+

Les cleacutes primaires sont NOT NULL (deacutesigneacutees par PRI dans la colonne Key)Les uniciteacutes sont deacutesigneacutees par UNI dans la colonne KeyLes occurrences multiples possibles sont deacutesigneacutees par MUL dans la colonne KeyLes contraintes NOT NULL nommeacutees (deacutefinies via les contraintes CHECK) nrsquoapparaissent pasLa colonne Extra indique notamment les seacutequences (AUTO_INCREMENT)

mysqlgt DESCRIBE Compagnie+---------+----------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+----------+------+-----+---------+-------+| comp | char(4) | NO | PRI | | || nrue | int(3) | YES | | NULL | || rue | char(20) | YES | | NULL | || ville | char(15) | YES | | Paris | || nomComp | char(15) | NO | | | |+---------+----------+------+-----+---------+-------+

4055_01_C01 Page 30 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 31

chapitre ndeg 1 Deacutefinition des donneacutees

drsquoun index est drsquoeacuteviter de parcourir une table seacutequentiellement du premier enregistrementjusqursquoagrave celui viseacute (problegraveme rencontreacute si crsquoest le Franccedilais nommeacute laquo Zidane raquo qursquoon recherchedans une table non indeacutexeacutee de plus de soixante-six millions drsquoenregistrementshellip) Le principedrsquoun index est lrsquoassociation de lrsquoadresse de chaque enregistrement avec la valeur des colonnesindeacutexeacutees

Sans index et pour n enregistrements le nombre moyen drsquoaccegraves neacutecessaire pour trouver uneacuteleacutement est eacutegal agrave n2 Avec un index ce nombre tendra vers log(n) et augmentera donc bienplus faiblement en fonction de la monteacutee en charge des enregistrements Si une table contient1 000 enregistrements alors lrsquousage drsquoun index acceacuteleacuterera lrsquoaccegraves drsquoun facteur 100 par rapportagrave un accegraves seacutequentiel

Arbres balanceacutes

La figure suivante illustre un index sous la forme drsquoun arbre Cet index est baseacute sur la colonnenom de la table Pilote Cette figure est caricaturale car un index nrsquoest pas un arbre binaire(plus de deux liens peuvent partir drsquoun nœud) Dans cet exemple trois accegraves agrave lrsquoindex serontneacutecessaires pour adresser directement un pilote via son nom au lieu drsquoen analyser huit au plus

Un index est associeacute agrave une table et peut ecirctre deacutefini sur une ou plusieurs colonnes (diteslaquo indeacutexeacutees raquo) Une table peut laquo heacuteberger raquo plusieurs index Ils sont mis agrave jour automatique-ment apregraves rafraicircchissement de la table (ajouts et suppressions drsquoenregistrements ou modifica-tion des colonnes indeacutexeacutees) Un index peut ecirctre deacuteclareacute unique si on sait que les valeurs descolonnes indeacutexeacutees seront toujours uniques

Figure 1-3 Index sur la colonne nom

ROWID

Pilote

ROWID brevet nom nbHVol compa

A PL-1 Ameacutelie Sulpice 450 AF B PL-2 Thomas Sulpice 900 AF C PL-3 Paul Soutou 1000 SING D PL-4 Aureacutelia Ente 850 ALIB E PL-5 Agnegraves Bidal 500 SING F PL-6 Sylvie Payrissat 2500 SING G PL-7 Thierry Guibert 600 ALIB H PL-8 Cathy Castaings 400 AF

Index (nom)

E F A D C B H G

nom lt rsquoDrsquo nom ge rsquoDrsquo

lt rsquoAmrsquo ge rsquoAmrsquo

ge rsquoBrsquo lt rsquoBrsquo lt rsquoAjrsquo ge rsquoAjrsquo

ge rsquoTrsquo lt rsquoTrsquo

ge rsquoQrsquo ge rsquoThlrsquo lt rsquoQrsquo ge rsquoThlrsquo

4055_01_C01 Page 31 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

32 copy Eacuteditions Eyrolles

La plupart des index de MySQL (PRIMARY KEY UNIQUE INDEX et FULLTEXT) sont stoc-keacutes dans des arbres eacutequilibreacutes (balanced trees B-trees) Drsquoautres types drsquoindex existentcitons ceux qui portent sur des colonnes SPATIAL (reverse key R-trees) et ceux appliqueacutesaux tables MEMORY (tables de hachage hash)

La particulariteacute des index B-tree est qursquoils conservent en permanence une arborescence symeacute-trique (balanceacutee) Toutes les feuilles sont agrave la mecircme profondeur Le temps de recherche estainsi agrave peu pregraves constant quel que soit lrsquoenregistrement chercheacute Le plus bas niveau de lrsquoindex(leaf blocks) contient les valeurs des colonnes indexeacutees et le rowid Toutes les feuilles delrsquoindex sont chaicircneacutees entre elles Pour les index non uniques (par exemple si on voulait deacutefinirun index sur la colonne compa de la table Pilote) le rowid est inclus dans la valeur de lacolonne indexeacutee Ces index premiers apparus sont deacutesormais tregraves fiables et performants ilsne se deacutegradent pas lors de la monteacutee en charge de la table

Creacuteation drsquoun index (CREATE INDEX)

Pour pouvoir creacuteer un index dans sa base la table agrave indexer doit appartenir agrave la base Si lrsquoutili-sateur a le privilegravege INDEX il peut creacuteer et supprimer des index dans sa base Un index estcreacuteeacute par lrsquoinstruction CREATE INDEX et supprimeacute par DROP INDEX

La syntaxe de creacuteation drsquoun index est la suivante

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX nomIndex

[USING BTREE | HASH]

ON nomTable (colonne1 [(taille1)] [ASC | DESC])

UNIQUE permet de creacuteer un index qui nrsquoaccepte pas les doublons

FULLTEXT permet de beacuteneacuteficier de fonctions de recherche dans des textes (flot de caractegrave-res)

SPATIAL permet de profiter de fonctions pour les donneacutees geacuteographiques

ASC et DESC preacutecisent lrsquoordre (croissant ou deacutecroissant)

Creacuteons deux index sur la table Pilote

Tableau 1-10 Creacuteations drsquoindex

Instruction SQL Commentaires

CREATE UNIQUE INDEX idx_Pilote_nom3 USING BTREE ON Pilote (nom(3) DESC)

Index B-tree ordre deacutecroissant sur les troispremiers caractegraveres du nom des pilotes

CREATE INDEX idx_Pilote_compa USING BTREE ON Pilote (compa)

Index B-tree ordre croissant sur la colonne cleacuteeacutetrangegravere compa

4055_01_C01 Page 32 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 33

chapitre ndeg 1 Deacutefinition des donneacutees

Bilan

bull Un index ralentit les rafraicircchissements de la base (conseacutequence de la mise agrave jour de lrsquoarbreou des bitmaps) En revanche il acceacutelegravere les accegraves

bull Il est conseilleacute de creacuteer des index sur des colonnes (majoritairement des cleacutes eacutetrangegraveres)utiliseacutees dans les clauses de jointures (voir chapitre 4)

bull Il est possible de creacuteer des index pour toutes les colonnes drsquoune table (jusqursquoagrave concurrencede 16)

bull Les index sont peacutenalisants lorsqursquoils sont deacutefinis sur des colonnes tregraves souvent modifieacutees ousi la table contient peu de lignes

Destruction drsquoun scheacutema

Il vous sera utile drsquoeacutecrire un script de destruction drsquoun scheacutema (jrsquoentends laquo scheacutema raquo commeensemble de tables contraintes et index composant une base de donneacutees et non pas en tantqursquoensemble de tous les objets drsquoun utilisateur) pour pouvoir recreacuteer une base propre Bienentendu si des donneacutees sont deacutejagrave preacutesentes dans les tables et que vous souhaitez les garder ilfaudra utiliser une strateacutegie pour les reacuteimporter dans les nouvelles tables Agrave ce niveau delrsquoouvrage vous nrsquoen ecirctes pas lagrave et le script de destruction va vous permettre de corriger voserreurs de syntaxe du script de creacuteation des tables

Nous avons vu qursquoil fallait creacuteer drsquoabord les tables laquo pegraveres raquo puis les tables laquo fils raquo (si descontraintes sont deacutefinies en mecircme temps que les tables) Lrsquoordre de destruction des tablespour des raisons de coheacuterence est inverse (il faut deacutetruire les tables laquo fils raquo puis les tableslaquo pegraveres raquo) Dans notre exemple il serait malvenu de supprimer la table Compagnie avant latable Pilote En effet la cleacute eacutetrangegravere compa nrsquoaurait plus de sens

Suppression drsquoune table (DROP TABLE)

Pour pouvoir supprimer une table dans une base il faut posseacuteder le privilegravege DROP sur cettebase Lrsquoinstruction DROP TABLE entraicircne la suppression des donneacutees de la structure de ladescription dans le dictionnaire des donneacutees des index des deacuteclencheurs associeacutes (triggers) etla reacutecupeacuteration de la place dans lrsquoespace de stockage

DROP [TEMPORARY] TABLE [IF EXISTS]

[nomBase] nomTable1 [[nomBase2]nomTable2]

[RESTRICT | CASCADE]

4055_01_C01 Page 33 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

34 copy Eacuteditions Eyrolles

TEMPORARY pour supprimer des tables temporaires Les transactions en cours ne sont pasaffecteacutees Lrsquoutilisation de TEMPORARY peut ecirctre un bon moyen de srsquoassurer qursquoon nedeacutetruit pas accidentellement une table non temporairehellip

IF EXISTS permet drsquoeacuteviter qursquoune erreur se produise si la table nrsquoexiste pas

RESTRICT et CASCADE ne sont pas encore opeacuterationnels Le premier permettra de veacuteri-fier qursquoaucun autre eacuteleacutement nrsquoutilise la table (vue deacuteclencheur etc) Le second reacutepercu-tera la destruction agrave tous les eacuteleacutements reacutefeacuterenceacutes

Les eacuteleacutements qui utilisaient la table (vues synonymes fonctions et proceacutedures) ne sont passupprimeacutes mais sont temporairement inopeacuterants Attention une suppression ne peut pas ecirctrepar la suite annuleacutee

Ordre des suppressions

Il suffit de relire agrave lrsquoenvers le script de creacuteation de vos tables pour en deacuteduire lrsquoordre de sup-pression agrave eacutecrire dans le script de destruction de votre scheacutema

Le tableau suivant preacutesente deux eacutecritures possibles pour deacutetruire des scheacutemas La premiegravereeacutecriture nrsquoest pas encore possible et il reste agrave voir comment drsquoun point de vue des performan-ces MySQL programmera le CASCADE

Tableau 1-11 Scripts eacutequivalents de destruction

Avec CASCADE (pas encore opeacuterationnel) Les laquo fils raquo puis les laquo pegraveres raquo

DROP TABLE Compagnie CASCADEDROP TABLE Pilote

DROP TABLE PiloteDROP TABLE Compagnie

4055_01_C01 Page 34 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 35

chapitre ndeg 1 Deacutefinition des donneacutees

Exercices

Lrsquoobjectif de ces exercices est de creacuteer des tables leur cleacute primaire et des contraintes de veacuteri-fication (NOT NULL et CHECK)

11 Preacutesentation de la base de donneacutees

Une entreprise deacutesire geacuterer son parc informatique agrave lrsquoaide drsquoune base de donneacutees Le bacirctiment estcomposeacute de trois eacutetages Chaque eacutetage possegravede son reacuteseau (ou segment distinct) eacutethernet Cesreacuteseaux traversent des salles eacutequipeacutees de postes de travail Un poste de travail est une machine surlaquelle sont installeacutes certains logiciels Quatre cateacutegories de postes de travail sont recenseacutees(stations Unix terminaux X PC Windows et PC NT) La base de donneacutees devra aussi deacutecrire lesinstallations de logiciels

Les noms et types des colonnes sont les suivants

Tableau 1-12 Caracteacuteristiques des colonnes

Colonne Commentaire Type

indIP trois premiers groupes IP (exemple 13012080) VARCHAR(11)

nomSegment nom du segment VARCHAR(20)

etage eacutetage du segment TINYINT(1)

nSalle numeacutero de la salle VARCHAR(7)

nomSalle nom de la salle VARCHAR(20)

nbPoste nombre de postes de travail dans la salle TINYINT(2)

nPoste code du poste de travail VARCHAR(7)

nomPoste nom du poste de travail VARCHAR(20)

ad dernier groupe de chiffres IP (exemple 11) VARCHAR(3)

typePoste type du poste (UNIX TX PCWS PCNT) VARCHAR(9)

dateIns date drsquoinstallation du logiciel sur le poste dateTIME

nLog code du logiciel VARCHAR(5)

nomLog nom du logiciel VARCHAR(20)

dateAch date drsquoachat du logiciel dateTIME

version version du logiciel VARCHAR(7)

typeLog type du logiciel (UNIX TX PCWS PCNT) VARCHAR(9)

prix prix du logiciel DECIMAL(62)

numIns numeacutero seacutequentiel des installations INTEGER(5)

dateIns date drsquoinstallation du logiciel TIMESTAMP

delai intervalle entre achat et installation SMALLINT

typeLP types des logiciels et des postes VARCHAR(9)

nomType noms des types (Terminaux X PC Windowshellip) VARCHAR(20)

4055_01_C01 Page 35 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

36 copy Eacuteditions Eyrolles

12 Creacuteation des tables

Eacutecrire puis exeacutecuter le script SQL (que vous appellerez creParcsql) de creacuteation des tables avecleur cleacute primaire (en gras dans le scheacutema suivant) et les contraintes suivantes

bull Les noms des segments des salles et des postes sont non nuls

bull Le domaine de valeurs de la colonne ad srsquoeacutetend de 0 agrave 255

bull La colonne prix est supeacuterieure ou eacutegale agrave 0

bull La colonne dateIns est eacutegale agrave la date du jour par deacutefaut

13 Structure des tables

Eacutecrire puis exeacutecuter le script SQL (que vous appellerez descParcsql) qui affiche la description detoutes ces tables (en utilisant des commandes DESCRIBE) Comparer le reacutesultat obtenu avec lescheacutema ci-dessus

14 Destruction des tables

Eacutecrire puis exeacutecuter le script SQL de destruction des tables (que vous appellerez dropParcsql)Lancer ce script puis celui de la creacuteation des tables agrave nouveau

Figure 1-4 Composition des tables

SegmentindIP nomSegment etage

SallenSalle nomSalle nbPoste indIP

PostenPoste nomPoste indIP ad typePoste nSalle

LogicielnLog nomLog dateAch version typeLog prix

InstallernPoste nLog numIns dateIns delai

TypestypeLP nomType

4055_01_C01 Page 36 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

37

Chapitre 2

Manipulation des donneacutees

Ce chapitre deacutecrit lrsquoaspect LMD (langage de manipulation des donneacutees) de MySQL Nousverrons que SQL propose trois instructions pour manipuler des donneacutees

lrsquoinsertion drsquoenregistrements

INSERT

la modification de donneacutees

UPDATE

la suppression drsquoenregistrements

DELETE

(et

TRUNCATE

)

Il existe drsquoautres possibiliteacutes que nous ne deacutetaillerons pas dans ce chapitre pour inseacuterer desdonneacutees en utilisant des outils drsquoimportation ou de migration citons MySQL Migration Tool-kit SQLPorter Navicat Intelligent Converters et MySQL Data Import de la socieacuteteacute EMS

Insertions drsquoenregistrements (

INSERT

)

Pour pouvoir inseacuterer des enregistrements dans une table il faut que vous ayez reccedilu le privilegravege

INSERT

Il existe plusieurs possibiliteacutes drsquoinsertion lrsquoinsertion monoligne qui ajoute un enre-gistrement par instruction (que nous allons deacutetailler maintenant) et lrsquoinsertion multiligne quiinsegravere plusieurs enregistrements par une requecircte (que nous deacutetaillerons au chapitre 4)

Syntaxe

La syntaxe simplifieacutee de lrsquoinstruction

INSERT

monoligne est la suivante

INSERT

[LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] [

nomBase

]

nomTable

|

nomVue

[(

nomColonne

)]

VALUES (

expression

| DEFAULT)()

[ON DUPLICATE KEY UPDATE

nomColonne

=

expression

]

DELAYED

indique que lrsquoinsertion est diffeacutereacutee (si la table est modifieacutee par ailleurs leserveur attend qursquoelle se libegravere pour y inseacuterer peacuteriodiquement de nouveaux enregistre-ments si elle redevient active entre-temps)

LOW_PRIORITY

indique que lrsquoinsertion est diffeacutereacutee agrave la libeacuteration complegravete de la table(option agrave ne pas utiliser sur des tables

MyISAM

)

HIGH_PRIORITY

annule lrsquooption

low priority

du serveur

IGNORE

indique que les eacuteventuelles erreurs deacuteclencheacutees suite agrave lrsquoinsertion seront consideacute-reacutees en tant que

warning

s

4055_02_C02 Page 37 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

38

copy Eacuteditions Eyrolles

ON DUPLICATE KEY UPDATE

permet de mettre agrave jour lrsquoenregistrement preacutesent dansla table qui a deacuteclencheacute lrsquoerreur de doublon (dans le cas drsquoun index

UNIQUE

ou drsquounecleacute primaire) Dans ce cas le nouvel enregistrement nrsquoest pas inseacutereacute seul lrsquoancien estmis agrave jour

Agrave lrsquoaide drsquoexemples nous allons deacutetailler les possibiliteacutes de cette instruction en consideacuterant lamajeure partie des types de donneacutees proposeacutes par MySQL

Renseigner toutes les colonnes

Ajoutons trois lignes dans la table

Compagnie

en alimentant toutes les colonnes de la tablepar des valeurs La deuxiegraveme insertion utilise le mot-cleacute

DEFAULT

pour affecter explicitementla valeur par deacutefaut agrave la colonne

ville

La troisiegraveme insertion attribue explicitement la valeur

NULL

agrave la colonne

nrue

Renseigner certaines colonnes

Inseacuterons deux lignes dans la table

Compagnie

en ne preacutecisant pas toutes les colonnes Lapremiegravere insertion affecte implicitement la valeur par deacutefaut agrave la colonne

ville

Ladeuxiegraveme donne implicitement la valeur

NULL

agrave la colonne

nrue

La table

Compagnie

contient agrave preacutesent les lignes suivantes

Tableau 2-1 Insertions

Instruction SQL Commentaires

INSERT INTO Compagnie VALUES (SING 7 Camparols Singapour Singapore AL)

Toutes les valeurs sont renseigneacutees dans lrsquoordre de la structure de la table

INSERT INTO Compagnie VALUES (AC 10 Gambetta

DEFAULT

Air France)

DEFAULT

explicite

INSERT INTO Compagnie VALUES (AN1

NULL

Hoche Blagnac Air Nul1)

NULL

explicite

Web

Tableau 2-2 Insertions de certaines colonnes

Instruction SQL Commentaires

INSERT INTO Compagnie(comp nrue rue nomComp) VALUES (AF 8 Champs Elyseacutees Castanet Air)

DEFAULT

implicite

INSERT INTO Compagnie(comp rue ville nomComp) VALUES (AN2 Foch Blagnac Air Nul2)

NULL

sur

nrue

implicite

Web

4055_02_C02 Page 38 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

39

chapitre ndeg 2 Manipulation des donneacutees

Plusieurs enregistrements

Le script suivant ajoute trois nouvelles compagnies en une seule instruction

INSERT

INSERT INTO Compagnie VALUES

(LUFT9SalasMunichLuftansa)

(QUAN1KangourooSydneyQuantas)

(SNCM3P PaoliBastiaCorse Air)

Ne pas respecter des contraintes

Inseacuterons des enregistrements dans la table

Pilote

qui ne respectent pas des contraintes Le tableausuivant deacutecrit les messages renvoyeacutes pour chaque erreur (le nom de la contrainte apparaicirct danschaque message les valeurs erroneacutees sont noteacutees en gras) La premiegravere erreur vient de la cleacute primairela seconde de lrsquouniciteacute du nom La troisiegraveme erreur signifie que la cleacute eacutetrangegravere reacutefeacuterence une cleacuteprimaire absente (ici une compagnie inexistante) Nous reviendrons sur ce dernier problegraveme dans lasection

Erreur Source du renvoi introuvable

La derniegravere concerne la contrainte en ligne

NOT NULL

Figure 2-1

Table apregraves les insertions

Compagnie

comp nrue rue ville nomComp

SING 7 Camparols Singapour Singapore AL AF 10 Gambetta Paris Air France AN1 Hoche Blagnac Air Nul1 AC 8 Champs Elyseacutees Paris Castanet Air AN2 Foch Blagnac Air Nul2

Valeur par deacutefaut Valeur NULL

Tableau 2-3 Insertions

Insertions veacuterifiant les contraintes Insertions ne veacuterifiant pas les contraintes

INSERT INTO Pilote VALUES (PL-1 Louise Ente 450 AF)

mysqlgt INSERT INTO Pilote VALUES(

PL-1

Ameacutelie Sulpice 100 AF)ERROR

1062

(23000)

Duplicate entry

PL-1 forkey 1

INSERT INTO Pilote VALUES (PL-2 Jules Ente 900 AF)

mysqlgt INSERT INTO Pilote VALUES (PL-4

Louise Ente

450 AF)ERROR

1062

(23000)

Duplicate entry

Louise Ente for key 2

INSERT INTO Pilote VALUES (PL-3 Paul Soutou 1000 SING)

mysqlgt INSERT INTO Pilote VALUES (PL-5 Thomas Sulpice 500

TOTO

)ERROR

1452

(23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT`fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))mysqlgt INSERT INTO Pilote VALUES (PL-6

NULL

100 AF)ERROR

1048

(23000) Column nom cannot be null

Web

4055_02_C02 Page 39 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

40

copy Eacuteditions Eyrolles

Donneacutees binaires

Le type BIT permet de manipuler des suites variables de bits Des fonctions sont disponiblespour programmer le laquo ET raquo le laquo OU raquo exclusif ou inclusif etc La table suivante contientdeux colonnes de ce type Notez lrsquoutilisation du preacutefixe laquo b raquo pour initialiser un tel type

CREATE TABLE Registres (nom CHAR(5)numero BIT(2)adresse BIT(16))

INSERT INTO Registres VALUES (COM2 )

Eacutenumeacuterations

Le type ENUM est consideacutereacute comme une liste de chaicircnes de caractegraveres Toute valeur drsquounecolonne de ce type devra appartenir agrave cette liste eacutetablie lors de la creacuteation de la table Suppo-sons qursquoon recense quatre types possibles de diplocircmes (BTS DUT Licence et INSA) pourchaque eacutetudiant On ne stocke qursquoun seul diplocircme par eacutetudiant

Le script de la creacuteation de la table et des insertions est le suivant Notez que les parenthegravesessont optionnelles pour deacutesigner la colonne ENUM

Le type SET permet de comparer une liste agrave une combinaison de valeurs permises agrave partir drsquounensemble de reacutefeacuterence (chaicircnes de caractegraveres) Supposons qursquoon deacutesire stocker plusieursdiplocircmes par eacutetudiant

b10 b0000010011110111

Figure 2-2 Table avec une colonne ENUM

UnCursus

num nom diplome

E1 F Brouard BTS E2 F Degrelle Licence

ENUM

BTS DUT Licence INSA

Tableau 2-4 Insertions avec un ENUM

Creacuteation Insertions (deux bonnes une illicite)

CREATE TABLE UnCursus (num CHAR(4) nom CHAR(15) diplome ENUM CONSTRAINT pk_Cusus PRIMARY KEY(num))

mysqlgt INSERT INTO UnCursus VALUES (E1 F Brouard (BTS))mysqlgt INSERT INTO UnCursus VALUES (E2 F Degrelle Licence)

mysqlgt INSERT INTO UnCursus VALUES (E3 Bug (MathSup))ERROR 1265 (01000) Data truncated for column diplome at row 1

(BTSDUTLicenceINSA)

4055_02_C02 Page 40 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 41

chapitre ndeg 2 Manipulation des donneacutees

Le script de la creacuteation de la table et des insertions est le suivant (mecircme remarque pour lesparenthegraveses)

Dates et heures

Nous avons deacutecrit au chapitre 1 les caracteacuteristiques geacuteneacuterales des types MySQL pour stockerdes eacuteleacutements de type dateheure Eacutetudions maintenant la manipulation de ces types Nousverrons que MySQL peut les consideacuterer soit en tant que chaicircnes de caractegraveres soit commenumeacuteriques

Formats

Concernant les types DATETIME DATE et TIMESTAMP les formats possibles sont lessuivants

Chaicircnes de caractegraveres YYYY-MM-DD HHMMSS ou YY-MM-DD HHMMSS (pour lescolonnes DATE YYYY-MM-DD ou YY-MM-DD) Tout autre deacutelimiteur est autoriseacute comme 20051231 113045 (pour les colonnes DATE 651231 651231 et651231 sont eacutequivalents et deacutesignent tous le reacuteveillon de lrsquoanneacutee 1965)

Consideacutereacutes comme chaicircnes de caractegraveres dans les formats suivants YYYYMMDD-HHMMSS ou YYMMDDHHMMSS (pour les DATE YYYYMMDD ou YYMMDD) ensupposant que la chaicircne ait un sens en tant que date Ainsi 19650205063000 est inter-preacuteteacute comme le 5 feacutevrier 1965 agrave 6 heures et 30 minutes Par contre 19650255 nrsquoa pas desens du fait du jour (il sera interpreacuteteacute comme 0000-00-00)

Figure 2-3 Table avec une colonne SET

Cursus

num nom diplomes

E1 F Brouard BTS Licence E2 F Degrelle Licence INSA DUT

SET

BTS DUT Licence INSA

Tableau 2-5 Insertions avec un SET

Creacuteation Insertions (deux bonnes une illicite)

CREATE TABLE Cursus (num CHAR(4) nom CHAR(15) diplomes SET CONSTRAINT pk_Cusus PRIMARY KEY(num))

mysqlgt INSERT INTO Cursus VALUES (E1 F Brouard )mysqlgt INSERT INTO Cursus VALUES (E2 F Degrelle

mysqlgt INSERT INTO Cursus VALUES (E3 Bug )ERROR 1265 (01000) Data truncated for column diplomes at row 1

(BTSDUTLicenceINSA)

(BTSLicence)

LicenceINSADUT

(BTSINSAENAC)

4055_02_C02 Page 41 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

42 copy Eacuteditions Eyrolles

Consideacutereacutes comme numeacuteriques dans les formats suivants YYYYMMDDHHMMSS ouYYMMDDHHMMSS (pour les DATE YYYYMMDD ou YYMMDD) en supposant que le nombre aitun sens en tant que date Ainsi 19650205063000 est interpreacuteteacute comme le 5 feacutevrier 1965 agrave6 heures et 30 minutes Par contre 19650205069000 nrsquoa pas de sens du fait des minutes (ilsera interpreacuteteacute comme 00000000000000)

Exemple avec DATE et DATETIME

Deacuteclarons la table Pilote qui contient deux colonnes de type dateheure DATE et DATETIME

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) dateNaiss DATE

nbHVol DECIMAL(72)dateEmbauche DATETIME compa VARCHAR(4)

CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

Lrsquoinsertion du pilote initialise la date de naissance au 5 feacutevrier 1965 ainsi que celle delrsquoembauche agrave la date du moment (heures minutes secondes) par la fonction SYSDATE

INSERT INTO Pilote

VALUES (PL-1 Christian Soutou 1965-02-05 900 SYSDATE() AF)

Nous verrons au chapitre 4 comment extraire les anneacutees mois jours heures minutes etsecondes Nous verrons aussi qursquoil est possible drsquoajouter ou de soustraire des dates entre elles

Exemple avec TIME et YEAR

Par analogie aux diffeacuterents formats des dates les heures (type TIME HHMMSS ouHHHMMSS) peuvent aussi ecirctre manipuleacutees sous la forme de chaicircnes ou de nombres

Chaicircne D HHMMSSfraction avec le nombre de jours (0 agrave 34) et la fraction deseconde (pas encore opeacuterationnelle) HHMMSSfraction HHMMSS HHMMD HHMMSS D HHMM D HH ou SS

Chaicircne sans les deacutelimiteurs sous reacuteserve que la chaicircne ait un sens Ainsi 101112 estconsideacutereacute comme 101112 mais 109712 est incorrect du fait des minutes ildevient 000000

Nombre en raisonnant comme les chaicircnes Ainsi 101112 est consideacutereacute comme101112 mais 109712 est incorrect du fait des minutes il devient 000000Les formats suivants sont aussi corrects SS MMSS HHMMSS

La table Pilote suivante contient la colonne pasVolDepuis pour stocker le deacutelai depuis ledernier vol et la colonne retraite qui indique lrsquoanneacutee de retraite

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) pasVolDepuis TIME retraite YEAR

CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

4055_02_C02 Page 42 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 43

chapitre ndeg 2 Manipulation des donneacutees

Les insertions suivantes utilisent diffeacuterents formats Le premier pilote nrsquoa pas voleacute depuis1 jour et 23 heures (47 heures) le second depuis 15 heures 26 minutes 30 secondes le troi-siegraveme depuis 4 jours et 23 heures (119 heures) le quatriegraveme depuis 3 heures 27 minutes et50 secondes et le dernier se croit plus preacutecis que tous les autres en ajoutant une fraction qui nesera pas prise en compte au niveau de la base

INSERT INTO Pilote VALUES (PL-1 Hait 1 2300 2002)

INSERT INTO Pilote VALUES (PL-2 Crampes 152630 2006)

INSERT INTO Pilote VALUES (PL-3 Tuffery 4 2300 05)

INSERT INTO Pilote VALUES (PL-4 Mercier 032750 07)

INSERT INTO Pilote VALUES (PL-5 Albaric 1 2300457 01)

Lrsquoeacutetat de la base est le suivant

mysqlgt SELECT FROM Pilote

+--------+---------+--------------+----------+

| brevet | nom | pasVolDepuis | retraite |

+--------+---------+--------------+----------+

| PL-1 | Hait | 470000 | 2002 |

| PL-2 | Crampes | 152630 | 2006 |

| PL-3 | Tuffery | 1190000 | 2005 |

| PL-4 | Mercier | 032750 | 2007 |

| PL-5 | Albaric | 470000 | 2001 |

+--------+---------+--------------+----------+

Si un deacutepassement se produit au niveau drsquoune colonne TIME celle-ci est eacutevalueacutee au maximumou au minimum (-8500000 et 9990000 sont respectivement convertis agrave -8385959 et8385959)

Exemple avec TIMESTAMP

Toute colonne du type TIMESTAMP est actualiseacutee agrave chaque modification de lrsquoenregistrement la premiegravere fois agrave lrsquoINSERT puis agrave chaque UPDATE (quelle que soit la colonne mise agrave jour)Deacuteclarons la table Pilote qui contient une colonne de ce type

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) misaJour TIMESTAMP

CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

Lrsquoinsertion du pilote suivant initialisera la colonne agrave la date systegraveme (comme SYSDATE)

INSERT INTO Pilote (brevetnom) VALUES (PL-1 Hait)

Par la suite et agrave la diffeacuterence drsquoun type DATE ou DATETIME pour chaque modification de cepilote la colonne misaJour sera reacuteactualiseacutee avec la date de lrsquoinstant de la mise agrave jour

4055_02_C02 Page 43 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

44 copy Eacuteditions Eyrolles

Mecircme si vous croyez mettre agrave NULL cette colonne avec une instruction UPDATE elle contien-dra toujours lrsquoinstant de votre vaine tentative

Fonctions utiles

Les fonctions CURRENT_TIMESTAMP() CURRENT_DATE() et CURRENT_TIME() UTC_TIME() renseignent sur lrsquoinstant la date lrsquoheure et lrsquoheure GMT de la session en cours

Il nrsquoest pas neacutecessaire drsquoutiliser une table pour afficher une expression dans lrsquointerface decommande Lrsquoexemple suivant montre que la requecircte a eacuteteacute exeacutecuteacutee le 1er novembre 2005 agrave10 heures 11 minutes et 27 secondes Le client est sur le fuseau GMT+1h

mysqlgt SELECT CURRENT_TIMESTAMP() CURRENT_TIME() CURRENT_DATE() UTC_TIME()+---------------------+----------------+----------------+------------+| CURRENT_TIMESTAMP() | CURRENT_TIME() | CURRENT_DATE() | UTC_TIME() |+---------------------+----------------+----------------+------------+| 2005-11-01 101127 | 101127 | 2005-11-01 | 091127 |+---------------------+----------------+----------------+------------+

Seacutequences

Bien que laquo seacutequence raquo ne soit pas dans le vocabulaire de MySQL car le meacutecanisme qursquoilpropose nrsquoest pas aussi puissant que celui drsquoOracle MySQL offre la possibiliteacute de geacuteneacutererautomatiquement des valeurs numeacuteriques Ces valeurs sont bien utiles pour composer des cleacutesprimaires de tables quand vous ne disposez pas de colonnes adeacutequates agrave cet effet Ce meacuteca-nisme reacutepond en grande partie agrave ce qursquoon attendrait drsquoune seacutequence

En attendant que MySQL offre peut-ecirctre dans une prochaine version un meacutecanisme plus richeque celui que nous allons eacutetudier je me permets drsquoappeler laquo seacutequence raquo une colonne indexeacuteede type entier (INTEGER SMALLINT TINYINT MEDIUMINT et BIGINT) deacutefinie agrave lrsquoaide de ladirective AUTO_INCREMENT Cette colonne est cleacute primaire ou unique et non nulle Uneseacutequence est en geacuteneacuteral affecteacutee agrave une table mais vous pouvez lrsquoutiliser pour plusieurs tablesou variables

Utilisation en tant que cleacute primaire

La figure suivante illustre la seacutequence appliqueacutee agrave la colonne numAff pour initialiser lesvaleurs de la cleacute primaire de la table Affreter La fonction LAST_INSERT_ID() retournela derniegravere valeur de la seacutequence geacuteneacutereacutee (ici le pas est de 1 la seacutequence deacutebute par deacutefaut agrave 1nous verrons par la suite qursquoil est possible drsquoutiliser une valeur diffeacuterente)

4055_02_C02 Page 44 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 45

chapitre ndeg 2 Manipulation des donneacutees

Le tableau suivant deacutecrit la creacuteation de cette table et diffeacuterentes eacutecritures pour les insertions

Modification drsquoune seacutequence

La seule modification possible drsquoune seacutequence est celle qui consiste agrave changer la valeur dedeacutepart de la seacutequence (avec ALTER TABLE) Seules les valeurs agrave venir de la seacutequence modi-fieacutee seront changeacutees (heureusement pour les donneacutees existantes des tables)

Supposons qursquoon deacutesire continuer agrave inseacuterer des nouveaux affregravetements agrave partir de lavaleur 100 Le prochain affregravetement sera estimeacute agrave 100 et les insertions suivantes prendront encompte le nouveau point de deacutepart tout en laissant intactes les donneacutees existantes des tables

ALTER TABLE Affreter AUTO_INCREMENT = 100

INSERT INTO Affreter (compimmatdateAffnbPax)

VALUES (SING F-NEW SYSDATE() 77)

mysqlgt SELECT FROM Affreter

Figure 2-4 Seacutequence appliqueacutee agrave une cleacute primaire

Affreter numAff comp immat dateAff nbPax

1 AF F-WTSS 13-05-2005 85 2 SING F-GAFU 05-02-2005 155 3 AF F-WTSS 11-09-2005 90 4 AF F-GLFS 11-09-2005 75 AUTO_INCREMENT

LAST_INSERT_ID() rArr 4

Tableau 2-6 Seacutequence pour une cleacute primaire

Table Insertions

CREATE TABLE Affreter( comp CHAR(4) immat CHAR(6) dateAff DATE nbPax SMALLINT(3) CONSTRAINT pk_Affreter PRIMARY KEY (numAff))

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES (AFF-WTSS2005-05-1385)

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES (SINGF-GAFU2005-02-05155)

INSERT INTO Affreter VALUES (NULLAFF-WTSS2005-09-1190)

INSERT INTO Affreter VALUES (0AFF-GLFS2005-09-1175)

numAff SMALLINT AUTO_INCREMENT

4055_02_C02 Page 45 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

46 copy Eacuteditions Eyrolles

+--------+------+--------+------------+-------+

| numAff | comp | immat | dateAff | nbPax |

+--------+------+--------+------------+-------+

| 1 | AF | F-WTSS | 2005-05-13 | 85 |

| 2 | SING | F-GAFU | 2005-02-05 | 155 |

| 3 | AF | F-WTSS | 2005-09-11 | 90 |

| 4 | AF | F-GLFS | 2005-09-11 | 75 |

| 100 | SING | F-NEW | 2005-11-01 | 77 |

+--------+------+--------+------------+-------+

Utilisation en tant que cleacute eacutetrangegravere

Creacuteons deux seacutequences qui vont permettre de donner leur valeur aux cleacutes primaires des deuxtables illustreacutees agrave la figure suivante (les affregravetements commencent agrave 1 les passagers agrave 100)Servons-nous aussi de la seacutequence de la table Affreter pour indiquer le dernier vol dechaque passager La section Inteacutegriteacute reacutefeacuterentielle deacutetaille les meacutecanismes relatifs aux cleacuteseacutetrangegraveres

Le script SQL de deacutefinition et de manipulation des donneacutees est indiqueacute ci-apregraves La valeur dedeacutepart drsquoune seacutequence peut ecirctre deacutefinie agrave la fin de lrsquoordre CREATE TABLE Notez eacutegalementlrsquoutilisation de la fonction LAST_INSERT_ID dans les insertions pour reacutecupeacuterer la valeur dela cleacute primaire

Figure 2-5 Seacutequence appliqueacutee agrave une cleacute eacutetrangegravere

Affreter

numAff comp immat dateAff nbPax

1 AF F-WTSS 13-05-2005 85 2 SING F-GAFU 05-02-2005 155 3 AF F-WTSS 15-05-2005 82 AUTO_INCREMENT

LAST_INSERT_ID() rArr 3

Passager

numPax nom siege dernierVol

100 Payrissat 7A 2 101 Castaings 2E 3

AUTO_INCREMENT

LAST_INSERT_ID() rArr 101

4055_02_C02 Page 46 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 47

chapitre ndeg 2 Manipulation des donneacutees

Modifications de colonnes

Lrsquoinstruction UPDATE permet la mise agrave jour des colonnes drsquoune table Pour pouvoir modifierdes enregistrements drsquoune table il faut que cette derniegravere soit dans votre base ou que vousayez reccedilu le privilegravege UPDATE sur la table

Syntaxe (UPDATE)

La syntaxe simplifieacutee de lrsquoinstruction UPDATE est la suivante

UPDATE [LOW_PRIORITY] [IGNORE] [nomBase] nomTable

SET col_name1=expr1 [ col_name2=expr2 ]

SET colonne1 = expression1 | (requecircte_SELECT) | DEFAULT

[colonne2 = expression2]

[WHERE (condition)]

[ORDER BY listeColonnes]

[LIMIT nbreLimite]

LOW_PRIORITY indique que la modification est diffeacutereacutee agrave la libeacuteration complegravete de latable (option agrave ne pas utiliser sur des tables MyISAM)

IGNORE signifie que les eacuteventuelles erreurs deacuteclencheacutees suite aux modifications serontconsideacutereacutees en tant que warnings

La clause SET actualise une colonne en lui affectant une expression (valeur valeur pardeacutefaut calcul ou reacutesultat drsquoune requecircte)

Tableau 2-7 Seacutequence pour une cleacute eacutetrangegravere

Tables Insertions

CREATE TABLE Affreter( comp CHAR(4) immat CHAR(6) dateAff DATEnbPax SMALLINT(3) CONSTRAINT pk_Affreter PRIMARY KEY (numAff))

CREATE TABLE Passager( nom CHAR(15) siege CHAR(4) dernierVol SMALLINTCONSTRAINT pk_Passager PRIMARY KEY(numPax)CONSTRAINT fk_Pax_vol_Affreter FOREIGN KEY (dernierVol) REFERENCES Affreter(numAff))

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES(AFF-WTSS2005-05-1385)

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES(SINGF-GAFU2005-02-05155)

INSERT INTO Passager VALUES (NULLPayrissat7ALAST_INSERT_ID())

INSERT INTO Affreter VALUES (NULLAFF-WTSS2005-05-1582)

INSERT INTO Passager VALUES (NULLCastaings2ELAST_INSERT_ID())

WebnumAff SMALLINT AUTO_INCREMENT

numPax SMALLINT AUTO_INCREMENT

AUTO_INCREMENT = 100

4055_02_C02 Page 47 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

48 copy Eacuteditions Eyrolles

La condition du WHERE filtre les lignes agrave mettre agrave jour dans la table Si aucune conditionnrsquoest preacuteciseacutee tous les enregistrements seront actualiseacutes Si la condition ne filtre aucuneligne aucune mise agrave jour ne sera reacutealiseacutee

ORDER BY indique lrsquoordre de modification des colonnes

LIMIT speacutecifie le nombre maximum drsquoenregistrements agrave changer (par ordre de cleacuteprimaire croissante)

Modification drsquoune colonne

Modifions la compagnie de code AN1 en affectant la valeur 50 agrave la colonne nrue

UPDATE Compagnie SET nrue = 50 WHERE comp = AN1

Modification de plusieurs colonnes

Modifions la compagnie de code AN2 en affectant simultaneacutement la valeur 14 agrave la colonnenrue et la valeur par deacutefaut (Paris) agrave la colonne ville

UPDATE Compagnie SET nrue = 14 ville = DEFAULT WHERE comp = AN2

La table Compagnie contient agrave preacutesent les donneacutees suivantes

Modification de plusieurs enregistrements

Modifions les deux premiegraveres compagnies (par ordre de cleacute primaire ici AC et AF) en affec-tant la valeur Toulouse agrave la colonne ville

UPDATE Compagnie SET ville = Toulouse LIMIT 2

Ne pas respecter les contraintes

Il faut comme pour les insertions respecter les contraintes qui existent au niveau des colon-nes Dans le cas inverse une erreur est renvoyeacutee (le nom de la contrainte apparaicirct) et la mise agravejour nrsquoest pas effectueacutee

Figure 2-6 Table apregraves les modifications

Compagnie

comp nrue rue ville nomComp

SING 7 Camparols Singapour Singapore AL AF 10 Gambetta Paris Air France AN1 50 Hoche Blagnac Air Nul1 AC 8 Champs Elyseacutees Paris Castanet Air AN2 14 Foch Paris Air Nul2

Modifications 2

Modification 1

4055_02_C02 Page 48 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 49

chapitre ndeg 2 Manipulation des donneacutees

Agrave partir de la table Pilote le tableau suivant deacutecrit des modifications (certaines ne veacuterifientpas de contraintes) La mise agrave jour drsquoune cleacute eacutetrangegravere est possible si elle nrsquoest pas reacutefeacuterenceacuteepar une cleacute primaire (voir la section Inteacutegriteacute reacutefeacuterentielle)

Tableau 2-8 Table donneacutees et contraintes

Donneacutees Table et contraintes

Figure 2-7 Donneacutees CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) NOT NULL nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT ck_nbHVol CHECK (nbHVol BETWEEN 0 AND 20000) CONSTRAINT un_nom UNIQUE(nom) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))

Web

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

Tableau 2-9 Modifications

Veacuterifiant les contraintes (sauf une ) Ne veacuterifiant pas les contraintes

--Modification drsquoune cleacute eacutetrangegravereUPDATE Pilote SET compa = SING WHERE brevet = PL-2

-- Modification drsquoune cleacute primaireUPDATE Pilote SET brevet = PL3bis WHERE brevet = PL-3

--Passe outre la contrainte CHECK UPDATE Pilote SET nbHVol= 30000 WHERE brevet = PL-1

Figure 2-8 Apregraves modifications

mysqlgt UPDATE Pilote SET brevet=PL-2 WHERE brevet=PL-1ERROR 1062 (23000) Duplicate entry PL-2 for key 1

mysqlgt UPDATE Pilote SET nom = NULL WHERE brevet = PL-1ERROR 1263 (22004) Column set to default value NULL supplied to NOT NULL column nom at row 1

mysqlgt UPDATE Pilote SET nom=Paul Soutou WHERE brevet = PL-1ERROR 1062 (23000) Duplicate entry Paul Soutou for key 2

mysqlgt UPDATE Pilote SET compa=TOTO WHERE brevet = PL-1ERROR 1452 (23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))

Web

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 30000 AF PL-2 Jules Ente 900 SING PL3bis Paul Soutou 1000 SING

4055_02_C02 Page 49 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

50 copy Eacuteditions Eyrolles

Restrictions

Pour lrsquoheure il nrsquoest pas possible de modifier une table en utilisant une requecircte (dans la clauseSET) portant sur cette mecircme table

Dates et intervalles

Le tableau suivant reacutesume les principales opeacuterations possibles entre des colonnes de type date-heure

Consideacuterons la table suivante

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) dateNaiss DATETIME dernierVol DATE

dateEmbauche DATETIME prochainVolControle DATETIME

nombreJoursNaisBoulot INTEGER(5)

intervalleNaisBoulot Decimal (206) intervalleVolExterieur

Decimal (106)

intervalleEntreVols Decimal (106) intervalleEmbaucheControle

TIME

compa VARCHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

Agrave lrsquoinsertion du pilote Thierry Albaric de la compagnie de code AF initialisons sa date denaissance (25 mars 1967) la date de son dernier vol (30 octobre 2005) sa date drsquoembauche (agravecelle du jour) et la date de son prochain controcircle en vol (13 novembre 2005 15h30)

INSERT INTO Pilote VALUES

(PL-1 Thierry Albaric1967-03-252005-10-30 SYSDATE()

2005-11-13 153000 NULL NULL NULL NULL NULL AF)

Les mises agrave jour par UPDATE sur cet enregistrement vont consister sur la base de ces quatredates agrave calculer les intervalles illustreacutes agrave la figure suivante

Tableau 2-10 Opeacuterations entre colonnes date-heure

Opeacuterande 1 Opeacuterateur Opeacuterande 2 Reacutesultat

DATE | DATETIME + ou - Interval DATE | DATETIME

DATE | DATETIME + ou - INTEGER DATE | DATETIME

TIME + ou - TIME TIME

TIME + ou - INTEGER TIME

Web

4055_02_C02 Page 50 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 51

chapitre ndeg 2 Manipulation des donneacutees

Modification drsquoune heure

On modifie une date en preacutecisant une heure via la fonction en rajoutant le format HHMMSSquels que soient les deacutelimiteurs (ici laquo raquo)

UPDATE Pilote SET dateNaiss = 1967-03-25 123500

WHERE brevet = PL-1

Ajout drsquoun deacutelai

On modifie la date drsquoembauche de 10 minutes apregraves la semaine prochaine Lrsquoajout drsquoun inter-valle srsquoopegravere par la fonction DATE_ADD coupleacutee agrave la directive DAY_MINUTE qui permet despeacutecifier un jour une heure et une minute Ainsi la semaine agrave ajouter correspond au laquo 7 raquo duparamegravetre de mecircme pour les 10 minutes

UPDATE Pilote

SET dateEmbauche =

WHERE brevet = PL-1

Diffeacuterence entre deux dates

La diffeacuterence entre deux dates peut se programmer agrave lrsquoaide de la fonction DATEDIFF quirenvoie un entier correspondant au nombre de jours seacuteparant les deux dates

UPDATE Pilote

SET nombreJoursNaisBoulot =

WHERE brevet = PL-1

Cette mecircme diffeacuterence au format drsquoun intervalle plus preacutecis (nombre de jours deacutecimaux) requiertlrsquoutilisation de la fonction TIMESTAMPDIFF(intervalledatetime1datetime2) quenous eacutetudierons au chapitre 4 (il existe bien sucircr drsquoautres possibiliteacutes de programmation) Cettefonction effectue la diffeacuterence entre deux dates suivant un format drsquointervalle donneacute (ici onobtient des secondes qursquoon divise par (243600) pour convertir en jours)

Figure 2-9 Intervalles agrave calculer

dateNais 2351967 qui passe agrave 12h35

dernierVol 30-10-2005

dateEmbauche 02-11-2005 x h y min qui passe agrave 09-11-2005 x h y+10 min

prochainVolControle13-11-2005 15h30

nombreJoursNaisBoulot

intervalleNaisBoulot

intervalleVolExterieur

intervalleEntreVols

intervalleEmbaucheControle

DATE_ADD(dateEmbaucheINTERVAL 7 010 DAY_MINUTE)

DATEDIFF(dateEmbauchedateNaiss)

4055_02_C02 Page 51 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

52 copy Eacuteditions Eyrolles

UPDATE Pilote SET

intervalleNaisBoulot =

intervalleEntreVols =

intervalleVolExterieur =

WHERE brevet = PL-1

Diffeacuterence entre deux intervalles

La diffeacuterence entre deux deacutecimaux renvoie un deacutecimal qursquoon convertit en format TIME (srsquoilest infeacuterieur agrave 839 h soit 3495 jours) par la fonction SEC_TO_TIME apregraves lrsquoavoir changeacute ensecondes (multiplieacute par 243600)

UPDATE Pilote SET

intervalleEmbaucheControle =

WHERE brevet = PL-1

La ligne contient deacutesormais les informations suivantes Les donneacutees en gras correspondentaux mises agrave jour On trouve qursquoil a fallu 14 109126875 jours pour que ce pilote soit embau-cheacute 106511181 jours seacuteparent le dernier vol du pilote du moment de son embauche14645833 jours seacuteparent son dernier vol de son prochain controcircle en vol La diffeacuterence entreces deux deacutelais est de 95 heures 52 minutes et 18 secondes

Nous verrons au chapitre 4 comment convertir en jours heures minutes et secondes un deacuteci-mal de grande taille

Figure 2-10 Ligne modifieacutee par des calculs de dates

TIMESTAMPDIFF(SECONDdateNaissdateEmbauche)(243600)

TIMESTAMPDIFF(SECONDdernierVolprochainVolControle)(243600)

TIMESTAMPDIFF(SECONDdernierVoldateEmbauche)(243600)

SEC_TO_TIME((intervalleEntreVols - intervalleVolExterieur)243600)

Pilote

brevet nom dateNaiss dernierVol dateEmbauche prochainVolControle

PL-1 Thierry Albaric 1967-03-25 1967-03-25 123500

2005-10-30 2005-11-02 152742 2005-11-09 153742

2005-11-13 153000

nombreJoursNaisBoulot intervalleNaisBoulot intervall eVolExterieur

13186 1596 14109126875 10651181

intervalleEntreVols intervalleEmbaucheControle compa

14645833 955218 AF

4055_02_C02 Page 52 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 53

chapitre ndeg 2 Manipulation des donneacutees

Fonctions utiles

Les fonctions suivantes vous seront drsquoun grand secours pour manipuler des dates et des intervalles

bull DATE_FORMAT(dateformat) convertit une date (heure) suivant un certain format

bull EXTRACT(type FROM date) extrait une partie donneacutee drsquoune date (heure)

bull FROM_DAYS(n) retourne une date agrave partir drsquoun entier (le 110001 correspond agrave 366) UNIX_TIMESTAMP(date) retourne le nombre de secondes qui se sont eacutecouleacutees depuis le1er janvier 1970 jusqursquoagrave la date (heure) en paramegravetre

bull GET_FORMAT(DATE|TIME|DATETIMEEUR|USA|JIS|ISO|INTERNAL)retourne un format de date (heure)

bull SEC_TO_TIME(secondes) convertit un nombre en un type TIME et son inverse TIME_TO_SEC(time)

bull STR_TO_DATE(chaineformat) convertit une chaicircne en date (heure) suivant un certain format

bull TIME(expression)extrait drsquoune date (heure) un type TIME

bull TIME_FORMAT(timeformat) convertit un intervalle suivant un certain format

Les tableaux suivants preacutesentent quelques exemples drsquoutilisation de ces fonctions

Tableau 2-11 Quelques formats pour DATE_FORMAT et STR_TO_DATE

Expression Reacutesultat Commentaire

DATE_FORMAT(SYSDATE()j) 306 Ce nrsquoest pas la vitesse de Danieldans Taxi2 mais le numeacutero du jourde lrsquoanneacutee (ici il srsquoagit du2 novembre 2005)

DATE_FORMAT(dateNaissW en M X)

Saturday en March 1967

Affichage des libelleacutes des jours etdes mois en anglais par deacutefaut

STR_TO_DATE(11092005 153742dmY His)

2005-09-11 153742 Conversion drsquoune chaicircne typeacutee datefranccedilaise au format DATETIME

Tableau 2-12 Utilisation de EXTRACT et UNIX_TIMESTAMP

Expression Reacutesultat Commentaire

EXTRACT(DAY FROM dateEmbauche) 9 Extraction du jour contenu dans la colonne

EXTRACT(MONTH FROM dateNaiss) 3 Extraction du mois contenu dans la colonne

UNIX_TIMESTAMP(SYSDATE())(243600) 130898850 Le 2 novembre 2005 au soir 13 089 jours etdes poussiegraveres srsquoeacutetaient eacutecouleacutes depuis1970

4055_02_C02 Page 53 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

54 copy Eacuteditions Eyrolles

Remplacement drsquoun enregistrement

Lrsquoinstruction REPLACE consiste comme son nom lrsquoindique agrave remplacer un enregistrementdans sa totaliteacute (toutes ses colonnes) Il faut avoir les privilegraveges INSERT et DELETE sur latable Crsquoest selon la valeur de la cleacute primaire ou celle drsquoun index unique que lrsquoenregistrementsera remplaceacute

Si la table ne dispose pas drsquoune contrainte PRIMARY KEY ou UNIQUE lrsquoutilisation de REPLACEnrsquoa pas de sens et devient eacutequivalente agrave INSERT

La syntaxe simplifieacutee de lrsquoinstruction UPDATE est la suivante

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] [nomBase] nomTable [(colonne1)]

VALUES (expression1 | DEFAULT) [()]

LOW_PRIORITY et DELAYED ont la mecircme signification que pour INSERT et UPDATE

VALUES contient les valeurs de remplacement

Lrsquoinstruction suivante remplace lrsquoenregistrement relatif agrave la compagnie de code AN1 (voirfigure 2-6)

REPLACE INTO Compagnie VALUES (AN1 24 Salas Ramonville Air RENATO)

Suppressions drsquoenregistrements

Les instructions DELETE et TRUNCATE permettent de supprimer un ou plusieurs enregistre-ments drsquoune table Pour pouvoir supprimer des enregistrements dans une table il faut quecette derniegravere soit dans votre base ou que vous ayez reccedilu le privilegravege DELETE sur la table

Instruction DELETELa syntaxe simplifieacutee de lrsquoinstruction DELETE est la suivante

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM [nomBase] nomTable

[WHERE (condition)]

[ORDER BY listeColonnes]

[LIMIT nbreLimite]

LOW_PRIORITY IGNORE et LIMIT ont la mecircme signification que pour UPDATE

4055_02_C02 Page 54 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 55

chapitre ndeg 2 Manipulation des donneacutees

QUICK (pour les tables de type MyISAM) ne met pas agrave jour les index associeacutes pour acceacuteleacutererle traitement

La condition du WHERE seacutelectionne les lignes agrave supprimer dans la table Si aucune condi-tion nrsquoest preacuteciseacutee toutes les lignes seront deacutetruites Si la condition ne seacutelectionne aucuneligne aucun enregistrement ne sera supprimeacute

ORDER BY reacutealise un tri des enregistrements qui seront effaceacutes dans cet ordre

Deacutetaillons les possibiliteacutes de cette instruction en consideacuterant les diffeacuterentes tables preacuteceacutedem-ment deacutefinies La premiegravere commande supprime tous les pilotes de la compagnie de code AFla seconde avec une autre eacutecriture deacutetruit la compagnie de code AF

DELETE FROM Pilote WHERE compa = AF

DELETE FROM Compagnie WHERE comp = AF

Tentons de supprimer une compagnie qui est reacutefeacuterenceacutee par un pilote agrave lrsquoaide drsquoune cleacute eacutetran-gegravere Il srsquoaffiche une erreur qui sera expliqueacutee dans la section Inteacutegriteacute reacutefeacuterentielle

mysqlgt DELETE FROM Compagnie WHERE comp = SING

ERROR 1451 (23000) Cannot delete or update a parent row a foreign

key constraint fails (`bdsoutoupilote` CONSTRAINT `fk_Pil_compa_

Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))

Deacutetruisons enfin les deux premiegraveres compagnies (trieacutees par ordre croissant de cleacute ici AC etAN1) qui ne sont reacutefeacuterenceacutees par aucun pilote

DELETE FROM Compagnie LIMIT 2

Instruction TRUNCATELa commande TRUNCATE est une extension de SQL qui a eacuteteacute proposeacutee par Oracle et reprisepar MySQL Cette commande supprime tous les enregistrements drsquoune table et libegravere eacuteven-tuellement lrsquoespace de stockage utiliseacute par la table La syntaxe est la suivante

TRUNCATE [TABLE] [nomBase] nomTable

Avec le moteur InnoDB lrsquoopeacuteration est programmeacutee en DELETE Pour les autres moteurslrsquoopeacuteration diffegravere de DELETE de la maniegravere suivante

La table est supprimeacutee (DROP) puis recreacuteeacutee (CREATE) ce qui est plus rapide que dedeacutetruire les enregistrements un agrave un

Lrsquoopeacuteration peut ecirctre interrompue si une transaction active utilise la table (ou si un verrouest poseacute)

Le nombre drsquoenregistrements supprimeacutes nrsquoest pas retourneacute

Lrsquoeacuteventuelle derniegravere valeur drsquoune colonne AUTO_INCREMENT nrsquoest pas meacutemoriseacutee

Web

4055_02_C02 Page 55 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

56 copy Eacuteditions Eyrolles

Il nrsquoest pas possible de laquo tronquer raquo une table qui est reacutefeacuterenceacutee par des cleacutes eacutetrangegraveres acti-ves La solution consiste agrave deacutesactiver les contraintes puis agrave tronquer la table

Inteacutegriteacute reacutefeacuterentielle

Lrsquointeacutegriteacute reacutefeacuterentielle forme le cœur de la coheacuterence drsquoune base de donneacutees relationnelleCette inteacutegriteacute est fondeacutee sur la relation entre cleacutes eacutetrangegraveres et cleacutes primaires (ou candidates colonnes indexeacutees uniques et non nulles) qui permettent de programmer des regravegles de gestion(exemple lrsquoaffregravetement drsquoun vol doit se faire par une compagnie et pour un avion tous deuxexistant dans la base de donneacutees) Ce faisant la plupart des controcircles cocircteacute client (interface)sont ainsi deacuteporteacutes cocircteacute serveur

Pour les regravegles de gestion plus complexes (exemple lrsquoaffregravetement drsquoun avion doit se faire parune compagnie qui a embaucheacute au moins quinze pilotes dans les six derniers mois) il faudraprogrammer un deacuteclencheur (deacutecrits au chapitre 7) Il faut savoir que les deacuteclencheurs sontplus peacutenalisants que des contraintes dans un mode transactionnel

La contrainte reacutefeacuterentielle concerne toujours deux tables ndash une table laquo pegravere raquo aussi dite laquo maicirctre raquo(parentreferenced) et une table laquo fils raquo (childdependent) ndash posseacutedant une ou plusieurs colonnesen commun Pour la table laquo pegravere raquo ces colonnes composent la cleacute primaire (ou candidate avec unindex unique) Pour la table laquo fils raquo ces colonnes composent une cleacute eacutetrangegravere

Syntaxe

Crsquoest seulement dans sa version 32344 en 2002 (dix ans apregraves Oracle) que MySQL a inclusdans son offre les contraintes reacutefeacuterentielles pour les tables InnoDB Lrsquointeacutegriteacute reacutefeacuterentielle seprogramme dans la table laquo fils raquo par la contrainte suivante Il est conseilleacute de nommer lacontrainte sinon MySQL srsquoen charge Si la cleacute eacutetrangegravere nrsquoest pas deacutejagrave indexeacutee MySQL srsquoencharge aussi Les deux tables ne doivent pas ecirctre temporaires

[CONSTRAINT nomContrainte] FOREIGN KEY [id] (listeColonneEnfant)

REFERENCES nomTable (listeColonneParent)

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

Coheacuterences assureacutees

Lrsquoexemple suivant illustre quatre contraintes reacutefeacuterentielles Une table peut ecirctre laquo pegravere raquo pourune contrainte et laquo fils raquo pour une autre (crsquoest le cas de la table Avion)

Web

4055_02_C02 Page 56 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 57

chapitre ndeg 2 Manipulation des donneacutees

Deux types de problegravemes sont automatiquement reacutesolus par MySQL pour assurer lrsquointeacutegriteacutereacutefeacuterentielle

bull La coheacuterence du laquo fils raquo vers le laquo pegravere raquo on ne doit pas pouvoir inseacuterer un enregistrementlaquo fils raquo (ou modifier sa cleacute eacutetrangegravere) rattacheacute agrave un enregistrement laquo pegravere raquo inexistant Il estcependant possible drsquoinseacuterer un laquo fils raquo (ou de modifier sa cleacute eacutetrangegravere) sans rattacherdrsquoenregistrement laquo pegravere raquo agrave la condition qursquoil nrsquoexiste pas de contrainte NOT NULL auniveau de la cleacute eacutetrangegravere

bull La coheacuterence du laquo pegravere raquo vers le laquo fils raquo on ne doit pas pouvoir supprimer un enregistre-ment laquo pegravere raquo si un enregistrement laquo fils raquo y est encore rattacheacute Il est possible de suppri-mer les laquo fils raquo associeacutes (DELETE CASCADE) drsquoaffecter la valeur nulle aux cleacutes eacutetrangegraveresdes laquo fils raquo associeacutes (DELETE SET NULL) ou de reacutepercuter une modification de la cleacute pri-maire du pegravere (UPDATE CASCADE et UPDATE SET NULL)

Deacuteclarons agrave preacutesent ces contraintes sous MySQL en deacutetaillant les options disponibles

Contraintes cocircteacute laquo pegravere raquo

Le tableau suivant illustre les deux possibiliteacutes (cleacute primaire ou candidate) dans le cas de latable Compagnie Notons que pour le cas de la cleacute candidate une cleacute primaire peut ecirctre deacutefi-nie par ailleurs (sur nomComp par exemple)

Figure 2-11 Inteacutegriteacute reacutefeacuterentielle

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2005-05-13 85 SING F-GAFU 2005-02-05 155 AF F-WTSS 2005-05-15 82

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

dependent child referenced parent

referenced parent

dependent child dependent child NOT NULL

4055_02_C02 Page 57 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

58 copy Eacuteditions Eyrolles

Contraintes cocircteacute laquo fils raquo

Indeacutependamment de lrsquoeacutecriture de la table laquo pegravere raquo plusieurs eacutecritures sont possibles au niveaude la table laquo fils raquo selon qursquoon creacuteeacute les index ou qursquoon laisse MySQL le faire et selon qursquoonnomme ou pas la contrainte de cleacute eacutetrangegravere

La premiegravere eacutecriture nomme la contrainte mais ne preacutecise rien agrave propos de lrsquoindex Ladeuxiegraveme ne nomme pas la contrainte mais deacutefinit lrsquoindex (sans option toutefois) Lrsquoeacutecritureagrave adopter est un meacutelange des deux agrave savoir nommer les contraintes et deacutecrire les index

Cleacutes composites et nulles

Les cleacutes eacutetrangegraveres ou primaires peuvent ecirctre deacutefinies sur plusieurs colonnes (16 au maxi-mum) on parle de composite keys

Des cleacutes eacutetrangegraveres peuvent ecirctre nulles (si elles ne font pas partie drsquoune cleacute primaire) siaucune contrainte NOT NULL nrsquoest deacuteclareacutee

Deacutecrivons agrave preacutesent le script SQL qui convient agrave notre exemple (la syntaxe de creacuteation desdeux premiegraveres tables a eacuteteacute discuteacutee plus haut) et eacutetudions ensuite les meacutecanismes program-meacutes par ces contraintes Deacutecidons qursquoun avion aura toujours un proprieacutetaire (NOT NULL)

Tableau 2-13 Eacutecritures des contraintes de la table laquo pegravere raquo

Cleacute primaire Cleacute candidate

CREATE TABLE Compagnie(comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) nomComp CHAR(15) CONSTRAINT pk_Compagnie PRIMARY KEY(comp))

CREATE TABLE Compagnie(comp CHAR(4) NOT NULL nrue INTEGER(3) rue CHAR(20) ville CHAR(15) nomComp CHAR(15) CONSTRAINT un_Compagnie UNIQUE(comp) CONSTRAINT pk_Compagnie PRIMARY KEY(nomComp))

Tableau 2-14 Eacutecritures des contraintes de la table laquo fils raquo

Contrainte nommeacutee sans index Contrainte pas nommeacutee et index

CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))

CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) INDEX (compa) FOREIGN KEY (compa) REFERENCESCompagnie(comp))

4055_02_C02 Page 58 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 59

chapitre ndeg 2 Manipulation des donneacutees

CREATE TABLE Avion

(immat CHAR(6) typeAvion CHAR(15) nbhVol DECIMAL(102)

proprio CHAR(4) NOT NULL CONSTRAINT pk_Avion PRIMARY KEY(immat)

INDEX (proprio)

CONSTRAINT fk_Avion_comp_Compag

FOREIGN KEY(proprio) REFERENCES Compagnie(comp))

CREATE TABLE Affreter

(compAff CHAR(4) immat CHAR(6) dateAff DATE nbPax INTEGER(3)

CONSTRAINT pk_Affreter PRIMARY KEY (compAff immat dateAff)

INDEX (immat)

CONSTRAINT fk_Aff_na_Avion

FOREIGN KEY(immat) REFERENCES Avion(immat)

INDEX (compAff)

CONSTRAINT fk_Aff_comp_Compag

FOREIGN KEY(compAff) REFERENCES Compagnie(comp))

Coheacuterence du fils vers le pegravere

Si la cleacute eacutetrangegravere est deacuteclareacutee NOT NULL lrsquoinsertion drsquoun enregistrement laquo fils raquo nrsquoest possibleque srsquoil est rattacheacute agrave un enregistrement laquo pegravere raquo existant Dans le cas inverse lrsquoinsertion drsquounenregistrement laquo fils raquo rattacheacute agrave aucun laquo pegravere raquo est possible

Le tableau suivant deacutecrit des insertions correctes et une incorrecte Le message drsquoerreur est icien anglais (il y est question de ne pouvoir ajouter un enregistrement laquo fils raquo)

Pour inseacuterer un affregravetement il faut donc avoir ajouteacute au preacutealable au moins une compagnie etun avion Le chargement de la base de donneacutees est conditionneacute par la hieacuterarchie des contrain-tes reacutefeacuterentielles Ici il faut inseacuterer drsquoabord les compagnies puis les pilotes (ou les avions)enfin les affregravetements

Tableau 2-15 Insertions correctes et incorrectes

Insertions correctes Insertion incorrecte

-- fils avec pegravere INSERT INTO Pilote VALUES (PL-3 Paul Soutou 1000 SING)-- fils sans pegravereINSERT INTO Pilote VALUES (PL-4 Un Connu 0 NULL)-- fils avec pegraveresINSERT INTO Avion VALUES (F-WTSS Concorde 6570 SING)INSERT INTO Affreter VALUES(AF F-WTSS 15-05-2003 82)

-- avec pegravere inconnumysqlgt INSERT INTO Pilote VALUES (PL-5 Pb de Compagnie 0 )

ERROR 1452 (23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT`fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))

Web

4055_02_C02 Page 59 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

60 copy Eacuteditions Eyrolles

Il suffit de relire le script de creacuteation de vos tables pour en deacuteduire lrsquoordre drsquoinsertion des enre-gistrements

Coheacuterence du pegravere vers le fils

En fonction des options choisies au niveau de la contrainte reacutefeacuterentielle se trouvant dans latable laquo fils raquo

CONSTRAINT nomContrainte FOREIGN KEY hellip REFERENCES hellip

plusieurs sceacutenarios sont possibles pour assurer la coheacuterence de la table laquo pegravere raquo vers la table laquo fils raquo

Preacutevenir la modification ou la suppression drsquoune cleacute primaire (ou candidate) de la tablelaquo pegravere raquo Cette alternative est celle par deacutefaut Soit vous nrsquoajoutez pas drsquooption agrave la clauseREFERENCES ndash dans notre exemple toutes les cleacutes eacutetrangegraveres sont ainsi composeacutees ndash soitvous utilisez NO ACTION pour les directives ON DELETE et ON UPDATE La suppressiondrsquoun avion nrsquoest donc pas possible si ce dernier est reacutefeacuterenceacute dans un affregravetement

Propager la suppression des enregistrements laquo fils raquo associeacutes agrave lrsquoenregistrement laquo pegravere raquosupprimeacute Ce meacutecanisme est reacutealiseacute par la directive ON DELETE CASCADE Dans notre exem-ple nous pourrions ainsi deacutecider de supprimer tous les affregravetements degraves qursquoon retire un avion

Eacutetendre la modification de la cleacute primaire de lrsquoenregistrement laquo pegravere raquo aux enregistrementslaquo fils raquo associeacutes Ce meacutecanisme est reacutealiseacute par la directive ON UPDATE CASCADE Dansnotre exemple nous pourrions ainsi deacutecider de mettre agrave jour tous les affregravetements degravesqursquoon modifie lrsquoimmatriculation drsquoun avion

Propager lrsquoaffectation de la valeur nulle aux cleacutes eacutetrangegraveres des enregistrements laquo fils raquoassocieacutes agrave lrsquoenregistrement laquo pegravere raquo supprimeacute ou modifieacute Ce meacutecanisme est reacutealiseacute par ladirective ON DELETE SET NULL (ou ON UPDATE SET NULL en cas de modification dela cleacute primaire du laquo pegravere raquo) Dans ces deux cas il ne faut pas poser de contrainte NOTNULL sur la cleacute eacutetrangegravere Dans notre exemple nous pourrions ainsi deacutecider de mettreNULL dans la colonne compa de la table Pilote pour chaque pilote drsquoune compagniesupprimeacutee Nous ne pourrions pas appliquer ce meacutecanisme agrave la table Affreter quidispose de contraintes NOT NULL sur ses cleacutes eacutetrangegraveres (car composant la cleacute primaire)

RESTRICT est une directive de la norme SQL qui nrsquoest pas encore mise en œuvre sousMySQL Elle concerne les SGBD compatibles avec les contraintes diffeacutereacutees Pour lrsquoheure NOACTION (qui en principe diffegravere les contraintes) et RESTRICT (qui ne diffegravere pas les contraintes)jouent le mecircme rocircle

Les options DELETE CASCADE et DELETE SET NULL sont disponibles depuis laversion 32350 celles relatives agrave ON UPDATE sont disponibles depuis la version 408

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

4055_02_C02 Page 60 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 61

chapitre ndeg 2 Manipulation des donneacutees

Le tableau suivant deacutecrit quelques alternatives de coheacuterence agrave notre base de donneacutees exempleentre les tables Avion et Affreter puis Pilote et Compagnie

Pour lrsquoheure aucun deacuteclencheur ne peut ecirctre activeacute suite agrave la modification drsquoune colonneinduite drsquoune action de reacutepercussion (CASCADE ou SET NULL)

MySQL ne permet pas encore de propager une valeur par deacutefaut (set default) comme la normeSQL le preacutevoit

Tableau 2-16 Alternatives de coheacuterence du laquo pegravere raquo vers les laquo fils raquo

Alternatives Syntaxe Message drsquoerreur

Preacutevenir la modification de lrsquoimmatriculation drsquoun avion ou la suppression drsquoun avion

--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON DELETE NO ACTION ON UPDATE NO ACTION

mysqlgt DELETE FROM AvionERROR 1451 (23000) Cannot delete or update a parent row a foreign key constraint fails (`bdsoutouaffreter` CONSTRAINT `fk_Aff_na_Avion` FOREIGN KEY (`immat`) REFERENCES `avion` (`immat`)ON DELETE NO ACTION ON UPDATE NO ACTION)

Propager la suppression drsquoun avion

--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON DELETE CASCADE

Propager la modification de lrsquoimmatriculation drsquoun avion

--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON UPDATE CASCADE

Propager la modification du code de la compagnie dansles tables Pilote Avion et Affreter Affecter la valeur nulle dans la table Pilote suite agrave la suppression drsquoune compagnie tout en preacuteservant lrsquointeacutegriteacute avec la table Avion

--dans AffreterCONSTRAINT fk_Aff_comp_Compag FOREIGN KEY(compAff) REFERENCES Compagnie(comp) ON UPDATE CASCADE--dans AvionCONSTRAINT fk_Avion_comp_Compag FOREIGN KEY(proprio) REFERENCES Compagnie(comp) ON UPDATE CASCADE--dans PiloteCONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp) ON DELETE SET NULL ON UPDATE CASCADE

Web

4055_02_C02 Page 61 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

62 copy Eacuteditions Eyrolles

En reacutesumeacute

Le tableau suivant reacutesume les conditions requises pour modifier lrsquoeacutetat de la base de donneacutees enrespectant lrsquointeacutegriteacute reacutefeacuterentielle

Insertions agrave partir drsquoun fichier

Lrsquoimportation de donneacutees (au format fichier texte) dans une table peut ecirctre programmeacutee agravelrsquoaide de la directive LOAD DATA INFILE Un tel meacutecanisme lit un fichier dans un reacuteper-toire du serveur et insegravere tout ou partie des informations dans une table La syntaxe simplifieacuteede cette directive est la suivante

LOAD DATA INFILE nomEtCheminFichiertxt

[REPLACE | IGNORE] INTO TABLE nomTable

[FIELDS [TERMIATED BY string]

[[OPTIONALLY] ENCLOSED BY char]

[ESCAPED BY char ] ]

[LINES [STARTING BY string] [TERMINATED BY string] ]

[IGNORE number LINES]

REPLACE option agrave utiliser pour remplacer systeacutematiquement les anciens enregistrementspar les nouveaux (valeur de cleacute primaire ou drsquoindex unique)

IGNORE fait en sorte de ne pas inseacuterer des enregistrements de cleacute primaire ou drsquoindexunique deacutejagrave preacutesents dans la table

Tableau 2-17 Instructions SQL sur les cleacutes

Instructions Table laquo pegravere raquo Table laquo fils raquo

INSERT Correcte si la cleacute primaire (ou candidate) est unique

Correcte si la cleacute eacutetrangegravere est reacutefeacuterenceacutee dans la table laquo pegravere raquo ou est nulle (partiellement ou en totaliteacute)

UPDATE Correcte si lrsquoinstruction ne laisse pas drsquoenregistrements dans la table laquo fils raquo ayant une cleacute eacutetrangegravere non reacutefeacuterenceacutee

Correcte si la nouvelle cleacute eacutetrangegravere reacutefeacuterence un enregistrement laquo pegravere raquo existant

DELETE Correcte si aucun enregistrement de la table laquo fils raquo ne reacutefeacuterence le ou les enregistrements deacutetruits

Correcte sans condition

DELETE Cascade Correcte sans condition Sans objet

DELETE SET NULL Correcte sans condition Sans objet

UPDATE Cascade Correcte sans condition Sans objet

UPDATE SET NULL Correcte srsquoil nrsquoy a pas de NOT NULL dans la table laquo fils raquo

Sans objet

4055_02_C02 Page 62 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 63

chapitre ndeg 2 Manipulation des donneacutees

FIELDS deacutecrit comment sont formateacutees dans le fichier les valeur agrave inseacuterer dans la tableEn lrsquoabsence de cette clause TERMINATED BY vaut t ENCLOSED BY vaut etESCAPED BY vaut

ndash FIELDS TERMINATED BY deacutecrit le caractegravere qui seacutepare deux valeurs de colonnes

ndash FIELDS ENCLOSED BY permet de controcircler le caractegravere qui encadrera chaque valeurde colonne

ndash FIELDS ESCAPED BY permet de controcircler les caractegraveres speacuteciaux

LINES deacutecrit comment seront eacutecrites dans le fichier les lignes extraites de(s) table(s) Enlrsquoabsence de cette clause TERMINATED BY vaut n et STARTING BY vaut

IGNORE permet de ne pas importer les nb premiegraveres lignes du fichier (contenant des eacuteven-tuelles deacuteclarations)

Lisons le fichier laquo pilotestxt raquo situeacute dans le reacutepertoire laquo Ddev raquo (ouvert agrave lrsquoaide du Word-Pad dans la figure suivante) en important la totaliteacute des donneacutees dans la table Pilote2 creacuteeacutee agravecet effet (brevet VARCHAR(6) nom VARCHAR(16) nbHVol DECIMAL(72)compa CHAR(4) et PRIMARY KEY(brevet)) Notez lrsquoutilisation du double laquo raquo pour deacutesi-gner une arborescence Windows Le caractegravere NULL est importeacute par le caractegravere laquo N raquo

Une fois la table creacuteeacutee il est possible de lrsquointerroger

mysqlgt SELECT FROM Pilote2 ORDER BY compa nom

+--------+------------------+---------+-------+

| brevet | nom | nbHVol | compa |

+--------+------------------+---------+-------+

| PL-5 | Daniel Vielle | NULL | AF |

| PL-2 | Didier Donsez | 000 | AF |

| PL-1 | Gratien Viel | 45000 | AF |

| PL-4 | Placide Fresnais | 245000 | CAST |

| PL-3 | Richard Grin | 100000 | SING |

+--------+------------------+---------+-------+

Figure 2-12 Importation de donneacutees

LOAD DATA INFILE Ddevpilotestxt REPLACE INTO TABLE Pilote2FIELDS TERMINATED BY ENCLOSED BY LINES STARTING BY import -Pilote TERMINATED BY $ n

4055_02_C02 Page 63 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

64 copy Eacuteditions Eyrolles

Exercices

Les objectifs de ces exercices sont

drsquoinseacuterer des donneacutees dans les tables du scheacutema Parc Informatique

de creacuteer une seacutequence et drsquoinseacuterer des donneacutees en utilisant une seacutequence

de modifier des donneacutees

21 Insertion de donneacutees

Eacutecrire puis exeacutecuter le script SQL (que vous appellerez insParcsql) afin drsquoinseacuterer les donneacuteesdans les tables suivantes

Tableau 2-18 Donneacutees des tables

Table Donneacutees

Segment INDIP NOMSEGMENT ETAGE----------- -------------------- ----------13012080 Brin RDC13012081 Brin 1er eacutetage13012082 Brin 2e eacutetage

Salle NSALLE NOMSALLE NBPOSTE INDIP------- -------------------- ---------- -----------s01 Salle 1 3 13012080s02 Salle 2 2 13012080s03 Salle 3 2 13012080s11 Salle 11 2 13012081s12 Salle 12 1 13012081s21 Salle 21 2 13012082s22 Salle 22 0 13012083s23 Salle 23 0 13012083

Poste NPOSTE NOMPOSTE INDIP AD TYPEPOSTE NSALLE------- -------------------- ----------- --- --------- -------p1 Poste 1 13012080 01 TX s01p2 Poste 2 13012080 02 UNIX s01p3 Poste 3 13012080 03 TX s01p4 Poste 4 13012080 04 PCWS s02p5 Poste 5 13012080 05 PCWS s02p6 Poste 6 13012080 06 UNIX s03p7 Poste 7 13012080 07 TX s03p8 Poste 8 13012081 01 UNIX s11p9 Poste 9 13012081 02 TX s11p10 Poste 10 13012081 03 UNIX s12p11 Poste 11 13012082 01 PCNT s21p12 Poste 12 13012082 02 PCWS s21

4055_02_C02 Page 64 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 65

chapitre ndeg 2 Manipulation des donneacutees

22 Gestion drsquoune seacutequence

Dans ce mecircme script geacuterer la seacutequence associeacutee agrave la colonne numIns commenccedilant agrave la valeur 1 demaniegravere agrave inseacuterer les enregistrements suivants

Logiciel NLOG NOMLOG DATEACH VERSION TYPELOG PRIX ----- -------------------- ---------- ------- --------- --------log1 Oracle 6 1995-05-13 62 UNIX 3000log2 Oracle 8 1999-09-15 8i UNIX 5600log3 SQL Server 1998-04-12 7 PCNT 2700log4 Front Page 1997-06-03 5 PCWS 500log5 WinDev 1997-05-12 5 PCWS 750log6 SQLNet 20 UNIX 500log7 I I S 2002-04-12 2 PCNT 810log8 DreamWeaver 2003-09-21 20 BeOS 1400

Types TYPELP NOMTYPE--------- --------------------TX Terminal X-WindowUNIX Systegraveme UnixPCNT PC Windows NTPCWS PC WindowsNC Network Computer

Tableau 2-18 Donneacutees des tables (suite)

Table Donneacutees

Tableau 2-19 Donneacutees de la table Installer

Table Donneacutees

Installer NPOSTE NLOG NUMINS DATEINS DELAI------- --------- ------- -------- -------------------------p2 log1 1 2003-05-15p2 log2 2 2003-09-17p4 log5 3 p6 log6 4 2003-05-20p6 log1 5 2003-05-20p8 log2 6 2003-05-19p8 log6 7 2003-05-20p11 log3 8 2003-04-20p12 log4 9 2003-04-20p11 log7 10 2003-04-20p7 log7 11 2002-04-01

4055_02_C02 Page 65 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

66 copy Eacuteditions Eyrolles

23 Modification de donneacutees

Eacutecrire le script modificationsql qui permet de modifier (avec UPDATE) la colonne etage (pourlrsquoinstant nulle) de la table Segment afin drsquoaffecter un numeacutero drsquoeacutetage correct (0 pour le segment13012080 1 pour le segment 13012081 2 pour le segment 13012082)

Diminuer de 10 le prix des logiciels de type PCNT

Veacuterifier

SELECT FROM SegmentSELECT nLog typeLog prix FROM Logiciel

4055_02_C02 Page 66 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

67

Chapitre 3

Eacutevolution drsquoun scheacutema

Lrsquoeacutevolution drsquoun scheacutema est un aspect tregraves important agrave prendre en compte car il reacutepond auxbesoins de maintenance des applicatifs qui utilisent la base de donneacutees Nous verrons qursquoil estpossible de modifier une base de donneacutees drsquoun point de vue structurel (colonnes et index) maisaussi comportemental (contraintes)

Lrsquoinstruction principalement utiliseacutee est

ALTER TABLE

(commande du LDD) qui permetdrsquoajouter de renommer de modifier et de supprimer des colonnes drsquoune table Ellepermet aussi drsquoajouter et de supprimer des contraintes Avant de deacutetailler ces meacutecanis-mes eacutetudions la commande qui permet de renommer une table

Renommer une table (

RENAME

)

Lrsquoinstruction

RENAME

renomme une ou plusieurs tables ou vues Il faut posseacuteder le privilegravege

ALTER

et

DROP

sur la table drsquoorigine et

CREATE

sur la base

RENAME

[

nomBase

]

ancienNomTable

TO [

nomBase

]

nouveauNomTable

[[

nomBase

]

ancienNom2

TO [

nomBase

]

nouveauNom2

]]

Les contraintes drsquointeacutegriteacute index et preacuterogatives associeacutes agrave lrsquoancienne table sont automatique-ment transfeacutereacutes sur la nouvelle En revanche les vues et proceacutedures catalogueacutees sont invali-deacutees et doivent ecirctre recreacuteeacutees

Il est aussi possible drsquoutiliser lrsquooption

RENAME TO

de lrsquoinstruction

ALTER TABLE

pourrenommer une table existante Le tableau suivant deacutecrit comment renommer la table

Pilote

sans perturber lrsquointeacutegriteacute reacutefeacuterentielle

Tableau 3-1 Renommer une table

Commande RENAME Commande ALTER TABLE

RENAME

Pilote

TO

Naviguant

ALTER TABLE

Pilote

RENAME

TO

Naviguant

4055_03_C03 Page 67 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

68

copy Eacuteditions Eyrolles

Modifications structurelles (

ALTER TABLE

)

Consideacuterons la table suivante que nous allons faire eacutevoluer

Ajout de colonnes

La directive

ADD

de lrsquoinstruction

ALTER TABLE

permet drsquoajouter une nouvelle colonne agrave unetable Cette colonne est initialiseacutee agrave

NULL

pour tous les enregistrements (agrave moins de speacutecifierune contrainte

DEFAULT

auquel cas tous les enregistrements de la table sont mis agrave jour avecune valeur non nulle)

Il est possible drsquoajouter une colonne en ligne

NOT NULL

seulement si la table est vide ou si unecontrainte

DEFAULT

est deacutefinie sur la nouvelle colonne (dans le cas inverse il faudra utiliser

MODIFY

agrave la place de

ADD

)

Le script suivant ajoute trois colonnes agrave la table

Pilote

La premiegravere instruction insegravere lacolonne

nbHVol

en lrsquoinitialisant agrave

NULL

pour tous les pilotes (ici il nrsquoen existe qursquoune seule)La deuxiegraveme commande ajoute deux colonnes initialiseacutees agrave une valeur non nulle La colonne

ville

ne sera jamais nulle

ALTER TABLE

Pilote

ADD

(nbHVol DECIMAL(72))

ALTER TABLE

Pilote

ADD

(compa VARCHAR(4) DEFAULT AF

ville VARCHAR(30) DEFAULT Paris NOT NULL)

La table est deacutesormais la suivante

Figure 3-1

Table agrave modifier

CREATE TABLE Pilote (brevet VARCHAR(4) nom VARCHAR(20))

INSERT INTO Pilote VALUES (PL -1 Agnegraves Labat)

Pilote

brevet nom

PL-1 Agnegraves Labat

Figure 3-2

Table apregraves lrsquoajout de colonnes

Web

Pilote

brevet nom nbHVol compa ville

PL-1 Agnegraves Labat AF Paris

4055_03_C03 Page 68 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

69

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Renommer des colonnes

Il faut utiliser lrsquooption

CHANGE

de lrsquoinstruction

ALTER TABLE

pour renommer une colonneexistante Le nouveau nom de colonne ne doit pas ecirctre deacutejagrave utiliseacute dans la table Le type (avecune eacuteventuelle contrainte) doit ecirctre repreacuteciseacute La position de la colonne peut aussi ecirctre modi-fieacutee en mecircme temps La syntaxe geacuteneacuterale de cette option est la suivante

ALTER TABLE

[

nomBase

]

nomTable

CHANGE

[COLUMN]

ancienNom

nouveauNom

typeMySQL

[NOT NULL | NULL] [DEFAULT

valeur

]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT

chaine

] [REFERENCES ]

[FIRST|AFTER

nomColonne

]

Lrsquoinstruction suivante permet de renommer la colonne

ville

en

adresse

en la positionnantavant la colonne

compa

ALTER TABLE Pilote CHANGE ville adresse VARCHAR(30) AFTER nbHVol

Modifier le type des colonnes

Lrsquooption MODIFY de lrsquoinstruction ALTER TABLE modifie le type drsquoune colonne existantesans pour autant la renommer La syntaxe geacuteneacuterale de cette instruction est la suivante lesoptions sont les mecircmes que pour CHANGE

ALTER TABLE [nomBase]nomTable MODIFY [COLUMN] nomColonneAmodifier

typeMySQL [NOT NULL | NULL] [DEFAULT valeur]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT chaine] [REFERENCES ]

[FIRST|AFTER nomColonne]

Il est possible drsquoaugmenter la taille drsquoune colonne numeacuterique (largeur ou preacutecision) ndash ou drsquounechaicircne de caractegraveres (CHAR et VARCHAR) ndash ou de la diminuer si toutes les donneacutees preacutesentesdans la colonne peuvent srsquoadapter agrave la nouvelle taille

Attention agrave ne pas reacuteduire les colonnes indexeacutees agrave une taille infeacuterieure agrave celle deacuteclareacutee lors dela creacuteation de lrsquoindex

Les contraintes en ligne peuvent ecirctre aussi modifieacutees par cette instruction Une fois la colonnechangeacutee les nouvelles contraintes srsquoappliqueront aux mises agrave jour ulteacuterieures de la table et lesdonneacutees preacutesentes devront toutes veacuterifier cette nouvelle contrainte

4055_03_C03 Page 69 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

70 copy Eacuteditions Eyrolles

Le tableau suivant preacutesente diffeacuterentes modifications de colonnes

La table est deacutesormais la suivante

Valeurs par deacutefaut

Lrsquooption ALTER COLUMN de lrsquoinstruction ALTER TABLE modifie la valeur par deacutefaut drsquounecolonne existante La syntaxe geacuteneacuterale de cette instruction est la suivante

ALTER TABLE [nomBase]nomTable ALTER [COLUMN] nomColonneAmodifier

SET DEFAULT lsquochainersquo | DROP DEFAULT

Le script suivant deacutefinit une valeur par deacutefaut pour la colonne adresse puis supprime cellerelative agrave la colonne compa

ALTER TABLE Pilote ALTER COLUMN adresse SET DEFAULT Blagnac

ALTER TABLE Pilote ALTER COLUMN compa DROP DEFAULT

Supprimer des colonnes

Lrsquooption DROP de lrsquoinstruction ALTER TABLE permet de supprimer une colonne (aussi unindex ou une cleacute que nous eacutetudierons plus loin) La possibiliteacute de supprimer une colonne eacuteviteaux administrateurs drsquoexporter les donneacutees de recreacuteer une nouvelle table drsquoimporter les

Tableau 3-2 Modifications de colonnes

Instructions SQL Commentaires

ALTER TABLE Pilote MODIFY compa VARCHAR(6) DEFAULT SINGINSERT INTO Pilote (brevet nom) VALUES (PL-2 Laurent Boutrand)

Augmente la taille de la colonne compa et changela contrainte de valeur par deacutefaut puis insegravere unnouveau pilote

ALTER TABLE Pilote MODIFY compa CHAR(4) NOT NULL

Diminue la colonne et modifie eacutegalement son typede VARCHAR en CHAR tout en le deacuteclarant NOTNULL (possible car les donneacutees contenues dans lacolonne ne deacutepassent pas quatre caractegraveres)

ALTER TABLE Pilote MODIFY compa CHAR(4)

Rend possible lrsquoinsertion de valeur nulle dans lacolonne compa

Figure 3-3 Apregraves modification des colonnes

Pilote

brevet nom nbHVol adresse compa

PL-1 Agnegraves Labat Paris AF

PL-2 Laurent Boutrand Paris SING

CHAR(4)NULL possibleDeacutefaut lsquoSINGrsquo

4055_03_C03 Page 70 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 71

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

donneacutees et de recreacuteer les eacuteventuels index et contraintes Lorsqursquoune colonne est supprimeacutee lesindex qui lrsquoutilisent sont mis agrave jour voire eacutelimineacutes si toutes les colonnes qui le composent sonteffaceacutees La syntaxe des ces options est la suivante

ALTER TABLE [nomBase]nomTable DROP [COLUMN] nomColonne | PRIMARY KEY

| INDEX nomIndex | FOREIGN KEY nomContrainte

Il nrsquoest pas possible de supprimer avec cette instruction

bull toutes les colonnes drsquoune table

bull les colonnes qui sont cleacutes primaires (ou candidates par UNIQUE) reacutefeacuterenceacutees par des cleacuteseacutetrangegraveres

La suppression de la colonne adresse de la table Pilote est programmeacutee par lrsquoinstructionsuivante

ALTER TABLE Pilote DROP COLUMN adresse

Modifications comportementales

Nous eacutetudions dans cette section les meacutecanismes drsquoajout de suppression drsquoactivation et dedeacutesactivation de contraintes

Faisons eacutevoluer le scheacutema suivant Les seules contraintes existantes sont les cleacutes primairesnommeacutees pk_Compagnie pour la table Compagnie et pk_Avion pour la table Avion

Ajout de contraintes

Jusqursquoagrave preacutesent nous avons creacuteeacute les contraintes en mecircme temps que les tables Il est possiblede creacuteer des tables sans contraintes (dans ce cas lrsquoordre de geacuteneacuteration nrsquoest pas important et on

Figure 3-4 Scheacutema agrave faire eacutevoluer

Web

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85 SING F-GAFU 2003-02-05 155 AF F-WTSS 2003-05-15 82

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

4055_03_C03 Page 71 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

72 copy Eacuteditions Eyrolles

peut mecircme les eacutelaborer par ordre alphabeacutetique) puis drsquoajouter les contraintes Les outils deconception (WinrsquoDesign Designer ou PowerAMC) adoptent cette deacutemarche lors de la geacuteneacutera-tion automatique de scripts SQL

La directive ADD CONSTRAINT de lrsquoinstruction ALTER TABLE permet drsquoajouter une contrainteagrave une table Il est aussi possible drsquoajouter un index La syntaxe geacuteneacuterale est la suivante

ALTER TABLE [nomBase]nomTable ADD INDEX [nomIndex] [typeIndex] (nomColonne1) | CONSTRAINT nomContrainte typeContrainte

Trois types de contraintes sont possibles

UNIQUE (colonne1 [colonne2])

PRIMARY KEY (colonne1 [colonne2])

FOREIGN KEY (colonne1 [colonne2])

REFERENCES nomTablePegravere (col1 [col2])

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

Uniciteacute

Ajoutons la contrainte drsquouniciteacute portant sur la colonne du nom de la compagnie Un index estautomatiquement geacuteneacutereacute sur cette colonne agrave preacutesent

ALTER TABLE Compagnie ADD CONSTRAINT un_nomC UNIQUE (nomComp)

Cleacute eacutetrangegravere

Ajoutons la cleacute eacutetrangegravere (indexeacutee) agrave la table Avion au niveau de la colonne proprio en luiassignant une contrainte NOT NULL

ALTER TABLE Avion ADD INDEX (proprio)

ALTER TABLE Avion ADD CONSTRAINT fk_Avion_comp_Compag

FOREIGN KEY(proprio) REFERENCES Compagnie(comp)

ALTER TABLE Avion MODIFY proprio CHAR(4) NOT NULL

Cleacute primaire

Ajoutons agrave la table Affreter en une seule instruction sa cleacute primaire et deux cleacutes eacutetrangegrave-res (une vers la table Avion et lrsquoautre vers Compagnie)

ALTER TABLE Affrete ADD (CONSTRAINT pk_Affreter PRIMARY KEY (compAff immat dateAff)CONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES

Avion(immat)CONSTRAINT fk_Aff_comp_Compag FOREIGN KEY(compAff)

REFERENCES Compagnie(comp))

4055_03_C03 Page 72 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 73

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Pour que lrsquoajout ou la modification drsquoune contrainte soient possibles il faut que les donneacuteespreacutesentes dans la table concerneacutee ou reacutefeacuterenceacutee respectent la nouvelle contrainte

Les tables contiennent agrave preacutesent les contraintes suivantes

Suppression de contraintes

Il nrsquoexiste pas encore lrsquooption DROP CONSTRAINT agrave lrsquoinstruction ALTER TABLE poursupprimer une contrainte de nom donneacutee (peut-ecirctre parce que les contraintes CHECK ne sontpas encore consideacutereacutees et car la prise en compte des contraintes a eacuteteacute eacutetaleacutee au fil des versionssuccessives de MySQL) Il faut donc utiliser une directive diffeacuterente de lrsquoinstruction ALTERTABLE pour supprimer chaque type de contrainte

Contrainte NOT NULL

Il faut utiliser la directive MODIFY de lrsquoinstruction ALTER TABLE pour supprimer unecontrainte NOT NULL existant sur une colonne Dans notre exemple deacutetruisons la contrainteNOT NULL de la cleacute eacutetrangegravere proprio dans la table Avion

ALTER TABLE Avion MODIFY proprio CHAR(4) NULL

Contrainte UNIQUE

Il faut utiliser la directive DROP INDEX de lrsquoinstruction ALTER TABLE pour supprimer unecontrainte drsquouniciteacute Dans notre exemple effaccedilons la contrainte portant sur le nom de lacompagnie Lrsquoindex est eacutegalement deacutetruit

ALTER TABLE Compagnie DROP INDEX un_nomC

Figure 3-5 Apregraves ajout de contraintes

Web Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85 SING F-GAFU 2003-02-05 155 AF F-WTSS 2003-05-15 82

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

referenced parent

referenced parent

dependent child dependent child NOT NULL

4055_03_C03 Page 73 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

74 copy Eacuteditions Eyrolles

Cleacute eacutetrangegravere

Lrsquooption DROP FOREIGN KEY de lrsquoinstruction ALTER TABLE permet de supprimer une cleacuteeacutetrangegravere drsquoune table La syntaxe geacuteneacuterale est la suivante

ALTER TABLE [nomBase]nomTable DROP FOREIGN KEY nomContrainte

Le nom de la contrainte est celui qui a eacuteteacute deacuteclareacute lors de la creacuteation de la table soit lors de samodification (dans CREATE TABLE ou ALTER TABLE)

Si la contrainte a eacuteteacute deacutefinie sans ecirctre nommeacutee son nom est geacuteneacutereacute par le moteur InnoDB etlrsquoinstruction SHOW CREATE TABLE [nomBase]nomTable permet de le deacutecouvrir

Deacutetruisons la cleacute eacutetrangegravere de la colonne proprio

ALTER TABLE Avion DROP FOREIGN KEY fk_Avion_comp_Compag

Cleacute primaire

Lrsquooption DROP PRIMARY KEY de lrsquoinstruction ALTER TABLE permet de supprimer une cleacuteprimaire Dans des versions preacuteceacutedentes de MySQL si aucune cleacute primaire nrsquoexistait lapremiegravere contrainte UNIQUE disparaissait agrave la place Ce nrsquoest plus le cas depuis la version 51

Si la colonne cleacute primaire agrave supprimer contient des cleacutes eacutetrangegraveres il faut drsquoabord retirer lescontraintes de cleacute eacutetrangegravere Si la cleacute primaire agrave supprimer est reacutefeacuterenceacutee par des cleacutes eacutetran-gegraveres drsquoautres tables il faut drsquoabord ocircter les contraintes de cleacute eacutetrangegravere de ces autres tables

Ainsi pour supprimer la cleacute primaire de la table Affreter il faut drsquoabord enlever les deuxcontraintes de cleacute eacutetrangegravere concernant des colonnes composant la cleacute primaire

ALTER TABLE Affreter DROP FOREIGN KEY fk_Aff_na_Avion

ALTER TABLE Affreter DROP FOREIGN KEY fk_Aff_comp_Compag

ALTER TABLE Affreter DROP PRIMARY KEY

La figure suivante illustre les contraintes qui restent actives les cleacutes primaires des tablesCompagnie et Avion et une contrainte de non nulliteacute

Aucun ordre particulier nrsquoest neacutecessaire pour supprimer ces trois contraintes car il nrsquoy a plusde contrainte reacutefeacuterentielle active

4055_03_C03 Page 74 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 75

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Concernant tout scheacutema il faut eacuteliminer drsquoabord les contraintes de cleacute eacutetrangegravere des tableslaquo fils raquo puis laquo pegravere raquo puis les contraintes de cleacute primaire Il suffit pour eacuteviter toute incoheacuterencede deacutetruire les contraintes dans lrsquoordre inverse drsquoapparition dans le script de creacuteation

Deacutesactivation des contraintes

La deacutesactivation des contraintes reacutefeacuterentielles peut ecirctre inteacuteressante pour acceacuteleacuterer des proceacute-dures de chargement drsquoimportation et drsquoexportation massives de donneacutees externes Ce meacuteca-nisme ameacuteliore aussi les performances de programmes batchs qui ne modifient pas desdonneacutees concerneacutees par lrsquointeacutegriteacute reacutefeacuterentielle ou pour lesquelles on veacuterifie la coheacuterence dela base agrave la fin En effet les index ne sont pas mis agrave jour pour chaque insertion ou modificationet aucun ordre nrsquoest requis pour inseacuterer ou supprimer des enregistrements

Syntaxe

Lrsquoinstruction SET FOREIGN_KEY_CHECKS=0 permet de deacutesactiver temporairement(jusqursquoagrave la reacuteactivation) toutes les contraintes reacutefeacuterentielles drsquoune base

Nrsquoessayez pas de deacutesactiver lrsquointeacutegriteacute reacutefeacuterentielle avec lrsquooption DISABLE KEYS de lrsquoinstruc-tion ALTER TABLE Cette option concerne les tables MyISAM et speacutecifie seulement de ne pasmettre agrave jour les index non uniques

Exemple

En consideacuterant lrsquoexemple suivant deacutesactivons les contraintes drsquointeacutegriteacute reacutefeacuterentielle ettentons drsquoinseacuterer des enregistrements ne respectant aucune contrainte (drsquointeacutegriteacute reacutefeacuterentielleet autres)

Figure 3-6 Apregraves suppression de contraintes

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85SING F-GAFU 2003-02-05 155

AF F-WTSS 2003-05-15 82

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

NULL

4055_03_C03 Page 75 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

76 copy Eacuteditions Eyrolles

On remarque bien que seules les cleacutes eacutetrangegraveres ne sont plus veacuterifieacutees Toute autre contrainte(UNIQUE PRIMARY KEY et NOT NULL) reste active Lrsquoeacutetat de la base est deacutesormais commesuit

Bien qursquoil semble incoheacuterent de reacuteactiver les contraintes sans srsquooccuper au preacutealable desvaleurs ne respectant pas lrsquointeacutegriteacute reacutefeacuterentielle (donneacutees noteacutees en gras) nous verrons qursquoilest possible de le faire

Figure 3-7 Avant la deacutesactivation de contraintes

Web Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING

referenced parent

referenced parent

dependent child dependent child NOT NULL

UNIQUE

Tableau 3-3 Insertions apregraves la deacutesactivation de lrsquointeacutegriteacute reacutefeacuterentielle

Instructions valides Instructions non valides

mysqlgt SET FOREIGN_KEY_CHECKS=0

mysqlgt INSERT INTO Avion VALUES ( TB-22 500 Toto)Query OK 1 row affected (004 sec)

mysqlgt INSERT INTO Avion VALUES (Bidon1 TB-21 1000 AF)Query OK 1 row affected (010 sec)

mysqlgt INSERT INTO Affreter VALUES (AF Toto 2005-05-13 0)Query OK 1 row affected (010 sec)

mysqlgt INSERT INTO Affreter VALUES (GTI F-WTSS 2005-11-0710)Query OK 1 row affected (002 sec)

mysqlgt INSERT INTO Affreter VALUES (GTI Toto 2005-11-0740)Query OK 1 row affected (003 sec)

mysqlgt INSERT INTO Compagnie VALUES (GTR 1 Brassens Blagnac

)ERROR 1062 (23000) Duplicate entry Air France for key 2

mysqlgt INSERT INTO Avion VALUES (Bidon1 TB-20 2000 NULL)ERROR 1048 (23000) Column proprio cannot be null

mysqlgt INSERT INTO Avion VALUES ( TB-21 1000 AF)ERROR 1062 (23000) Duplicate entry F-GLFS for key 1

Web

F-GLFS AirFrance

F-GLFS

4055_03_C03 Page 76 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 77

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Reacuteactivation des contraintes

Lrsquoinstruction SET FOREIGN_KEY_CHECKS=1 permet de reacuteactiver toutes les contraintesreacutefeacuterentielles drsquoune base

Nrsquoessayez pas de deacutesactiver lrsquointeacutegriteacute reacutefeacuterentielle avec lrsquooption ENABLE KEYS de lrsquoinstructionALTER TABLE Cette option concerne les tables MyISAM et speacutecifie de mettre agrave jour les indexnon uniques

Syntaxe

La reacuteactivation totale de lrsquointeacutegriteacute reacutefeacuterentielle de la base se programme ainsi

mysqlgt SET FOREIGN_KEY_CHECKS=1

Lrsquointeacutegriteacute est assureacutee de nouveau mais ne concerne que les mises agrave jour agrave venir (ajoutsdrsquoenregistrements modifications de colonnes et suppressions drsquoenregistrements) Les eacuteven-tuelles donneacutees preacutesentes dans les tables qui ne veacuterifient pas lrsquointeacutegriteacute sont toujours en base

Reacutecupeacuteration de donneacutees erroneacutees

Il nrsquoexiste pas pour lrsquoheure de meacutethode de reacutecupeacuteration automatique comme Oracle lepropose par exemple avec la directive EXCEPTIONS INTO de lrsquoinstruction ALTER TABLEEn conseacutequence il faut programmer des requecirctes drsquoextraction (eacutetudieacutees au chapitre 4) quipermettent des recherches drsquoenregistrements sous critegraveres

Le tableau suivant deacutecrit les deux requecirctes agrave programmer afin drsquoextraire les enregistrementsposant problegraveme Ici nous extrayons les avions qui reacutefeacuterencent une compagnie inexistante etles affregravetements qui reacutefeacuterencent une compagnie inexistante ou un avion inexistant Une fois

Figure 3-8 Apregraves la deacutesactivation des contraintes reacutefeacuterentielles

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 82 AF Toto 2005-05-13 0GTI F-WTSS 2005-11-07 10GTI Toto 2005-11-07 40

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GLFS TB-22 500 Toto

4055_03_C03 Page 77 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

78 copy Eacuteditions Eyrolles

extraits il faudra statuer pour chacun drsquoeux entre une modification de telle ou telle colonne oubien une suppression Il apparaicirct que quatre enregistrements ne respectent pas des contraintes

Deacutesactivez de nouveau lrsquointeacutegriteacute reacutefeacuterentielle avant de modifier les enregistrements ne veacuteri-fiant pas les contraintes car sinon certaines modifications coheacuterentes ne pourraient avoir lieuagrave cause de la veacuterification reacutefeacuterentielle sur des valeurs erroneacutees (dans notre exemple si on veutmodifier la compagnie GTI du dernier affregravetement lrsquoerreur portera sur la colonne immat)

Dans notre exemple choisissons

Drsquoaffecter la compagnie AF aux avions appartenant agrave des compagnies non reacutefeacuterenceacuteesdans la table Avion Notez qursquoil faut compleacuteter par deux espaces le code compagnie(CHAR inutile srsquoil avait eacuteteacute VARCHAR) et qursquoon utilise la mecircme requecircte que preacuteceacutedem-ment

SET FOREIGN_KEY_CHECKS=0

UPDATE Avion SET proprio =

WHERE proprio

De modifier la compagnie GTI par la compagnie SING dans la table Affreter et touteimmatriculation drsquoavion inexistant en F-GLFS

UPDATE Affreter SET compAff =SING WHERE compAff =

UPDATE Affreter SET immat=F-GLFS

WHERE immat

Maintenant il conviendra de reacuteactiver lrsquointeacutegriteacute reacutefeacuterentielle Lrsquoeacutetat de la base avec lescontraintes reacuteactiveacutees est le suivant (les mises agrave jour sont en gras)

Tableau 3-4 Enregistrements posant problegraveme

Table Avion Table Affreter

mysqlgt SELECT immatproprio FROM Avion WHERE proprio NOT IN (SELECT comp FROM Compagnie)

+--------+---------+| immat | proprio |+--------+---------+| F-GLFS | Toto |+--------+---------+

mysqlgt SELECT compAffimmatdateAff FROM Affreter WHERE compAff NOT IN (SELECT comp FROM Compagnie) OR immat NOT IN (SELECT immat FROM Avion)+---------+--------+------------+| compAff | immat | dateAff |+---------+--------+------------+| GTI | F-WTSS | 2005-11-07 || AF | Toto | 2005-05-13 || GTI | Toto | 2005-11-07 |+---------+--------+------------+

AF

NOT IN (SELECT comp FROM Compagnie)

GTI

NOT IN (SELECT immat FROM Avion)

4055_03_C03 Page 78 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 79

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Contraintes diffeacutereacutees

Les contraintes que nous avons eacutetudieacutees jusqursquoagrave maintenant sont des contraintes immeacutediates(immediate) qui sont controcircleacutees apregraves chaque instruction Une contrainte est dite laquo diffeacutereacutee raquo(deferred) si elle deacuteclenche sa veacuterification seulement agrave la fin de la transaction (premiegravereinstruction commit rencontreacutee) Pour lrsquoheure MySQL avec InnoDB ne propose pas ce modede programmation

Figure 3-9 Tables apregraves modifications et reacuteactivation des contraintes

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

AffretercompAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85 AF F-GLFS 2005-05-13 0SING F-WTSS 2005-11-07 10SING F-GLFS 2005-11-07 40

referenced parent

dependent child

NOT NULL Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GLFS TB-22 500 AF

dependent child

4055_03_C03 Page 79 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

80 copy Eacuteditions Eyrolles

Exercices

Les objectifs de ces exercices sont

drsquoajouter et de modifier des colonnes

drsquoajouter des contraintes

de traiter les erreurs

31 Ajout de colonnes

Eacutecrire le script eacutevolutionsql qui contient les instructions neacutecessaires pour ajouter les colonnessuivantes (avec ALTER TABLE) Le contenu de ces colonnes sera modifieacute ulteacuterieurement

Veacuterifier la structure et le contenu de chaque table avec DESCRIBE et SELECT

32 Modification de colonnes

Dans ce mecircme script rajouter les instructions neacutecessaires pour

bull augmenter la taille dans la table Salle de la colonne nomSalle (passer agrave VARCHAR(30))

bull diminuer la taille dans la table Segment de la colonne nomSegment agrave VARCHAR(15)

bull tenter de diminuer la taille dans la table Segment de la colonne nomSegment agrave VARCHAR(14)Pourquoi la commande nrsquoest-elle pas possible

Veacuterifier la structure et le contenu de chaque table avec DESCRIBE et SELECT

33 Ajout de contraintes

Ajouter la contrainte afin de srsquoassurer qursquoon ne puisse installer plusieurs fois le mecircme logiciel sur unposte de travail donneacute

Ajouter les contraintes de cleacutes eacutetrangegraveres pour assurer lrsquointeacutegriteacute reacutefeacuterentielle (avec ALTER TABLEhellipADD CONSTRAINThellip) entre les tables suivantes Adopter les conventions recommandeacutees dans lechapitre 1 (comme indiqueacute pour la contrainte entre Poste et Types)

Si lrsquoajout drsquoune contrainte reacutefeacuterentielle renvoie une erreur veacuterifier les enregistrements des tableslaquo pegraveres raquo et laquo fils raquo (notamment au niveau de la casse des chaicircnes de caractegraveres Tx est diffeacuterent deTX par exemple)

Tableau 3-5 Donneacutees de la table Installer

Table Nom type et signification des nouvelles colonnes

Segment nbSalle TINYINT(2) nombre de salles par deacutefaut = 0nbPoste TINYINT(2) nombre de postes par deacutefaut = 0

Logiciel nbInstall TINYINT(2) nombre drsquoinstallations par deacutefaut = 0

Poste nbLog TINYINT(2) nombre de logiciels installeacutes par deacutefaut = 0

4055_03_C03 Page 80 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 81

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Modifier le script SQL de destruction des tables (dropParcsql) en fonction des nouvelles contrain-tes Lancer ce script puis tous ceux eacutecrits jusqursquoici

34 Traitements des erreurs

Tentez drsquoajouter les contraintes de cleacutes eacutetrangegraveres entre les tables Salle et Segment et entreLogiciel et Types (en gras dans le scheacutema suivant)

Figure 3-10 Contraintes reacutefeacuterentielles agrave creacuteer

SegmentindIP nomSegment etage nbSalle nbPoste

SallenSalle nomSalle nbPoste indIP

PostenPoste nomPoste indIP ad typePoste nSalle nbLog

LogicielnLog nomLog dateAch version typeLog prix nbInstall

InstallernPoste nLog numIns dateIns delai

TypestypeLP nomType

fk_Poste_typePoste_Types

Figure 3-11 Contraintes reacutefeacuterentielles agrave creacuteer

SegmentindIP nomSegment etage nbSalle nbPoste

SallenSalle nomSalle nbPoste indIP

PostenPoste nomPoste indIP ad typePoste nSalle nbLog

LogicielnLog nomLog dateAch version typeLog prix nbInstall

InstallernPoste nLog numIns dateIns delai

TypestypeLP nomType

4055_03_C03 Page 81 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

82 copy Eacuteditions Eyrolles

La mise en place de ces contraintes doit renvoyer une erreur car

bull Il existe des salles (s22 et s23) ayant un numeacutero de segment inexistant dans la table Segment

bull Il existe un logiciel (log8) dont le type nrsquoest pas reacutefeacuterenceacute dans la table Types

Extraire les enregistrements qui posent problegraveme (numeacutero des salles pour le premier cas numeacutero delogiciel pour le second) Supprimer les enregistrements de la table Salle qui posent problegraveme Ajou-ter le type de logiciel (BeOS Systegraveme Be) dans la table Types

Exeacutecuter agrave nouveau lrsquoajout des deux contraintes de cleacute eacutetrangegravere Veacuterifier que les instructions nerenvoient plus drsquoerreur et que les deux requecirctes drsquoextraction ne renvoient aucune donneacutee

4055_03_C03 Page 82 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

83

Chapitre 4

Interrogation des donneacutees

Ce chapitre traite de lrsquoaspect le plus connu du langage SQL qui concerne lrsquoextraction desdonneacutees par requecirctes (nom donneacute aux instructions

SELECT

) Une requecircte permet de rechercherdes donneacutees dans une ou plusieurs tables ou vues agrave partir de critegraveres simples ou complexes Lesinstructions

SELECT

peuvent ecirctre exeacutecuteacutees dans lrsquointerface de commande (voir les exemples dece chapitre) ou au sein drsquoun programme SQL (proceacutedure catalogueacutee) PHP Java C etc

Geacuteneacuteraliteacutes

Lrsquoinstruction

SELECT

est une commande deacuteclarative (elle deacutecrit ce que lrsquoon cherche sans expli-quer le moyen drsquoopeacuterer) Agrave lrsquoinverse une instruction proceacutedurale (comme un programme)deacutevelopperait le moyen pour reacutealiser lrsquoextraction de donneacutees (comme le chemin agrave emprunter

entre des tables ou une iteacuteration pour parcourir un ensemble drsquoenregistrements)

La figure suivante scheacutematise les principales fonctionnaliteacutes de lrsquoinstruction

SELECT

Celle-ciest composeacutee drsquoune directive

FROM

qui preacutecise la (les) table(s) interrogeacutee(s) et drsquoune directive

WHERE

qui contient les critegraveres

Figure 4-1

Possibiliteacutes de lrsquoinstruction

SELECT

Pilote

Compagnie

Air France

Jointure1 (WHERE )

Restriction (WHERE )Projection (SELECT )

Jointure2

Avion

4055_04_C04 Page 83 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

84

copy Eacuteditions Eyrolles

La restriction qui est programmeacutee dans le

WHERE

de la requecircte permet de restreindre larecherche agrave une ou plusieurs lignes Dans notre exemple une restriction reacutepond agrave laquestion laquo

Quels sont les avions de type A320

raquo

La projection qui est programmeacutee dans le

SELECT

de la requecircte permet drsquoextraire une ouplusieurs colonnes Dans notre exemple elle reacutepond agrave la question laquo

Quels sont les numeacute-ros de brevet et les nombres drsquoheures de vol de tous les pilotes

raquo

La jointure qui est programmeacutee dans le

WHERE

de la requecircte permet drsquoextraire des donneacuteesde diffeacuterentes tables en les reliant deux agrave deux (le plus souvent agrave partir de contraintes reacutefeacute-rentielles) Dans notre exemple la premiegravere jointure reacutepond agrave la question laquo

Quels sont lesnumeacuteros de brevet et nombres drsquoheures de vol des pilotes de la compagnie de nom AirFrance

raquo La deuxiegraveme jointure reacutepond agrave la question laquo

Quels sont les avions de lacompagnie de nom Air France

raquo

En combinant ces trois fonctionnaliteacutes toute question logique devrait trouver en theacuteorie unereacuteponse par une ou plusieurs requecirctes Les questions trop complexes peuvent ecirctre program-meacutees agrave lrsquoaide des vues (chapitre 5) ou par traitement (programmes meacutelangeant requecirctes etinstructions proceacutedurales)

Syntaxe (

SELECT

)

Pour pouvoir extraire des enregistrements drsquoune table il faut que celle-ci soit dans votre baseou que vous ayez reccedilu le privilegravege

SELECT

sur la table

La syntaxe SQL simplifieacutee de lrsquoinstruction

SELECT

est la suivante

SELECT

[ DISTINCT | DISTINCTROW | ALL ]

listeColonnes

FROM

nomTable1

[

nomTable2

]

[ WHERE

condition

]

[

clauseRegroupement

]

[ HAVING

condition

]

[

clauseOrdonnancement

]

[ LIMIT [

rangDeacutepart

]

nbLignes

]

Nous deacutetaillerons chaque option agrave lrsquoaide drsquoexemples au cours de ce chapitre

Pseudotable

La pseudotable est une table qui nrsquoa pas de nom et qui est utile pour eacutevaluer une expression dela maniegravere suivante

laquo SELECT

expression

raquo

Les reacutesultats fournis seront uniques (siaucune jointure ou opeacuterateur ensembliste ne sont employeacutes dans lrsquointerrogation)

4055_04_C04 Page 84 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

85

chapitre ndeg 4 Interrogation des donneacutees

Projection (eacuteleacutements du

SELECT

)

Eacutetudions la partie de lrsquoinstruction

SELECT

qui permet de programmer lrsquoopeacuterateur de projec-tion (surligneacute dans la syntaxe suivante)

SELECT

FROM

nomTable

[

aliasTable

]

[

clauseOrdonnancement

]

[ LIMIT [

rangDeacutepart

]

nbLignes

]

DISTINCT

et

DISTINCTROW

jouent le mecircme rocircle agrave savoir ne pas inclure les duplicatas

ALL

prend en compte les duplicatas (option par deacutefaut)

listeColonnes

|

expression1

[[AS]

alias1

] [

expression2

[[AS]

alias2

]

ndash

extrait toutes les colonnes de la table

ndash

expression

nom de colonne fonction SQL constante ou calcul

ndash

alias

renomme lrsquoexpression (nom valable pendant la dureacutee de la requecircte)

FROM

deacutesigne la table (qui porte un alias ou non) agrave interroger

Tableau 4-1 Extraction drsquoexpressions

Besoin Requecircte et reacutesultat

Aucun utilisation proba-blement la plus superflue

mysqlgt SELECT Il reste encore beaucoup de pages+------------------------------------+| Il reste encore beaucoup de pages |+------------------------------------+| Il reste encore beaucoup de pages |+------------------------------------+

Jrsquoai oublieacute ma montre

mysqlgt SELECT SYSDATE() Maintenant +---------------------+| Maintenant |+---------------------+| 2005-11-07 091546 |+---------------------+

Pour les matheux qui vou-draient retrouver le reacutesul-tat de 2

14

le carreacute du cosi-nus de 3

π

sur 2 et e

1

mysqlgt SELECT POWER(214) POWER(COS(135314159265359180)2) Environ EXP(1)+-------------+------------------+----------------+| POWER(214) | Environ | EXP(1) |+-------------+------------------+----------------+| 16384 | 050000000000015 | 2718281828459 |+-------------+------------------+----------------+

[ DISTINCT | DISTINCTROW | ALL ] listeColonnes

4055_04_C04 Page 85 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

86

copy Eacuteditions Eyrolles

clauseOrdonnancement tri sur une ou plusieurs colonnes ou expressions

LIMIT pour limiter le nombre de lignes apregraves reacutesultat

Interrogeons la table suivante en utilisant chaque option

Extraction de toutes les colonnes

Lrsquoextraction de toutes les colonnes drsquoune table requiert lrsquoutilisation du symbole laquo raquo

Extraction de certaines colonnes

La liste des colonnes agrave extraire se trouve dans la clause SELECT

Figure 4-2 Table Pilote

VARCHAR(6) VARCHAR(16) DECIMAL(72) CHAR(4)

Pilote

brevet nom nbHVol compa

PL-1 Gratien Viel 450 AF PL-2 Didier Donsez 0 AF PL-3 Richard Grin 1000 SING PL-4 Placide Fresnais 2450 CAST PL-5 Daniel Vielle AF

Tableau 4-2 Utilisation de laquo raquo

Requecircte SQL Reacutesultat

mysqlgt SELECT FROM Pilote

+--------+------------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+------------------+---------+-------+| PL-1 | Gratien Viel | 45000 | AF || PL-2 | Didier Donsez | 000 | AF || PL-3 | Richard Grin | 100000 | SING || PL-4 | Placide Fresnais | 245000 | CAST || PL-5 | Daniel Vielle | NULL | AF |+--------+------------------+---------+-------+

Web

Tableau 4-3 Liste de colonnes

Requecircte SQL Reacutesultat

SELECT compa brevet FROM Pilote

+-------+--------+| compa | brevet |+-------+--------+| AF | PL-1 || AF | PL-2 || SING | PL-3 || CAST | PL-4 || AF | PL-5 |+-------+--------+

Web

4055_04_C04 Page 86 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 87

chapitre ndeg 4 Interrogation des donneacutees

Alias

Les alias permettent de renommer des colonnes agrave lrsquoaffichage ou des tables dans la requecircte Lesalias de colonnes sont utiles pour les calculs

Lrsquoutilisation de la directive AS est facultative (pour se rendre conforme agrave SQL2)

Il faut preacutefixer les colonnes par lrsquoalias de la table lorsqursquoil existe

Il semble preacutefeacuterable drsquoutiliser la directive AS afin qursquoil nrsquoy ait pas drsquoambiguiumlteacute dans lrsquoexpression(oubli drsquoune virgule) SELECT col1 col2 FROM nomTable ougrave MySQL interpreacutetera la secondecolonne comme un alias de la premiegravere

Duplicatas

Les directives DISTINCT ou DISTINCTROW eacuteliminent les eacuteventuels duplicatas Pour ladeuxiegraveme requecircte les eacutecritures laquo DISTINCT compa raquo laquo DISTINCTROW(compa) raquo etlaquo DISTINCTROW compa raquo sont eacutequivalentes La notation entre parenthegraveses est neacutecessairelorsque lrsquoon deacutesire eacuteliminer des duplicatas par paires triplets etc

Tableau 4-4 Alias (colonnes et tables)

Alias de colonnes Alias de table

SELECT compa AS c1 nom AS NometPrenom brevet c3 FROM Pilote

+------+------------------+------+| c1 | NometPrenom | c3 |+------+------------------+------+| AF | Gratien Viel | PL-1 || AF | Didier Donsez | PL-2 || SING | Richard Grin | PL-3 || CAST | Placide Fresnais | PL-4 || AF | Daniel Vielle | PL-5 |+------+------------------+------+

SELECT aliasPilotescompa AS c1 aliasPilotesnom FROM Pilote aliasPilotes

+------+------------------+| c1 | nom |+------+------------------+| AF | Gratien Viel || AF | Didier Donsez || SING | Richard Grin || CAST | Placide Fresnais || AF | Daniel Vielle |+------+------------------+

Web

4055_04_C04 Page 87 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

88 copy Eacuteditions Eyrolles

Expressions et valeurs nulles

Il est possible drsquoeacutevaluer et drsquoafficher simultaneacutement des expressions dans la clause SELECT(types numeacuteriques DATE et DATETIME)

Les opeacuterateurs arithmeacutetiques sont eacutevalueacutes par ordre de prioriteacute ( + et -)

Le reacutesultat drsquoune expression comportant une valeur NULL est eacutevalueacute agrave NULL

Nous avons deacutejagrave eacutetudieacute les opeacuterations sur les dates et intervalles (chapitre 2) Dans lrsquoexemplesuivant lrsquoexpression 10nbHVol+52 est calculeacutee en multipliant par 10 le nombre drsquoheuresde vol puis en ajoutant le reacutesulat de 5 diviseacute par 2 Dans le second exemple on convertit lemoment actuel (anneacutee mois jour heures minutes et secondes) en un entier

Tableau 4-5 Gestion des duplicatas

Avec duplicata Sans duplicata

SELECT compa FROM Pilote

+-------+| compa |+-------+| AF || AF || SING || CAST || AF |+-------+

SELECT DISTINCT(compa) FROM Pilote

+-------+| compa |+-------+| AF || SING || CAST |+-------+

Web

Tableau 4-6 Expressions numeacuteriques

Requecircte Reacutesultat

SELECT brevet nbHVol nbHVolnbHVol AS auCarre 10nbHVol+52 FROM Pilote

+--------+---------+--------------+---------------+| brevet | nbHVol | auCarre | 10nbHVol+52 |+--------+---------+--------------+---------------+| PL-1 | 45000 | 2025000000 | 45025000 || PL-2 | 000 | 00000 | 25000 || PL-3 | 100000 | 10000000000 | 100025000 || PL-4 | 245000 | 60025000000 | 245025000 || PL-5 | NULL | NULL | NULL |+--------+---------+--------------+---------------+

SELECT SYSDATE()+0 +----------------+| SYSDATE()+0 |+----------------+| 20051107145522 |+----------------+

Web

4055_04_C04 Page 88 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 89

chapitre ndeg 4 Interrogation des donneacutees

Ordonnancement

Pour trier le reacutesultat drsquoune requecircte il faut speacutecifier la clause drsquoordonnancement par ORDERBY de la maniegravere suivante

ORDER BY

expression1 | position1 | alias1 [ASC | DESC]

[expr2 | position2 | alias2 [ASC | DESC]

expression nom de colonne fonction SQL constante calcul

position entier qui deacutesigne lrsquoexpression (au lieu de la nommer) dans son ordre drsquoappa-rition dans la clause SELECT

ASC ou DESC tri ascendant ou descendant (par deacutefaut ASC)

Dans lrsquoexemple suivant on remarque que la valeur NULL est consideacutereacutee comme plus petiteque 0

Concateacutenation

Lrsquoopeacuterateur de concateacutenation se programme agrave lrsquoaide de la fonction CONCAT qui admet deuxchaicircnes de caractegraveres en paramegravetre Cette fonction permet de concateacutener diffeacuterentes expres-sions (colonnes calculs reacutesultats de fonctions SQL ou constantes) sous reacuteserve drsquoeacuteventuellesconversions (casting) La colonne reacutesultante est consideacutereacutee comme une chaicircne de caractegraveres

Lrsquoexemple suivant preacutesente un alias dans lrsquoen-tecircte de colonne (Embauche) qui met enforme les reacutesultats La concateacutenation concerne deux colonnes et la constante vole pour

Tableau 4-7 Ordonnancement

Options par deacutefaut Ordre deacutecroissant (et NULL)

mysqlgt SELECT brevet nom FROM Pilote

+--------+------------------+| brevet | nom |+--------+------------------+| PL-5 | Daniel Vielle || PL-2 | Didier Donsez || PL-1 | Gratien Viel || PL-4 | Placide Fresnais || PL-3 | Richard Grin |+--------+------------------+

mysqlgt SELECT brevetnbHVol FROM Pilote

+--------+---------+| brevet | nbHVol |+--------+---------+| PL-4 | 245000 || PL-3 | 100000 || PL-1 | 45000 || PL-2 | 000 || PL-5 | |+--------+---------+

WebORDER BY nom ORDER BY nbHvol DESC

NULL

4055_04_C04 Page 89 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

90 copy Eacuteditions Eyrolles

Insertion multiligne

Nous pouvons maintenant deacutecrire lrsquoinsertion multiligne eacutevoqueacutee au chapitre preacuteceacutedent Danslrsquoexemple suivant il srsquoagit drsquoinseacuterer tous les pilotes de la table Pilote (en consideacuterant lenom le nombre drsquoheures de vol et la compagnie) dans la table NomsetHVoldesPilotes

Notez que les instructions (CREATE TABLE et INSERT) peuvent ecirctre programmeacutees en uneinstruction (option AS SELECT de la commande CREATE TABLE)

CREATE TABLE NomsetHVoldesPilotes AS SELECT nom nbHVol compa

FROM Pilote

Limitation du nombre de lignes

Pour limiter le nombre de lignes agrave extraire agrave partir du reacutesultat drsquoune requecircte il faut speacutecifier laclause LIMIT de la maniegravere suivante

LIMIT [rangDeacutepart] nbLignes

Tableau 4-8 Concateacutenation

Requecircte Reacutesultat

SELECT brevet AS Embauche FROM Pilote

+--------+---------------------------------+| brevet | Embauche |+--------+---------------------------------+| PL-1 | Gratien Viel vole pour AF || PL-2 | Didier Donsez vole pour AF || PL-3 | Richard Grin vole pour SING || PL-4 | Placide Fresnais vole pour CAST || PL-5 | Daniel Vielle vole pour AF |+--------+---------------------------------+

Web

CONCAT(nom vole pour compa)

Tableau 4-9 Insertion multiligne

Creacuteation et insertion Requecircte et reacutesultat

CREATE TABLE NomsetHVoldesPilotes (nom VARCHAR(16) nbHVol DECIMAL(72) compa CHAR(4))

INSERT INTO NomsetHVoldesPilotes

mysqlgt SELECT FROM NomsetHVoldesPilotes+------------------+---------+-------+| nom | nbHVol | compa |+------------------+---------+-------+| Gratien Viel | 45000 | AF || Didier Donsez | 000 | AF || Richard Grin | 100000 | SING || Placide Fresnais | 245000 | CAST || Daniel Vielle | NULL | AF |+------------------+---------+-------+

Web

SELECT nomnbHVolcompaFROM Pilote

4055_04_C04 Page 90 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 91

chapitre ndeg 4 Interrogation des donneacutees

Le premier entier preacutecise le rang de la premiegravere ligne seacutelectionneacutee (en fonction du tri du reacutesul-tat) Le second entier indique le nombre maximum de lignes agrave extraire La premiegravere ligne estconsideacutereacutee comme preacutesente au rang 0 Ainsi laquo LIMIT n raquo eacutequivaut agrave laquo LIMIT 0n raquoLrsquoexemple suivant illustre deux utilisations de la clause LIMIT

Restriction (WHERE)

Les eacuteleacutements de la clause WHERE drsquoune requecircte permettent de programmer lrsquoopeacuterateur derestriction Cette clause limite la recherche aux enregistrements qui respectent une conditionsimple ou complexe Cette section srsquointeacuteresse agrave la partie surligneacutee de lrsquoinstruction SELECTsuivante

SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes

FROM nomTable [aliasTable]

condition composeacutee de colonnes drsquoexpressions de constantes lieacutees deux agrave deux entredes opeacuterateurs

ndash de comparaison (gt = lt gt= lt= ltgt)

ndash logiques (NOT AND ou OR)

ndash inteacutegreacutes (BETWEEN IN LIKE IS NULL)

Interrogeons la table suivante en utilisant chaque cateacutegorie drsquoopeacuterateur

Tableau 4-10 Limitation des reacutesultats

Requecircte Reacutesultat

Deuxiegraveme et troisiegraveme (ordre de cleacute) pilote

SELECT FROM Pilote

+--------+---------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+---------------+---------+-------+| PL-2 | Didier Donsez | 000 | AF || PL-3 | Richard Grin | 100000 | SING |+--------+---------------+---------+-------+

Les deux pilotes les plus expeacuterimenteacutes (par ordre du nombre drsquoheures de vol)

SELECT FROM Pilote ORDER BY nbHvol DESC

+--------+------------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+------------------+---------+-------+| PL-4 | Placide Fresnais | 245000 | CAST || PL-3 | Richard Grin | 100000 | SING |+--------+------------------+---------+-------+

Web

LIMIT 12

LIMIT 2

[ WHERE condition ]

4055_04_C04 Page 91 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

92 copy Eacuteditions Eyrolles

Opeacuterateurs de comparaison

Le tableau suivant deacutecrit des requecirctes pour lesquelles la clause WHERE contient des opeacuterateursde comparaison

Les eacutecritures laquo prime=500 raquo et laquo (prime=500) raquo sont eacutequivalentes Les eacutecritureslaquo primeltgt500 raquo et laquo NOT (prime=500) raquo sont eacutequivalentes Les parenthegraveses sont utilespour composer des conditions

Notez lrsquoutilisation du simple guillemet pour comparer des chaicircnes de caractegraveres

Figure 4-3 Table Pilote

Web

Pilote

brevet nom nbHVol prime compa

PL-1 Gratien Viel 450 500 AF PL-2 Didier Donsez 0 AF PL-3 Richard Grin 1000 90 SING PL-4 Placide Fresnais 2450 500 CAST PL-5 Daniel Vielle 400 600 SING PL-6 Francoise Tort 0 CAST

Tableau 4-11 Eacutegaliteacute ineacutegaliteacute et comparaison

Eacutegaliteacute Comparaison et ineacutegaliteacute

SELECT brevet nom AS Prime 500 FROM Pilote WHERE +--------+------------------+| brevet | Prime 500 |+--------+------------------+| PL-1 | Gratien Viel || PL-4 | Placide Fresnais |+--------+------------------+

SELECT brevet nom de Air-France FROM Pilote WHERE +--------+---------------+| brevet | de Air-France |+--------+---------------+| PL-1 | Gratien Viel || PL-2 | Didier Donsez |+--------+---------------+

SELECT brevet nom prime FROM Pilote WHERE

+--------+----------------+-------+| brevet | nom | prime |+--------+----------------+-------+| PL-3 | Richard Grin | 90 || PL-6 | Francoise Tort | 0 |+--------+----------------+-------+

SELECT brevet nom prime FROM Pilote WHERE +--------+----------------+-------+| brevet | nom | prime |+--------+----------------+-------+| PL-3 | Richard Grin | 90 || PL-5 | Daniel Vielle | 600 || PL-6 | Francoise Tort | 0 |+--------+----------------+-------+

Webprime = 500

compa = AF

prime lt= 400

prime ltgt 500

4055_04_C04 Page 92 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 93

chapitre ndeg 4 Interrogation des donneacutees

Opeacuterateurs logiques

bull Lrsquoordre de prioriteacute des opeacuterateurs logiques est NOT AND et OR

bull Les opeacuterateurs de comparaison (gt = lt gt= lt= ltgt) sont prioritaires par rapport agrave NOT

bull Les parenthegraveses permettent de modifier ces regravegles de prioriteacute

La premiegravere requecircte de lrsquoexemple suivant contient une condition composeacutee de trois preacutedicatsqui sont eacutevalueacutes par ordre de prioriteacute (drsquoabord AND puis OR) La conseacutequence est lrsquoaffichagedes pilotes de la compagnie SING avec les pilotes de AF ayant moins de 500 heures de vol

La deuxiegraveme requecircte force la prioriteacute avec les parenthegraveses (AND et OR sur le mecircme pieddrsquoeacutegaliteacute) La conseacutequence est lrsquoaffichage des pilotes ayant moins de 500 heures de vol descompagnies SING et AF

Opeacuterateurs inteacutegreacutes

Les opeacuterateurs inteacutegreacutes sont BETWEEN IN LIKE et IS NULL

Tableau 4-12 Opeacuterateurs logiques

Requecircte Reacutesultat sous SQLPlus

SELECT brevet nom compa FROM Pilote WHERE (

+--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-3 | Richard Grin | SING || PL-5 | Daniel Vielle | SING |+--------+---------------+-------+

SELECT brevet nom compa FROM Pilote WHERE (( ) AND nbHVol lt 500)

+--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-5 | Daniel Vielle | SING |+--------+---------------+-------+

Web

compa = SING OR compa = AF AND nbHVol lt 500)

compa = SING OR compa = AF

4055_04_C04 Page 93 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

94 copy Eacuteditions Eyrolles

Tableau 4-13 Opeacuterateurs inteacutegreacutes

Opeacuterateur Exemple

BETWEEN limiteInf AND limiteSup teste lrsquoappartenance agrave un intervalle de valeurs

SELECT brevet nom nbHVol FROM Pilote WHERE nbHVol +--------+---------------+---------+| brevet | nom | nbHVol |+--------+---------------+---------+| PL-1 | Gratien Viel | 45000 || PL-3 | Richard Grin | 100000 || PL-5 | Daniel Vielle | 40000 |+--------+---------------+---------+

IN (listeValeurs) compare une expres-sion avec une liste de valeurs

SELECT brevet nom compa FROM Pilote WHERE compa +--------+------------------+-------+| brevet | nom | compa |+--------+------------------+-------+| PL-3 | Richard Grin | SING || PL-4 | Placide Fresnais | CAST || PL-5 | Daniel Vielle | SING || PL-6 | Francoise Tort | CAST |+--------+------------------+-------+

LIKE (expression) compare de maniegravere geacuteneacuterique des chaicircnes de caractegraveres agrave une expressionLe symbole remplace un ou plusieurs caractegraveresLe symbole _ remplace un caractegravereCes symboles peuvent se combinerUtilisez de preacutefeacuterence des colonnes VARCHAR ou compleacutetez si neacutecessaire par des blancs jusqursquoagrave la taille maximale pour des CHAR

SELECT brevet nom compa FROM Pilote WHERE compa +--------+------------------+-------+| brevet | nom | compa |+--------+------------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-4 | Placide Fresnais | CAST || PL-6 | Francoise Tort | CAST |+--------+------------------+-------+SELECT brevet nom compa FROM Pilote WHERE compa +--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF |+--------+---------------+-------+

IS NULL compare une expression (colonne calcul constante) agrave la valeur NULLLa neacutegation srsquoeacutecrit soit laquo expression IS NOT NULL raquo soit laquo NOT (expression IS NULL) raquo

SELECT nom prime nbHVol FROM Pilote WHERE prime OR nbHVol +----------------+-------+--------+| nom | prime | nbHVol |+----------------+-------+--------+| Didier Donsez | NULL | 000 || Francoise Tort | 0 | NULL |+----------------+-------+--------+

WebBETWEEN 399 AND 1000

IN (CAST SING)

LIKE (A)

LIKE (A_)

IS NULL IS NULL

4055_04_C04 Page 94 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 95

chapitre ndeg 4 Interrogation des donneacutees

Alias

Il nrsquoest pas permis drsquoutiliser un alias de colonne dans la clause WHERE Cette recommandationde la norme srsquoexplique par le fait que certaines expressions pourraient ne pas ecirctre deacutetermineacuteespendant que la condition WHERE est eacutevalueacutee

Ainsi la requecircte suivante renvoie une erreur alors qursquoelle ne contient pourtant pas drsquoexpres-sion litigieuse Il faudra ici remplacer laquo c1 raquo par laquo aliasDesPilotescompa raquo

mysqlgt SELECT aliasDesPilotescompa AS c1 aliasDesPilotesnom

FROM Pilote aliasDesPilotes WHERE c1 = AF

ERROR 1054 (42S22) Unknown column c1 in where clause

Fonctions

MySQL propose un grand nombre de fonctions qui srsquoappliquent dans les clauses SELECT ouWHERE drsquoune requecircte La syntaxe geacuteneacuterale drsquoune fonction est la suivante

nomFonction(colonne1 | expression1 [colonne2 | expression2 hellip])

bull Une fonction monoligne agit sur une ligne agrave la fois et ramegravene un reacutesultat par ligne On distin-gue quatre familles de fonctions monolignes caractegraveres numeacuteriques dates et conversionsde types de donneacutees Ces fonctions peuvent se combiner entre elles (exemple MAX(COS(ABS(n))) deacutesigne le maximum des cosinus de la valeur absolue de la colonne n)

bull Une fonction multiligne (fonction drsquoagreacutegat) agit sur un ensemble de lignes pour ramener unreacutesultat (voir la section Regroupements)

Caractegraveres

Interrogeons la table suivante en utilisant des fonctions pour les caractegraveres

Figure 4-4 Table Pilote

Pilote

brevet prenom nom surnom compa

PL-1 Gratien viel dba AF PL-2 Didier donsez smith AFPL-3 richard Grin Faucon SING

PL-4 placide Fresnais cool CASTPL-5 Daniel vielle jones SINGPL-6 Francoise tort NormaleSup CAST

4055_04_C04 Page 95 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

96 copy Eacuteditions Eyrolles

La plupart des fonctions pour les caractegraveres acceptent une chaicircne de caractegraveres en paramegravetrede nature CHAR ou VARCHAR Le tableau suivant deacutecrit les principales fonctions

Tableau 4-14 Fonctions pour les caractegraveres

Fonction Objectif Exemple

ASCII(c) Retourne le carac-tegravere ASCII eacutequiva-lent

(A) donne 65

CHAR(n) Retourne le carac-tegravere eacutequivalent dans le jeu de caractegraveres en cours

(161) || (162) donne iacuteoacute

CONCAT(c1c2) Concategravene deux chaicircnes

SELECT Personnel FROM Pilote+------------------------------+| Personnel |+------------------------------+| viel travaille pour AF || |

FIELD(cc1c2hellip) Retourne lrsquoindex qui correspond agrave la premiegravere eacutegaliteacute entre c et c1 c et c2 etc 0 si aucune eacutegaliteacute nrsquoest trouveacutee

SELECT Attention agrave la casse

+-----------------------+| Attention agrave la casse |+-----------------------+| 1 |+-----------------------+

INSERT(c1postc2) Modifie la chaicircne c1 en inseacuterant t caractegraveres de la sous-chaicircne c2 agrave partir de la posi-tion pos

SELECT Qui

+---------------------+| Qui |+---------------------+| Compagnie Airbus |+---------------------+

INSTR(c1c2) Premier indice drsquoune sous-chaicircne c1 dans une chaicircne c2Exemple indice de Air dans la chaicircne

SELECT Indice

+--------+| Indice |+--------+| 7 |+--------+

ASCII

CHR CHR

CONCAT(CONCAT(nom vole pour ) compa)

FIELD(Air air AirbusAir)

INSERT(Compxxxie Airbus 5 3 agn)

INSTR(Infos-Air AirBus pourAir-FranceAir)

4055_04_C04 Page 96 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 97

chapitre ndeg 4 Interrogation des donneacutees

LOWER(c) Tout en minuscu-les

SELECT CONCAT( ) Etat civil FROM Pilote WHERE compa = SING+---------------+| Etat civil |+---------------+| richard grin || daniel vielle |

LOCATE(c1c2pos) Premier indice drsquoune sous-chaicircne c1 dans une chaicircne c2 agrave partir de la position posExemple indice de Air dans la chaicircne agrave partir du 9e caractegravere

SELECT Indice apregraves 9

+----------------+| Indice apregraves 9 |+----------------+| 13 |+----------------+

LENGTH(c) Longueur de la chaicircne

SELECT Taille

+-------+| Taille |+--------+| 35 |+--------+

LEFT(cn) Extrait les n pre-miers caractegraveres agrave c en partant de la gauche

SELECT Bye les Jumbo+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+

LPAD(c1nc2) Insertion agrave gauche de c2 dans c1 sur n caractegraveres

SELECT sur 20+----------------------+| sur 20 |+----------------------+| -----------Rien |+----------------------+

REPLACE(c1c2c3) Recherche les c2 preacutesentes dans c1 et les remplace par c3

SELECT Changement+----------------------+| Changement |+----------------------+| EADS et Aerospatiale |+----------------------+

Tableau 4-14 Fonctions pour les caractegraveres (suite)

Fonction Objectif Exemple

LOWER(prenom)LOWER(nom)

LOCATE(AirInfos-Air AirBuspour Air-France9)

LENGTH(Infos-Air AirBus pourAir-France)

LEFT(A380 agrave BlagnacB747B74714)

LPAD(Rien20--)

REPLACE(Matra et AerospatialeMatraEADS)

4055_04_C04 Page 97 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

98 copy Eacuteditions Eyrolles

REVERSE(c) Retourne la chaicircne renverseacutee

SELECT Miroir+----------------+| Miroir |+----------------+| A380 agrave Blagnac |+----------------+

RIGHT(cn) Extrait les n der-niers caractegraveres agrave c en partant de la droite

SELECT Bye les Jumbo+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+

RPAD(c1nc2) Insertion agrave droite de c2 dans c1 sur n caractegraveres

SELECT sur 19+---------------------+| sur 19 |+---------------------+| Rien---------- |+---------------------+

SOUNDEX(c) Extrait la phoneacuteti-que drsquoune expres-sion (in english only )

SELECT nom surnom compa FROM Pilote WHERE IN ( )+--------+--------+-------+| nom | surnom | compa |+--------+--------+-------+| donsez | smith | AF || vielle | jone | SING |+--------+--------+-------+

SUBSTR(cn[t]) Extraction de la sous-chaicircne c commenccedilant agrave la position n sur t caractegraveres

SELECT

Ougrave ccedila +-----------+| Ougrave ccedila |+-----------+| agrave Blagnac |+-----------+

Tableau 4-14 Fonctions pour les caractegraveres (suite)

Fonction Objectif Exemple

REVERSE(cangalB agrave 083A)

RIGHT(B747B747A380 agrave Blagnac14)

RPAD(Rien19--)

SOUNDEX(surnom)SOUNDEX(SMYTHE) SOUNDEX(John)

SUBSTR(Air France agrave Blagnac Con129)

4055_04_C04 Page 98 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 99

chapitre ndeg 4 Interrogation des donneacutees

Numeacuteriques

En plus des opeacuterateurs arithmeacutetiques disponibles dans les langages de programmation (+ - et DIV pour la division entiegravere) MySQL supporte un grand nombre de fonctions numeacuteriques

TRIM(c1 FROM c2) Enlegraveve les carac-tegraveres c1 agrave la chaicircne c2 (options LEADING et TRAILING pour preacuteciser le sens du deacutecoupage) Existent aussi LTRIM et RTRIM qui enlegravevent des espaces respecti-vement au deacutebut ou agrave la fin drsquoune chaicircne

SELECT

Bye les Jumbo

+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+

UPPER Tout en majuscu-les

SELECT CONCAT( ) Pilotes de CAST

FROM Pilote WHERE compa = CAST+------------------+| Pilotes de CAST |+------------------+| PLACIDE FRESNAIS || FRANCOISE TORT |+------------------+

Tableau 4-14 Fonctions pour les caractegraveres (suite)

Fonction Objectif Exemple

TRIM(B FROM BA380 agrave BlagnacBBBBB)

UPPER(prenom)UPPER(nom)

Tableau 4-15 Fonctions numeacuteriques

Fonction Objectif Exemple

ABS(n) Valeur absolue de n

ACOS(n) Arc cosinus (n de -1 agrave 1) retour exprimeacute en radians (de 0 agrave pi)

ATAN(n) Arc tangente (forall n) retour exprimeacute en radians ( de -pi2 agrave pi2)

CEIL(n) Plus petit entier ge agrave n retourne 16

COS(n) Cosinus de n exprimeacute en radians de 0 agrave 2 pi

retourne 05

COT(n) Cotangente de n exprimeacutee en radians retourne 17320508075689

DEGREES(n) Conversion de radians en degreacutes retourne 90

CEIL(157)

COS(60PI()180)

COT(30PI()180)

DEGREES(PI()2)

4055_04_C04 Page 99 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

100 copy Eacuteditions Eyrolles

Fonction pour les bits

Les opeacuterateurs suivants sont disponibles jusqursquoagrave 64 bits (BIGINT) On peut en utiliser certainsen passant des paramegravetres en base 10 en binaire ou de type chaicircne de caractegraveres

EXP(n) e (271828183) agrave la puissance n

FLOOR(n) Plus grand entier le agrave n retourne 15

LN(n) Logarithme neacutepeacuterien de n

LOG(n)(mn) Logarithme de n dans une base m

MOD(mn) Reste de la division entiegravere de m par n

POW(mn) m puissance n

RADIANS(n) Conversion de degreacutes en radians retourne 15707963267949

RAND() Flottant aleacuteatoire (agrave 14 deacutecimales) entre 0 et 1

retourne 1757

ROUND(mn) Arrondi agrave une ou plusieurs deacutecimales retourne 1757

SIGN(n) Retourne le signe drsquoun nombre (-1 0 ou 1)

SIN(n) Sinus de n exprimeacute en radians de 0 agrave 2 pi retourne 05

SINH(n) Sinus hyperbolique de n

SQRT(n) Racine carreacutee de n

TAN(n) Tangente de n exprimeacutee en radians de 0 agrave 2 pi

TRUNCATE(nm) Coupure de n agrave m deacutecimales retourne 157

Tableau 4-15 Fonctions numeacuteriques (suite)

Fonction Objectif Exemple

FLOOR(157)

RADIANS(90)

ROUND(175672)

ROUND(175672)

SIN(30PI()180)

TRUNC(15791)

Tableau 4-16 Fonctions pour les bits

Fonction Objectif Exemple

OR | OU bits agrave bits b0100 b1100 retourne 12

AND amp ET bits agrave bits b0100 b1100 retourne 4

XOR ^ OU exclusif bits agrave bits b0100 b1100 retourne 8

SHL ltlt Deacutecalage agrave gauche de n posi-tions

3 2 retourne 12

SHR gtgt Deacutecalage agrave droite de n positions b0100 2 retourne 1

Compleacutement agrave 1 ~ Inversion de chaque bit 3+(~3+1) retourne 1 (ici on pro-gramme le compleacutement agrave 2)

BIN(n) Chaicircne qui repreacutesente la valeur binaire de n

retourne 1100

|

amp

^

ltlt

gtgt

BIN(12)

4055_04_C04 Page 100 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 101

chapitre ndeg 4 Interrogation des donneacutees

Dates

Le tableau suivant deacutecrit les principales fonctions pour les dates

BIT_LENGTH(c) Taille de la chaicircne en bits retourne 24 (3 octets)

HEX(ns) Chaicircne en hexadeacutecimal repreacute-sentant ns (nombre ou chaicircne)

retourne FE

OCT(n) Chaicircne en octal repreacutesentant n retourne 14

OCTET_LENGTH(c) Synonyme de LENGTH()

UNHEX(c) Fonction inverse de HEX retourne SQL

Tableau 4-16 Fonctions pour les bits (suite)

Fonction Objectif Exemple

BIT_LENGTH(GTR)

HEX(254)

OCT(12)

UNHEX(53514C)

Tableau 4-17 Fonctions pour les dates

Fonction Objectif Retour

ADDDATE(daten) Ajoute n jours agrave une date (heure) DATE ou DATETIME

ADDTIME(date1date2) Ajoute les deux dates avec date1 TIME ou DATETIME et date2 TIME

TIME ou DATETIME

CURDATE() CURRENT_DATE ou CURRENT_DATE()

Date courante (YYYY-MM-DD ou YYYYM-MDD)

INT ou DATE

CURTIME() CURRENT_TIME ou CURRENT_TIME()

Heure courante (HHMMSS or HHMMSS) INT ou DATE

CURRENT_TIMESTAMP CURRENT_TIMES-TAMP()ou NOW()

Date et heure courantes (YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMS)

INT ou DATETIME

DATE(datet) Extrait une date agrave partir drsquoune expression de type DATETIME

DATE

DATEDIFF(date1date2) Nombre entier de jours entre les 2 dates INT

DATE_ADD(dateINTERVAL expr type) Ajoute un intervalle agrave une date (heure) expr deacutesigne un intervalle type indique comment interpreacuteter le format de lrsquoexpres-sion (voir tableau suivant)

DATE ou DATETIME

DATE_FORMAT(dateformat) Preacutesente la date selon un format (voir tableau suivant)

VARCHAR

DATE_SUB(dateINTERVAL expr type) Soustrait un intervalle agrave une date (heure) Mecircmes paramegravetres que DATE_ADD

DATE ou DATETIME

DAYNAME(date) Nom du jour en anglais VARCHAR

DAY(date) ou DAYOFMONTH(date) Numeacutero du jour dans le mois (0 agrave 31) INT

DAYOFYEAR(date) Numeacutero du jour dans lrsquoanneacutee (0 agrave 366) INT

4055_04_C04 Page 101 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

102 copy Eacuteditions Eyrolles

EXTRACT(type FROM date) Extrait une partie drsquoune date selon un type drsquointervalle (comme pour DATE_ADD)

INT

FROM_DAYS(n) Retourne une date agrave partir drsquoun nombre de jours (le calendrier anneacutee 0 deacutebute agrave n=365)

DATE

FROM_UNIXTIME(nunix[format]) Retourne une date (heure) agrave partir drsquoune estampille Unix (nombre de jours depuis le 111970) Utilisation possible drsquoun format

INT ou DATETIME

HOUR(time) Extrait lrsquoheure drsquoun temps INT

LAST_DAY(date) Dernier jour du mois drsquoune date (heure) DATE

LOCALTIME LOCALTIME() LOCALTI-MESTAMP LOCALTIMESTAMP()

Synonymes de NOW()

MAKEDATE(anneenjour) Construit une date agrave partir drsquoune anneacutee et drsquoun nombre de jours (gt0 si njourgt365 lrsquoanneacutee srsquoincreacutemente automatiquement)

DATE

MAKETIME(heureminuteseconde) Construit une heure TIME

MICROSECOND(date) Extrait les microsecondes drsquoune date-heure

INT

MINUTE(time) Extrait les minutes drsquoun temps INT

MONTH(date) MONTHNAME(date) Retourne respectivement le numeacutero et le nom du mois drsquoune date-heure

INTVARCHAR

NOW() Date et heure courantes au format YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMSS

DATETIME ou INT

PERIOD_DIFF(int1int2) Nombre de mois seacuteparant les deux dates au format YYMM or YYYYMM

INT

SECOND(time) Extrait les secondes drsquoun temps INT

SEC_TO_TIME(secondes) Construit une heure au format HHMMSS ou HHMMSS

TIME ouINT

STR_TO_DATE(cformat) Construit une date (heure) selon un certain format Crsquoest lrsquoinverse de DATE_FORMAT()

DATE ou DATETIME ou TIME

SUBDATE(daten) Retranche n jours agrave une date (heure) DATE ou DATETIME

SUBTIME(date1date2) Retranche date2 (TIME) agrave date1 (TIME ou DATETIME)

TIME ou DATETIME

SYSDATE() Date et heure courantes au format YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMSS (diffeacuterence avec NOW voir chapitre 1)

DATETIME ou INT

TIME(datetime) Extrait le temps drsquoune date-heure TIME

Tableau 4-17 Fonctions pour les dates (suite)

Fonction Objectif Retour

4055_04_C04 Page 102 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 103

chapitre ndeg 4 Interrogation des donneacutees

TIMEDIFF(tdate1tdate2) Temps entre 2 temps ou 2 dates ou 2 dates-heure

TIME

TIMESTAMP(date) Construit une estampille agrave partir drsquoune date (heure)

TIMESTAMP

TIMESTAMPADD(intervalleintdate) Ajoute agrave la date (heure) un intervalle (int) du type FRAC_SECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER ou YEAR

TIMESTAMP

TIMESTAMPDIF(intervalleintdate) Retranche agrave la date (heure) un intervalle du type (idem preacuteceacutedent)

TIMESTAMP

TIME_TO_SEC(time) Retourne le nombre de secondes eacutequiva-lent au temps

INT

TO_DAYS(date) Retourne un nombre de jours agrave partir drsquoune date (YYYY-MM-DD ou YYYYMMDD) Inverse de FROM_DAYS()

INT

UNIX_TIMESTAMP(date) Retourne le nombre de secondes depuis le 111970 jusqursquoagrave la date (heure) passeacutee en paramegravetre (ou entier au format YYMMDD YYYYMMDD) Inverse de FROM_UNIX-TIME()

INT

UTC_DATE() UTC_TIME() UTC_TIMES-TAMP()

Retournent respectivement la date lrsquoheure et lrsquoestampille au meacuteridien de Greenwich

DATETIMEDATETIME

WEEKDAY(date) Numeacutero du jour (0 lundi 1 mardi 6 dimanche) drsquoune date (heure)

INT

WEEKOFYEAR(date) Numeacutero de la semaine en cours (1 agrave 53) INT

Tableau 4-17 Fonctions pour les dates (suite)

Fonction Objectif Retour

4055_04_C04 Page 103 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

104 copy Eacuteditions Eyrolles

Tableau 4-18 Paramegravetres drsquointervalles pour les fonctions DATE_ADD et DATE_SUB

Paramegravetre type Paramegravetre expr

MICROSECOND nSECOND n

MINUTE n

HOUR nn

DAY nn

WEEK n

MONTH nn

YEAR nnnn

SECOND_MICROSECOND ssmicrosec

MINUTE_MICROSECOND mimicrosec

MINUTE_SECOND missS

HOUR_MICROSECOND hhmicrosec

HOUR_SECOND hhmiss

HOUR_MINUTE hhmi

DAY_MICROSECOND ddmicrosec

DAY_SECOND dd hhmiss

DAY_MINUTE dd hhmi

DAY_HOUR dd hh

YEAR_MONTH yyyy-mm

Tableau 4-19 Principaux formats pour les fonctions DATE_FORMAT et STR_TO_DATE

Format Description

a Nom du jour en anglais abreacutevieacute (SunSat)

b Nom du mois en anglais abreacutevieacute (JanDec)

c Mois (012)

e Jour du mois (031)

f Microsecondes (000000999999)

H Heures (0023)

i Minutes (0059)

j Jour de lrsquoanneacutee (001366)

M Nom du mois en anglais (JanuaryDecember)

s Secondes (0059)

T Time sur 24 heures (hhmmss)

u Numeacutero de semaine (0053)

W Nom du jour en anglais (SundaySaturday)

w Jour de la semaine (0=Sunday6=Saturday)

Y Anneacutee sur 4 positions

4055_04_C04 Page 104 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 105

chapitre ndeg 4 Interrogation des donneacutees

Quelques exemples drsquoutilisation (date du jour mercredi 9 novembre 2005) sont donneacutes dansle tableau suivant

Conversions

MySQL autorise des conversions de types implicites ou explicites

Implicites

Il est possible drsquoaffecter dans une expression ou dans une instruction SQL (INSERTUPDATE) une donneacutee de type numeacuterique (ou date-heure) agrave une donneacutee de type VARCHAR(ou CHAR) Il en va de mecircme pour lrsquoaffectation drsquoune colonne VARCHAR par une donneacutee de typedate-heure (ou numeacuterique) On parle ainsi de conversions implicites

Tableau 4-20 Exemples de fonctions pour les dates

Besoin et fonction Reacutesultat

Date dans 31 joursSELECT

+--------------------------+| ADDDATE(2005-11-9 31) |+--------------------------+| 2005-12-10 |+--------------------------+

1 jour et 1 microseconde apregraves le 9112005 11 heures 1 microsecondeSELECT

exemple ADDTIME

+----------------------------+| exemple ADDTIME |+----------------------------+| 2005-11-10 230000000000 |+----------------------------+

Rendez-vous dans 4 moisSELECT DATE_ADD(CURRENT_TIMESTAMP INTERVAL 4 MONTH) RDV

+---------------------+| RDV |+---------------------+| 2006-03-09 170733 |+---------------------+

Rendez-vous dans 7 jours 1 heure et 30 minutesSELECT

RDV 1sem 1h30

+---------------------+| RDV 1sem 1h30 |+---------------------+| 2005-11-16 185303 |+---------------------+

Aujourdrsquohui en anglaisSELECT

Y) Today in English

+----------------------------+| Today in English |+----------------------------+| Wednesday 09 November 2005 |+----------------------------+

Extraction au format numeacuterique du jour heures et minutesSELECT

DAY_MINUTE

+------------+| DAY_MINUTE |+------------+| 90102 |+------------+

WebADDDATE(2005-11-9 31)

ADDTIME(2005-11-092259599999991 000000001)

DATE_ADD(CURRENT_TIMESTAMPINTERVAL 7 013000 DAY_SECOND)

DATE_FORMAT(SYSDATE() W d MY)

EXTRACT(DAY_MINUTE FROM 2005-11-09010203)

4055_04_C04 Page 105 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

106 copy Eacuteditions Eyrolles

Pour preuve le script suivant ne renvoie aucune erreur

CREATE TABLE Test (c1 DECIMAL(63) c2 DATE c3 VARCHAR(1) c4

CHAR)

INSERT INTO Test VALUES (54845 20060116 3 5)

Explicites

Une conversion est dite laquo explicite raquo quand on utilise une fonction agrave cet effet Les fonctions deconversion les plus connues sont CAST et CONVERT (qui respectent la syntaxe de la normeSQL)

Les fonctions de conversion sont deacutecrites dans le tableau suivant

Comparaisons

MySQL compare deux variables entre elles en suivant les regravegles suivantes

bull Si lrsquoune des deux valeurs est NULL la comparaison retourne NULL (sauf pour lrsquoopeacuterateurlt=gt qui renvoie vrai si les deux valeurs sont NULL)

bull Si les deux valeurs sont des chaicircnes elles sont compareacutees en tant que telles

bull Si les deux valeurs sont des numeacuteriques elles sont compareacutees en tant que telles

bull Les valeurs hexadeacutecimales sont traiteacutees comme des chaicircnes de bits si elles ne sont pascompareacutees agrave des numeacuteriques

bull Si lrsquoune des valeurs est TIMESTAMP ou DATETIME et si lrsquoautre est une constante cette der-niegravere est convertie en TIMESTAMP

bull Dans les autres cas les valeurs sont compareacutees comme des numeacuteriques (flottants)

Tableau 4-21 Fonctions de conversion

Fonction Conversion Exemple

BINARY(expr) Lrsquoexpression en bits Pour le premier pilote de notre dernier exemple le test =

renverra faux

CAST(expression AS typeMySQL )

Lrsquoexpression dans le type en para-megravetre (BINARY CHAR DATE DATETIME DECIMAL SIGNED TIME UNSIGNED)

retourne 2

CONVERT(c jeu-car)

La chaicircne c dans le jeu de caractegrave-res passeacute en paramegravetre jeu de caractegravere DOS retourne

Ecirc Iacute

BINARY(brevet)BINARY(pl-1)

CAST(2 AS CHAR)

CONVERT(Auml Ecirc Iacute Oslash USINGcp850)

4055_04_C04 Page 106 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 107

chapitre ndeg 4 Interrogation des donneacutees

Eacutenumeacuterations

Nous avons vu au chapitre 2 comment manipuler les deux types drsquoeacutenumeacuterations que MySQLpropose (ENUM et SET) Eacutetudions agrave preacutesent quelques fonctions relatives agrave ces types

Type ENUM

Chaque valeur de lrsquoeacutenumeacuteration est associeacutee agrave un indice commenccedilant agrave 1 Ainsi il est possiblede retrouver la position drsquoune valeur au sein de son eacutenumeacuteration comme lrsquoillustre lrsquoexemplesuivant deacutecrit au chapitre 2

Lrsquoindice drsquoune valeur vide (colonne valueacutee agrave () ou dans lrsquoINSERT) est 0 celui drsquounevaleur NULL est NULL

Type SET

Il est possible drsquoextraire des enregistrements en comparant des ensembles entre eux ou entestant lrsquoappartenance drsquoeacuteleacutements au sein drsquoune eacutenumeacuteration SET Lrsquoexemple suivant (deacutecritau chapitre 2) illustre deux possibiliteacutes drsquoextraction

Tableau 4-22 Exemples drsquoextraction drsquoindices drsquoune eacutenumeacuteration ENUM

Table et donneacutees Extraction

Figure 4-5 Table et donneacutees colonne ENUM mysqlgt SELECT nom diplome FROM UnCursus

+-------------+---------+-----------+| nom | diplome | diplome+0 |+-------------+---------+-----------+| F Brouard | BTS | 1 || F Degrelle | Licence | 3 |+-------------+---------+-----------+

Web

UnCursus

num nom diplome

E1 F Brouard BTS E2 F Degrelle Licence

ENUM

BTS DUT Licence INSA

diplome+0

4055_04_C04 Page 107 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

108 copy Eacuteditions Eyrolles

Il est possible drsquoeacutecrire des extractions baseacutees sur lrsquoopeacuterateur LIKE (exemple laquo SELECT hellipFROM Cursus WHERE diplomes LIKE (Licence) raquo) Cela nrsquoest cependant pasrecommandeacute car le mot Licence peut ecirctre preacutesent dans lrsquoensemble non pas en tant qursquoeacuteleacute-ment mais en tant que sous-chaicircne drsquoun eacuteleacutement

Autres fonctions

Drsquoautres fonctions nrsquoappartenant pas agrave la classification preacuteceacutedente sont preacutesenteacutees dans letableau suivant

Tableau 4-23 Exemples drsquoextration drsquoune eacutenumeacuteration SET

Table et donneacutees Extraction

Figure 4-6 Table et donneacutees colonne SET SELECT nom diplomes FROM Cursus WHERE

+-------------+------------------+| nom | diplomes |+-------------+------------------+| F Brouard | BTSLicence || F Degrelle | DUTLicenceINSA |+-------------+------------------+

SELECT nom diplomes FROM Cursus WHERE diplomes = +------------+-------------+| nom | diplomes |+------------+-------------+| F Brouard | BTSLicence |+------------+-------------+

Web

Cursus

num nom diplomes

E1 F Brouard BTS Licence E2 F Degrelle Licence INSA DUT E0 F Peyrard INSA DUT

SET

BTS DUT Licence INSA

FIND_IN_SET(Licencediplomes)gt0

BTSLicence

Tableau 4-24 Autres fonctions

Fonction Objectif Exemple

DEFAULT(colonne) Valeur par deacutefaut drsquoune colonne (NULL si aucune)

FORMAT(numeri-quenb)

Formate un nombre arrondi agrave nb deacutecimales de la maniegravere suivante

retourne 12345679

GREATEST(expres-sion[ expres-sion])

Retourne la plus grande des expressions retourne X-Men

FORMAT(12345678901 1)

GREATEST(RaffarinChiracX-Men)

4055_04_C04 Page 108 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 109

chapitre ndeg 4 Interrogation des donneacutees

Regroupements

Cette section traite agrave la fois des regroupements de lignes (agreacutegats) et des fonctions de groupe(ou multilignes) Nous eacutetudierons les parties surligneacutees de lrsquoinstruction SELECT suivante

SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes

FROM nomTable [ WHERE condition ]

[ clauseOrdonnancement ]

[ LIMIT [rangDeacutepart] nbLignes ]

listeColonnes peut inclure des expressions (preacutesentes dans la clause de regroupe-ment) ou des fonctions de groupe

clauseRegroupement GROUP BY (expression1[expression2]) permetde regrouper des lignes selon la valeur des expressions (colonnes fonction constante calcul)

HAVING condition pour inclure ou exclure des lignes aux groupes (la condition nepeut faire intervenir que des expressions du GROUP BY)

ClauseOrdonnancement deacutejagrave eacutetudieacute (ORDER BY dans la section ProjectionOrdon-nancement)

Interrogeons la table suivante en composant des regroupements et en appliquant des fonctionsde groupe

LEAST(expression[ expression])

Retourne la plus petite des expressions retourne Sarkozy

NULLIF(expr1expr2) Si expr1 = expr2 retourne NULL sinon retourne expr1

retourne Raffarine

IFNULL(expr1expr2) Convertit expr1 susceptible drsquoecirctre nul en une valeur reacuteelle (expr2)

retourne Aucun si diplome est NULL

Tableau 4-24 Autres fonctions (suite)

Fonction Objectif Exemple

LEAST(VillepinSarkozyX-Men)

NULLIF(RaffarineParafine)

IFNULL(diplomeAucun )

Figure 4-7 Table Pilote

[ clauseRegroupement ]

[ HAVING condition ]

Web

Pilote

brevet nom nbHVol prime embauche typeAvion compa

PL-1 Gratien Viel 450 500 1965-02-05 A320 AF PL-2 Didier Donsez 0 1995-05-13 A320 AFPL-3 Richard Grin 1000 2001-09-11 A320 SING

PL-4 Placide Fresnais 2450 500 2001-09-21 A330 SING PL-5 Daniel Vielle 400 600 1965-01-16 A340 AF PL-6 Francoise Tort 0 2000-12-24 A340 CAST

4055_04_C04 Page 109 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

110 copy Eacuteditions Eyrolles

Fonctions de groupe

Nous eacutetudions dans cette section les fonctions usuelles Drsquoautres sont proposeacutees pour manipu-ler des cubes (datawarehouse)

Le tableau suivant preacutesente les principales fonctions Lrsquooption DISTINCT eacutevite les duplicatas(pris en compte sinon par deacutefaut) Agrave lrsquoexception de COUNT toutes les fonctions ignorent lesvaleurs NULL (il faudra utiliser IFNULL pour contrer cet effet)

Utiliseacutees sans GROUP BY ces fonctions srsquoappliquent agrave la totaliteacute ou agrave une seule partie drsquounetable comme le montrent les exemples suivants

Tableau 4-25 Fonctions de groupe

Fonction Objectif

AVG([DISTINCT] expr) Moyenne de expr (nombre)

COUNT( | [DISTINCT ] expr) Nombre de lignes ( toutes les lignes expr pour les colonnes non nulles)

GROUP_CONCAT(expr) Composition drsquoun ensemble de valeurs

MAX([DISTINCT] expr) Maximum de expr (nombre date chaicircne)

MIN([DISTINCT] expr) Minimum de expr (nombre date chaicircne)

STDDEV(expr) Eacutecart type de expr (nombre)

SUM([DISTINCT] expr) Somme de expr (nombre)

VARIANCE(expr) Variance de expr (nombre)

Tableau 4-26 Exemples de fonctions de groupe

Fonction Exemples

AVG Moyenne des heures de vol et des primes des pilotes de la compagnie AFSELECT FROM Pilote WHERE compa = AF+-------------+------------+| AVG(nbHVol) | AVG(prime) |+-------------+------------+| 283333333 | 5500000 |+-------------+------------+

COUNT Nombre de pilotes drsquoheures de vol et de primes (toutes et distinctes) recenseacutees dans la tableSELECT

FROM Pilote+----------+---------------+--------------+-----------------------+| COUNT() | COUNT(nbHVol) | COUNT(prime) | COUNT(DISTINCT prime) |+----------+---------------+--------------+-----------------------+| 6 | 5 | 4 | 3 |+----------+---------------+--------------+-----------------------+

WebAVG(nbHVol) AVG(prime)

COUNT() COUNT(nbHVol) COUNT(prime)COCOUNT(DISTINCT prime)

4055_04_C04 Page 110 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 111

chapitre ndeg 4 Interrogation des donneacutees

Eacutetudions agrave preacutesent ces fonctions dans le cadre de regroupements de lignes

Eacutetude du GROUP BY et HAVINGLe groupement de lignes dans une requecircte se programme au niveau surligneacute de lrsquoinstructionSQL suivante

SELECT col1[ col2hellip] fonction1Groupe(hellip)[fonction2Groupe(hellip)hellip]

FROM nomTable [ WHERE condition ]

[ORDER BY col1 | expr1 | position1 [ASC | DESC] [col1 ] ]

GROUP_CONCAT

Nom des pilotes de la compagnie AFSELECT compa FROM Pilote GROUP BY compa+-------+------------------------------------------+| compa | GROUP_CONCAT(nom) |+-------+------------------------------------------+| AF | Gratien VielDidier DonsezDaniel Vielle || CAST | Francoise Tort || SING | Richard GrinPlacide Fresnais |+-------+------------------------------------------+

MAX ndash MIN

Nombre drsquoheures de vol le plus eacuteleveacute date drsquoembauche la plus reacutecente Nombre drsquoheures de vol le moins eacuteleveacute date drsquoembauche la plus ancienneSELECT Date+

Date- FROM Pilote+-------------+------------+------------+------------+| MAX(nbHVol) | Date+ | MIN(prime) | Date- |+-------------+------------+------------+------------+| 245000 | 2001-09-21 | 0 | 1965-02-05 |+-------------+------------+------------+------------+

STDEV ndash SUM ndash VARIANCE

Eacutecart type des primes somme des heures de vol variance des primes des pilotes de la compagnie AFSELECT FROM Pilote WHERE compa = AF+---------------+-------------+-----------------+| STDDEV(prime) | SUM(nbHVol) | VARIANCE(prime) |+---------------+-------------+-----------------+| 500000 | 85000 | 25000000 |+---------------+-------------+-----------------+

Tableau 4-26 Exemples de fonctions de groupe (suite)

Fonction Exemples

GROUP_CONCAT(nom)

MAX(nbHVol) MAX(embauche) MIN(prime)MIN(embauche)

STDDEV(prime) SUM(nbHVol) VARIANCE(prime)

GROUP BY col1 | expr1 | position1 [col2 ]

[ HAVING condition ]

4055_04_C04 Page 111 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

112 copy Eacuteditions Eyrolles

La clause WHERE de la requecircte permet drsquoexclure des lignes pour chaque groupement ou derejeter des groupements entiers Elle srsquoapplique donc agrave la totaliteacute de la table

La clause GROUP BY liste les colonnes du groupement

La clause HAVING permet de poser des conditions sur chaque groupement

La clause ORDER BY permet de trier le reacutesultat (deacutejagrave eacutetudieacutee)

Les colonnes preacutesentes dans le SELECT doivent apparaicirctre dans le GROUP BY Seules desfonctions ou expressions peuvent exister en plus dans le SELECT

Les alias de colonnes ne peuvent pas ecirctre utiliseacutes dans la clause GROUP BY

Dans lrsquoexemple suivant en groupant sur la colonne compa trois ensembles de lignes (groupe-ments) sont composeacutes Il est alors possible drsquoappliquer des fonctions de groupe agrave chacun deces ensembles (dont le nombre nrsquoest pas preacuteciseacute dans la requecircte ni limiteacute par le systegraveme quiparcourt toute la table)

Il est aussi possible de grouper sur plusieurs colonnes (par exemple ici sur les colonnes compaet typeAvion pour classifier les pilotes selon ces deux critegraveres)

Utiliseacutees avec GROUP BY les fonctions srsquoappliquent deacutesormais agrave chaque regroupementcomme le montrent les exemples suivants

Figure 4-8 Groupement sur la colonne compa

Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY

Fonction Exemples

AVG Moyenne des heures de vol et des primes pour chaque compagnieSELECT compa AVG(nbHVol) AVG(prime) FROM Pilote +-------+-------------+------------+| compa | AVG(nbHVol) | AVG(prime) |+-------+-------------+------------+| AF | 283333333 | 5500000 || CAST | NULL | 00000 || SING | 1725000000 | 5000000 |+-------+-------------+------------+

Pilote

brevet nom nbHVol prime embauche typeAvion compa

PL-1 Gratien Viel 450 500 1965-02-05 A320 AF

PL-2 Didier Donsez 0 1995-05-13 A320 AF

PL-5 Daniel Vielle 400 600 1965-01-16 A340 AF

PL-6 Francoise Tort 0 2000-12-24 A340 CAST

PL-3 Richard Grin 1000 2001-09-11 A320 SING

PL-4 Placide Fresnais 2450 500 2001-09-21 A330 SING

Web

GROUP BY(compa)

4055_04_C04 Page 112 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 113

chapitre ndeg 4 Interrogation des donneacutees

COUNT Nombre de pilotes (et ceux qui ont de lrsquoexpeacuterience du vol) par compagnieSELECT compa COUNT() COUNT(nbHVol) FROM Pilote +-------+----------+---------------+| compa | COUNT() | COUNT(nbHVol) |+-------+----------+---------------+| AF | 3 | 3 || CAST | 1 | 0 || SING | 2 | 2 |+-------+----------+---------------+

MAX Nombre drsquoheures de vol le plus eacuteleveacute date drsquoembauche la plus reacutecente pour cha-que compagnieSELECT compa MAX(nbHVol) MAX(embauche) Date+ FROM Pilote +-------+-------------+------------+| compa | MAX(nbHVol) | Date+ |+-------+-------------+------------+| AF | 45000 | 1995-05-13 || CAST | NULL | 2000-12-24 || SING | 245000 | 2001-09-21 |+-------+-------------+------------+

STDEV ndash SUM (avec WHERE)

Eacutecarts types des primes et sommes des heures de vol des pilotes volant sur A320 de chaque compagnieSELECT compa STDDEV(prime) SUM(nbHVol) FROM Pilote WHERE typeAvion = A320 +-------+---------------+-------------+| compa | STDDEV(prime) | SUM(nbHVol) |+-------+---------------+-------------+| AF | 00000 | 45000 || SING | NULL | 100000 |+-------+---------------+-------------+

Plusieurs colonnes dans le GROUP BY

Nombre de pilotes qualifieacutes par type drsquoappareil et par compagnieSELECT compatypeAvion COUNT(brevet) FROM Pilote +-------+-----------+---------------+| compa | typeAvion | COUNT(brevet) |+-------+-----------+---------------+| AF | A320 | 2 || AF | A340 | 1 || CAST | A340 | 1 || SING | A320 | 1 || SING | A330 | 1 |+-------+-----------+---------------+

Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY (suite)

Fonction Exemples

GROUP BY(compa)

GROUP BY(compa)

GROUP BY(compa)

GROUP BY compatypeAvion

4055_04_C04 Page 113 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

114 copy Eacuteditions Eyrolles

Opeacuterateurs ensemblistes

Une des forces du modegravele relationnel repose sur le fait qursquoil est fondeacute sur une base matheacutema-tique (theacuteorie des ensembles) Le langage SQL devrait programmer les opeacuterations binaires(entre deux tables) suivantes

intersection qui extrait des donneacutees preacutesentes simultaneacutement dans les deux tables

union par les opeacuterateurs UNION et UNION ALL qui fusionnent des donneacutees des deuxtables

diffeacuterence qui extrait des donneacutees preacutesentes dans une table sans ecirctre preacutesentes dans ladeuxiegraveme table

produit carteacutesien par le fait de disposer de deux tables dans la clause FROM ce qui permetde composer des combinaisons agrave partir des donneacutees des deux tables

Restrictions

Seules des colonnes de mecircme type (CHAR VARCHAR DATE numeacuteriques etc) doivent ecirctrecompareacutees avec des opeacuterateurs ensemblistes

Lrsquointersection et la diffeacuterence ne sont pas encore disponibles sous MySQL La diffeacuterence seprogramme agrave lrsquoaide de DISTINCT et NOT IN lrsquointersection agrave lrsquoaide de DISTINCT et IN

Attention pour les colonnes CHAR agrave veiller agrave ce que la taille soit identique entre les deuxtables pour que la comparaison fonctionnne Le nom des colonnes nrsquoa pas drsquoimportance Il estpossible de comparer plusieurs colonnes de deux tables

GROUP BY et HAVING

Compagnies (et nombre de leurs pilotes) ayant plus drsquoun piloteSELECT compa COUNT(brevet) FROM Pilote +-------+---------------+| compa | COUNT(brevet) |+-------+---------------+| AF | 3 || SING | 2 |+-------+---------------+

Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY (suite)

Fonction Exemples

GROUP BY(compa)HAVING COUNT(brevet)gt=2

4055_04_C04 Page 114 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 115

chapitre ndeg 4 Interrogation des donneacutees

Exemple

Eacutetudions agrave preacutesent chaque opeacuterateur agrave partir de lrsquoexemple composeacute des deux tables suivantes

AvionsdeAF(immat CHAR(6) typeAvion CHAR(10) nbHVol DECIMAL(102))

AvionsdeSING(immatriculation CHAR(6) typeAv CHAR(10) prixAchatDECIMAL(142))

Il est vraisemblable que seules les deux premiegraveres colonnes doivent ecirctre compareacutees Bien quepermises par MySQL la programmation de lrsquounion lrsquointersection ou la diffeacuterence entre lesprix des avions et les heures de vol (deux colonnes numeacuteriques) ne seraient pas valides drsquounpoint de vue seacutemantique

Intersection

Lrsquointersection entre deux ensembles homogegravenes se programme agrave lrsquoaide drsquoune requecircte du typeSELECT DISTINCT ensemble1 FROM Table1 WHERE ensemble1 IN (SELECT ensemble2FROM Table2) Comme lrsquoopeacuterateur drsquointersection cette requecircte est commutative (Table1 peutjouer le rocircle de Table2 et ensemble1 celui drsquoensemble2)

Notez qursquoagrave lrsquoaffichage le nom des colonnes est donneacute par la premiegravere requecircte La deuxiegravemefait apparaicirctre deux colonnes dans le SELECT

Figure 4-9 Tables pour les opeacuterateurs ensemblistes

Web

AviondeAF

immat typeAvion nbHVol

F-WTSS Concorde 6570 F-GLFS A320 3500 F-GTMP A340

AviondeSING

immatriculation typeAv PrixAchat

S-ANSI A320 104 500 S-AVEZ A320 156 000 S-SMILE A330 198 000 F-GTMP A340 204 500

Tableau 4-28 Exemples drsquointersections

Besoin Requecircte

Quels sont les types drsquoavions que lesdeux compagnies exploitent en com-mun

SELECT FROM AvionsdeAF WHERE typeAvion IN (SELECT typeAv FROM AvionsdeSING)+-----------+| typeAvion |+-----------+| A320 || A340 |+-----------+

WebDISTINCT typeAvion

4055_04_C04 Page 115 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

116 copy Eacuteditions Eyrolles

Si vous voulez continuer ce raisonnement en vous basant sur trois compagnies il suffit drsquoajou-ter une clause WHERE dans les requecirctes imbriqueacutees qui interrogera la troisiegraveme compagnie Ceprincipe se geacuteneacuteralise et pour n compagnies il faudra n imbrications de requecirctes

Opeacuterateurs UNION et UNION ALL

Les opeacuterateurs UNION et UNION ALL sont commutatifs Lrsquoopeacuterateur UNION permet drsquoeacuteviter lesduplicatas (comme DISTINCT dans un SELECT) UNION ALL ne les eacutelimine pas

Quels sont les avions qui sont exploi-teacutes par les deux compagnies en com-mun

SELECT FROM AvionsdeSING WHERE immatriculation IN (SELECT immat FROM AvionsdeAF) AND typeAv IN (SELECT typeAvion FROM AvionsdeAF)+-----------------+--------+| immatriculation | typeAv |+-----------------+--------+| F-GTMP | A340 |+-----------------+--------+

Tableau 4-28 Exemples drsquointersections (suite)

Besoin Requecircte

DISTINCT immatriculation typeAv

Tableau 4-29 Exemples avec les opeacuterateurs UNION

Besoin Requecircte

Quels sont tous les types drsquoavions que les deux compagnies exploitent

SELECT typeAvion FROM AvionsdeAF UNIONSELECT typeAv FROM AvionsdeSING+-----------+| typeAvion |+-----------+| A320 || A340 || Concorde || A330 |+-----------+

Web

4055_04_C04 Page 116 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 117

chapitre ndeg 4 Interrogation des donneacutees

Ce principe se geacuteneacuteralise agrave lrsquounion de n ensembles par n requecirctes relieacutees avec n-1 clausesUNION ou UNION ALL

Diffeacuterence

La diffeacuterence entre deux ensembles homogegravenes se programme agrave lrsquoaide drsquoune requecircte du typeSELECT DISTINCT ensemble1 FROM Table1 WHERE ensemble1 NOT IN (SELECT ensemble2FROM Table2) Comme lrsquoopeacuterateur ensembliste cette requecircte nrsquoest pas commutative car elleprogramme ensemble1-ensemble2

Mecircme requecircte avec les duplicatas On extraitles types de la compagnie AF suivis des typesde la compagnie SING

SELECT typeAvion FROM AvionsdeAF UNION ALLSELECT typeAv FROM AvionsdeSING+-----------+| typeAvion |+-----------+| A320 || A340 || Concorde || A340 || A320 || A320 || A330 |+-----------+

Tableau 4-29 Exemples avec les opeacuterateurs UNION (suite)

Besoin RequecircteWeb

Tableau 4-30 Exemples de diffeacuterences

Besoin Requecircte

Quels sont les types drsquoavions exploiteacutes par lacompagnie AF mais pas par SING

SELECT DISTINCT typeAvion FROM AvionsdeAF WHERE typeAvion NOT IN (SELECT typeAv FROM AvionsdeSING)+-----------+| typeAvion |+-----------+| Concorde |+-----------+

Quels sont les types drsquoavions exploiteacutes par lacompagnie SING mais pas par AF

SELECT DISTINCT typeAv FROM AvionsdeSING WHERE typeAv NOT IN (SELECT typeAvion FROM AvionsdeAF)+--------+| typeAv |+--------+| A330 |+--------+

Web

4055_04_C04 Page 117 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

118 copy Eacuteditions Eyrolles

Ce principe se geacuteneacuteralise agrave la diffeacuterence entre n ensembles par imbrication de n requecirctes (dansle bon ordre)

La directive NOT IN doit ecirctre utiliseacutee avec prudence car elle retourne faux si un membrerameneacute par la sous-interrogation est NULL

Ordonner les reacutesultats

Le reacutesultat drsquoune requecircte contenant des opeacuterateurs ensemblistes est trieacute par deacutefaut par ordrecroissant sauf avec lrsquoopeacuterateur UNION ALL

La clause ORDER BY nrsquoest utilisable qursquoune fois en fin drsquoune requecircte incluant des opeacuterateursensemblistes Cette clause accepte le nom des colonnes de la premiegravere requecircte ou la positionde ces colonnes

Le tableau suivant preacutesente trois eacutecritures diffeacuterentes de la mecircme requecircte ensembliste conte-nant une clause ORDER BY Le besoin est de connaicirctre tous les types drsquoavions que les deuxcompagnies exploitent (classement par ordre deacutecroissant)

Notez que la troisiegraveme requecircte produit le mecircme reacutesultat en faisant intervenir un SELECT(aliaseacute) dans le FROM Ce meacutecanisme permet de construire dynamiquement la table agrave interroger

Tableau 4-31 Exemples avec la clause ORDER BY

Technique Requecircte

Nom de la colonne SELECT typeAvion FROM AvionsdeAF UNIONSELECT typeAv FROM AvionsdeSING

Position de la colonne hellip

SELECT dans le FROM SELECT TtypeAvion FROM T ORDER BY TtypeAvion DESC

+-----------+| typeAvion |+-----------+| Concorde || A340 || A330 || A320 |+-----------+

Web

ORDER BY typeAvion DESC

ORDER BY 1 DESC

(SELECT typeAvion FROM AvionsdeAF UNION SELECT typeAv FROM AvionsdeSING)

4055_04_C04 Page 118 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 119

chapitre ndeg 4 Interrogation des donneacutees

Il faut affecter des alias aux expressions de la premiegravere requecircte pour pouvoir les utiliser dansle ORDER BY final

Pour illustrer cette restriction supposons que nous deacutesirions faire la liste des avions avec leurprix drsquoachat augmenteacute de 20 liste trieacutee en fonction de cette derniegravere hausse Le problegravemeest que la table AvionsdeAF ne possegravede pas une telle colonne Ajoutons donc au SELECT decette table dans le tableau suivant la valeur 0 pour rendre possible lrsquoopeacuterateur UNION

Produit carteacutesien

En matheacutematiques le produit carteacutesien de deux ensembles E et F est lrsquoensemble des couples(x y) ougrave x isin E et y isin F En transposant au modegravele relationnel le produit carteacutesien de deuxtables T1 et T2 est lrsquoensemble des enregistrements (x y) ougrave x isin T1 et y isin T2

Le produit carteacutesien total entre deux tables T1 et T2 se programme sous SQL en positionnantles deux tables dans la clause FROM sans ajouter de conditions dans la clause WHERE Si les conditions sont de la forme c1 opeacuterateur c2 avec c1 isin T1 et c2 isin T2 on parlera dejointure Si les conditions sont de la forme c1 opeacuterateur valeur1 ou c2 opeacuterateur valeur2on parlera de produit carteacutesien restreint

Le produit carteacutesien restreint illustreacute par lrsquoexemple suivant exprime les combinaisons drsquoeacutequi-pages qursquoil est possible de reacutealiser en consideacuterant les pilotes de la compagnie AF et les avionsde la table AviondeAF

Tableau 4-32 Alias pour ORDER BY

Requecircte Reacutesultat

SELECT immatriculation FROM Avions-deSINGUNION SELECT immat 0 FROM AvionsdeAF ORDER BY px DESC

+-----------------+------------+| immatriculation | px |+-----------------+------------+| F-GTMP | 245400000 || S-MILE | 237600000 || S-AVEZ | 187200000 || S-ANSI | 125400000 || F-GLFS | 0000 || F-GTMP | 0000 || F-WTSS | 0000 |+-----------------+------------+

Web12prixAchat px

4055_04_C04 Page 119 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

120 copy Eacuteditions Eyrolles

Le nombre drsquoenregistrements reacutesultant drsquoun produit carteacutesien est eacutegal au produit du nombredrsquoenregistrements des deux tables mises en relation

Dans le cadre de notre exemple le nombre drsquoenregistrements du produit carteacutesien sera de2 pilotes x 3 avions = 6 enregistrements Le tableau suivant deacutecrit la requecircte SQL permettantde construire le produit carteacutesien restreint de notre exemple Les alias distinguent les colonnessrsquoil advenait qursquoil en existe de mecircme nom entre les deux tables

Bilan

Seules les colonnes de mecircme type et repreacutesentant la mecircme seacutemantique peuvent ecirctre compareacuteesagrave lrsquoaide de termes ensemblistes Il est possible drsquoajouter des expressions (constantes oucalculs) agrave une requecircte pour rendre homogegravenes les deux requecirctes et permettre ainsi lrsquoutilisationdrsquoun opeacuterateur ensembliste

Parce qursquoil faut utiliser NOT IN avec prudence diffeacuterentes alternatives aux opeacuterateurs ensem-blistes existent sur la base de jointures de type SQL2 (qui sont deacutetailleacutees dans la prochainesection) elles sont deacutetailleacutees par Pierre Caboche et mises en ligne sur le site Web associeacute agravelrsquoouvrage

Figure 4-10 Produit carteacutesien drsquoenregistrements de tables

AviondeAF

immat typeAvion nbHVol

F-WTSS Concorde 6570 F-GLFS A320 3500 F-GTMP A340

Pilote

brevet nom nbHVol compa

PL-1 Gratien Viel 450 AF PL-2 Richard Grin 1000 SING PL-3 Placide Fresnais 2450 CAST PL-4 Daniel Vielle 5000 AF

Tableau 4-33 Produit carteacutesien

Besoin Requecircte

Quels sont les couples possibles (avion pilote)en consideacuterant les avions et les pilotes de lacompagnie AF

6 lignes extraites

SELECT pbrevet avAFimmat FROM WHERE pcompa = AF+--------+--------+| brevet | immat |+--------+--------+| PL-1 | F-GLFS || PL-1 | F-GTMP || PL-1 | F-WTSS || PL-4 | F-GLFS || PL-4 | F-GTMP || PL-4 | F-WTSS |+--------+--------+

WebPilote p AvionsdeAF avAF

4055_04_C04 Page 120 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 121

chapitre ndeg 4 Interrogation des donneacutees

Jointures

Les jointures permettent drsquoextraire des donneacutees issues de plusieurs tables Le processus denormalisation du modegravele relationnel est baseacute sur la deacutecomposition et a pour conseacutequencedrsquoaugmenter le nombre de tables drsquoun scheacutema Ainsi la majoriteacute des requecirctes utilisent desjointures neacutecessaires pour pouvoir extraire des donneacutees de tables distinctes

Une jointure met en relation deux tables sur la base drsquoune clause de jointure (comparaison decolonnes) Geacuteneacuteralement cette comparaison fait intervenir une cleacute eacutetrangegravere drsquoune table avecune cleacute primaire drsquoune autre table (car le modegravele relationnel est fondamentalement baseacute surles valeurs)

En consideacuterant les tables suivantes les seules jointures logiques doivent se faire sur lrsquoeacutegaliteacutesoit des colonnes comp et compa soit des colonnes brevet et chefPil Ces jointurespermettront drsquoafficher des donneacutees drsquoune table (ou des deux tables) tout en posant des condi-tions sur une table (ou les deux) Par exemple lrsquoaffichage du nom des compagnies (colonne dela table Compagnie) qui ont embaucheacute un pilote ayant moins de 500 heures de vol (conditionsur la table Pilote)

Classification

Une jointure peut srsquoeacutecrire dans une requecircte SQL de diffeacuterentes maniegraveres

laquo relationnelle raquo (aussi appeleacutee laquo SQL89 raquo pour rappeler la version de la norme SQL) laquo SQL2 raquo (aussi appeleacutee laquo SQL92 raquo) laquo proceacutedurale raquo (qui qualifie la structure de la requecircte) laquo mixte raquo (combinaison des trois approches preacuteceacutedentes)

Figure 4-11 Deux tables agrave mettre en jointure

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF

4055_04_C04 Page 121 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

122 copy Eacuteditions Eyrolles

Nous allons principalement eacutetudier les deux premiegraveres eacutecritures qui sont les plus utiliseacuteesNous parlerons en fin de section des deux derniegraveres

Jointure relationnelle

La forme la plus courante de la jointure est la jointure dite laquo relationnelle raquo (aussi appeleacuteeSQL89) caracteacuteriseacutee par une seule clause FROM contenant les tables et alias agrave mettre en join-ture deux agrave deux La syntaxe geacuteneacuterale suivante deacutecrit une jointure relationnelle

SELECT [alias1]col1 [alias2]col2hellip

FROM [nomBase]nomTable1 [alias1] [nomBase]nomTable2 [alias2]hellip

WHERE (conditionsDeJointure)

Cette forme est la plus utiliseacutee car elle est la plus simple agrave eacutecrire Un autre avantage de ce typede jointure est qursquoelle laisse le soin au SGBD drsquoeacutetablir la meilleure strateacutegie drsquoaccegraves (choix dupremier index agrave utiliser puis du deuxiegraveme etc) pour optimiser les performances

Afin drsquoeacuteviter les ambiguiumlteacutes concernant le nom des colonnes on utilise en geacuteneacuteral des alias detables pour suffixer les tables dans la clause FROM et preacutefixer les colonnes dans les clausesSELECT et WHERE

Jointures SQL2

Afin de se rendre conforme agrave la norme SQL2 MySQL propose aussi des directives qui permet-tent de programmer drsquoune maniegravere plus verbale les diffeacuterents types de jointures

SELECT [ALL | DISTINCT | DISTINCTROW ] listeColonnes

FROM [nomBase]nomTable1 [ INNER | LEFT | RIGHT [OUTER] ]

JOIN [nomBase]nomTable2 ON condition | USING ( colonne1 [ colonne2] )

| CROSS JOIN | NATURAL [ LEFT | RIGHT [OUTER] ]

JOIN [nomBase]nomTable2 hellip

[ WHERE condition ]

Cette eacutecriture est moins utiliseacutee que la syntaxe relationnelle Bien que plus concise pour desjointures agrave deux tables elle se complique pour des jointures plus complexes

4055_04_C04 Page 122 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 123

chapitre ndeg 4 Interrogation des donneacutees

Types de jointures

Bien que dans le vocabulaire courant on ne parle que de laquo jointures raquo en fonction de la naturede lrsquoopeacuterateur utiliseacute dans la requecircte de la clause de jointure et des tables concerneacutees ondistingue

Les jointures internes (inner joins)

ndash Lrsquoeacutequijointure (equi join) est la plus connue elle utilise lrsquoopeacuterateur drsquoeacutegaliteacute dans laclause de jointure La jointure naturelle est conditionneacutee en plus par le nom des colon-nes La non eacutequijointure utilise lrsquoopeacuterateur drsquoineacutegaliteacute dans la clause de jointure

ndash Lrsquoautojointure (self join) est un cas particulier de lrsquoeacutequijointure qui met en œuvre deuxfois la mecircme table (des alias de tables permettront de distinguer les enregistrementsentre eux)

La jointure externe (outer join) la plus compliqueacutee qui favorise une table (ditelaquo dominante raquo) par rapport agrave lrsquoautre (dite laquo subordonneacutee raquo) Les lignes de la table domi-nante sont retourneacutees mecircme si elles ne satisfont pas aux conditions de jointure

Le tableau suivant illustre cette classification sous la forme de quelques conditions appliqueacuteesagrave notre exemple

Pour mettre trois tables T1 T2 et T3 en jointure il faut utiliser deux clauses de jointures (uneentre T1 et T2 et lrsquoautre entre T2 et T3) Pour n tables il faut n-1 clauses de jointures Si vousoubliez une clause de jointure un produit carteacutesien restreint est geacuteneacutereacute

Eacutetudions agrave preacutesent chaque type de jointure avec les syntaxes laquo relationnelle raquo et laquo SQL2 raquo

Eacutequijointure

Une eacutequijointure utilise lrsquoopeacuterateur drsquoeacutegaliteacute dans la clause de jointure et compare geacuteneacuterale-ment des cleacutes primaires avec des cleacutes eacutetrangegraveres

En consideacuterant les tables suivantes les eacutequijointures se programment soit sur les colonnescomp et compa soit sur les colonnes brevet et chefPil Extrayons par exemple

Tableau 4-34 Exemples de conditions

Type de jointure Syntaxe de la condition

Eacutequijointure hellipWHERE comp compa

Autojointure hellipWHERE chefPil = brevet

Jointure externe hellipFROM Compagnie Pilote ON comp = compa

=

alias1 alias2

LEFT OUTER JOIN

4055_04_C04 Page 123 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

124 copy Eacuteditions Eyrolles

lrsquoidentiteacute des pilotes de la compagnie de nom Air France ayant plus de 500 heures de vol(requecircte R1)

les coordonneacutees des compagnies qui embauchent des pilotes de moins de 500 heures devol (requecircte R2)

La jointure qui reacutesoudra la premiegravere requecircte est illustreacutee dans la figure par les donneacutees griseacuteestandis que la deuxiegraveme jointure est repreacutesenteacutee par les donneacutees en gras

Eacutecriture laquo relationnelle raquo

bull MySQL recommande drsquoutiliser des alias de tables pour ameacuteliorer les performances

bull Les alias sont obligatoires quand des colonnes de diffeacuterentes tables portent le mecircme nomou dans le cas drsquoautojointures

Eacutecriture laquo SQL2 raquo

bull La clause JOIN hellip ON condition permet de programmer une eacutequijointure

bull Lrsquoutilisation de la directive INNER devant JOINhellip est optionnelle et est appliqueacutee par deacutefaut

Le tableau suivant deacutetaille ces requecirctes avec les deux syntaxes Les clauses de jointures sontgriseacutees

Figure 4-12 Eacutequijointures

Web

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF

4055_04_C04 Page 124 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 125

chapitre ndeg 4 Interrogation des donneacutees

Autojointure

Cas particulier de lrsquoeacutequijointure lrsquoautojointure relie une table agrave elle mecircme

Extrayons par exemple

lrsquoidentiteacute des pilotes placeacutes sous la responsabiliteacute des pilotes de nom Alquieacute(requecircte R3)

la somme des heures de vol des pilotes placeacutes sous la responsabiliteacute des chefs pilotes de lacompagnie de nom Air France (requecircte R4)

Ces requecirctes doivent ecirctre programmeacutees agrave lrsquoaide drsquoune autojointure car elles imposent deparcourir deux fois la table Pilote (examen de chaque pilote en le comparant agrave un autre)Les autojointures sont reacutealiseacutees entre les colonnes brevet et chefPil

La jointure de la premiegravere requecircte est illustreacutee dans la figure par les donneacutees surligneacutees enclair tandis que la deuxiegraveme jointure est mise en valeur par les donneacutees surligneacutees en fonceacute

Tableau 4-35 Exemples drsquoeacutequijointures

Requecircte Jointure relationnelle Jointure SQL2

R1 SELECT brevet nom FROM Pilote Compagnie AND nomComp = Air France AND nbHVol gt 500

SELECT brevet nom FROM Compagnie WHERE nomComp = Air France AND nbHVol gt 500

+--------+--------------+| brevet | nom |+--------+--------------+| PL-2 | Didier Linxe || PL-4 | Henri Alquieacute |+--------+--------------+

R2 SELECT cpgnomComp cpgnrue cpgrue cpgville FROM Pilote pil Compagnie cpg AND pilnbHVol lt 500

SELECT nomComp nrue rue ville FROM Compagnie WHERE nbHVol lt 500

+------------+------+------------+-------+| nomComp | nrue | rue | ville |+------------+------+------------+-------+| Air France | 124 | Port Royal | Paris |+------------+------+------------+-------+

Web

WHERE comp = compa JOIN Pilote ON comp = compa

WHERE cpgcomp = pilcompaINNER JOIN Pilote ON comp = compa

4055_04_C04 Page 125 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

126 copy Eacuteditions Eyrolles

Le tableau suivant deacutetaille ces requecirctes les clauses drsquoautojointures sont surligneacutees Dans lesdeux syntaxes il est impeacuteratif drsquoutiliser un alias de table Concernant lrsquoeacutecriture laquo SQL2 raquo onremarque que les clauses JOIN srsquoimbriquent (pour joindre plus de deux tables)

Figure 4-13 Autojointures

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF

Tableau 4-36 Exemples drsquoautojointures

Requecircte Jointure relationnelle Jointure SQL2

R3 SELECT p1brevet p1nom FROM Pilote p1 Pilote p2 AND p2nom LIKE Alquieacute

SELECT p1brevet p1nom FROM Pilote p1 WHERE p2nom LIKE Alquieacute

+--------+----------------+| brevet | nom |+--------+----------------+| PL-1 | Pierre Lamothe || PL-2 | Didier Linxe |+--------+----------------+

R4 SELECT SUM(p1nbHVol) FROM Pilote p1 Pilote p2 Compagnie cpg AND cpgnomComp = Air France

SELECT SUM(p1nbHVol) FROM Pilote p1 WHERE nomComp = Air France

+----------------+| SUM(p1nbHVol) |+----------------+| 135000 |+----------------+

Web

WHERE p1chefPil = p2brevet JOIN Pilote p2ON p1chefPil = p2brevet

WHERE p1chefPil = p2brevetAND cpgcomp = p2compa

JOIN Pilote p2ON p1chefPil = p2brevet

JOIN CompagnieON comp = p2compa

4055_04_C04 Page 126 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 127

chapitre ndeg 4 Interrogation des donneacutees

Ineacutequijointure

Les requecirctes drsquoineacutequijointures font intervenir tout type drsquoopeacuterateur (ltgt gt lt gt= lt= BETWEENLIKE IN) Agrave lrsquoinverse des eacutequijointures la clause drsquoune ineacutequijointure nrsquoest pas baseacutee surlrsquoeacutegaliteacute de cleacutes primaires (ou candidates) et de cleacutes eacutetrangegraveres

En consideacuterant les tables suivantes extrayons par exemple

les pilotes ayant plus drsquoexpeacuterience que le pilote de numeacutero de brevet PL-2 (requecircte R5)

le titre de qualification des pilotes en raisonnant sur la comparaison des heures de vol avecun ensemble de reacutefeacuterence ici la table HeuresVol (requecircte R6) Dans notre exemple ilsrsquoagit par exemple de retrouver le fait que le premier pilote est deacutebutant

La jointure qui reacutesoudra la deuxiegraveme requecircte est illustreacutee par les niveaux de gris

Le tableau suivant deacutetaille ces requecirctes les clauses drsquoineacutequijointures sont surligneacutees

Figure 4-14 Ineacutequijointures

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4PL-2 Didier Linxe 900 AF PL-4PL-3 Christian Soutou 1000 SINGPL-4 Henri Alquieacute 3400 AF

HeuresVol

titre basnbHVol hautnbHVol

Deacutebutant 0 500Initieacute 501 1000Expert 1001 20000

Tableau 4-37 Exemples drsquoineacutequijointures

Requecircte Jointure relationnelle Jointure SQL2

R5 SELECT p1brevet p1nomp1nbHVol p2nbHVol Reacutefeacuterence FROM Pilote p1 Pilote p2

AND p2brevet = PL-2

SELECT p1brevet p1nom p1nbHVol p2nbHVol Reacutefeacuterence FROM Pilote p1 WHERE p2brevet = PL-2

+--------+------------------+---------+-----------+| brevet | nom | nbHVol | Reacutefeacuterence |+--------+------------------+---------+-----------+| PL-3 | Christian Soutou | 100000 | 90000 || PL-4 | Henri Alquieacute | 340000 | 90000 |+--------+------------------+---------+-----------+

Web

WHERE p1nbHVol gt p2nbHVolJOIN

Pilote p2 ON p1nbHVolgtp2nbHVol

4055_04_C04 Page 127 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

128 copy Eacuteditions Eyrolles

Jointures externes

Les jointures externes permettent drsquoextraire des enregistrements qui ne reacutepondent pas aux cri-tegraveres de jointure Lorsque deux tables sont en jointure externe une table est laquo dominante raquo parrapport agrave lrsquoautre (qui est dite laquo subordonneacutee raquo) Ce sont les enregistrements de la table domi-nante qui sont retourneacutes (mecircme srsquoils ne satisfont pas aux conditions de jointure)

Comme les jointures internes les jointures externes sont geacuteneacuteralement baseacutees sur les cleacutesprimaires et eacutetrangegraveres On distingue les jointures unilateacuterales qui considegraverent une table domi-nante et une table subordonneacutee et les jointures bilateacuterales pour lesquelles les tables jouent unrocircle symeacutetrique (pas de dominant)

Jointures unilateacuterales

En consideacuterant les tables suivantes une jointure externe unilateacuterale permet drsquoextraire

la liste des compagnies et leurs pilotes mecircme les compagnies nrsquoayant pas de pilote(requecircte R7) Sans une jointure externe la compagnie CAST ne peut ecirctre extraite

la liste des pilotes et leurs qualifications mecircme les pilotes nrsquoayant pas encore de qualifica-tion (requecircte R8)

La figure illustre les tables dominantes et subordonneacutees

R6 SELECT pilbrevet pilnom pilnbHVol hvtitre FROM Pilote pil HeuresVol hv

SELECT brevet nom nbHVol titre FROM Pilote

+--------+------------------+---------+----------+| brevet | nom | nbHVol | titre |+--------+------------------+---------+----------+| PL-1 | Pierre Lamothe | 45000 | Deacutebutant || PL-2 | Didier Linxe | 90000 | Initieacute || PL-3 | Christian Soutou | 100000 | Initieacute || PL-4 | Henri Alquieacute | 340000 | Expert |+--------+------------------+---------+----------+

Tableau 4-37 Exemples drsquoineacutequijointures (suite)

Requecircte Jointure relationnelle Jointure SQL2

WHERE pilnbHVol BETWEENhvbasnbHVol AND hvhautnbHVol

JOIN HeuresVol ON nbHVolBETWEEN basnbHVol AND hautnbHVol

4055_04_C04 Page 128 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 129

chapitre ndeg 4 Interrogation des donneacutees

Eacutecriture laquo SQL2 raquo

Le sens de la directive de jointure externe LEFT ou RIGHT de la clause OUTER JOIN deacutesignela table dominante

Le tableau suivant deacutetaille les requecirctes de notre exemple les clauses de jointures externesunilateacuterales sont griseacutees Les tables dominantes sont noteacutees en gras (Compagnie pour lapremiegravere requecircte et Pilote pour la deuxiegraveme)

Figure 4-15 Jointures externes unilateacuterales

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alqu ieacute 3400 AF

Qualifs

brevet typeAv validite

PL-4 A320 2005-06-24 PL-4 A340 2005-06-24 PL-2 A320 2006-04-04 PL-3 A330 2006-05-13

dominantedominante

subordonneacutee

subordonneacutee

Tableau 4-38 Eacutecritures eacutequivalentes de jointures externes unilateacuterales

Requecircte Jointures relationnelles Jointures SQL2

R7 Sans objet SELECT nomComp brevet nom FROM Compagnie --eacutequivalent agraveSELECT nomComp brevet nom FROM Pilote

+--------------+--------+------------------+| nomComp | brevet | nom |+--------------+--------+------------------+| Air France | PL-1 | Pierre Lamothe || Air France | PL-2 | Didier Linxe || Air France | PL-4 | Henri Alquieacute || || Singapore AL | PL-3 | Christian Soutou |+--------------+--------+------------------+

WebLEFT OUTER JOIN Pilote ON comp = compa

RIGHT OUTER JOIN Compagnie ON comp = compa

Castanet AL | NULL | NULL

4055_04_C04 Page 129 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

130 copy Eacuteditions Eyrolles

Jointures bilateacuterales

Les deux tables jouent un rocircle symeacutetrique il nrsquoy a pas de table dominante Ce type de jointurepermet drsquoextraire des enregistrements qui ne reacutepondent pas aux critegraveres de jointure des deuxcocircteacutes de la clause de jointure

En consideacuterant les tables suivantes une jointure externe bilateacuterale permet drsquoextraire parexemple

la liste des compagnies et leurs pilotes incluant les compagnies nrsquoayant pas de pilote et lespilotes rattacheacutes agrave aucune compagnie (requecircte R9)

la liste des pilotes et leurs qualifications incluant les pilotes nrsquoayant pas encore drsquoexpeacute-rience et les qualifications associeacutees agrave des pilotes inconnus (requecircte R10)

R8 Sans objet SELECT quatypeAv pilbrevet pilnom FROM Qualifs qua --eacutequivalent agraveSELECT quatypeAv pilbrevet pilnom FROM Pilote pil

+--------+--------+------------------+| typeAv | brevet | nom |+--------+--------+------------------+| || A320 | PL-2 | Didier Linxe || A330 | PL-3 | Christian Soutou || A320 | PL-4 | Henri Alquieacute || A340 | PL-4 | Henri Alquieacute |+--------+--------+------------------+

Tableau 4-38 Eacutecritures eacutequivalentes de jointures externes unilateacuterales

Requecircte Jointures relationnelles Jointures SQL2

RIGHT OUTER JOIN Pilote pilON pilbrevet = quabrevet

LEFT OUTER JOIN Qualifs quaON pilbrevet = quabrevet

NULL | PL-1 | Pierre Lamothe

4055_04_C04 Page 130 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 131

chapitre ndeg 4 Interrogation des donneacutees

Eacutecriture laquo SQL2 raquo

La directive FULL OUTER JOIN permet drsquoignorer lrsquoordre (et donc le sens de la jointure) destables dans la requecircte

Le seul problegraveme crsquoest que

MySQL ne prend pas encore en charge en version 50 la directive FULL OUTER JOIN

Le tableau suivant deacutetaille les requecirctes de notre exemple les clauses de jointures externesbilateacuterales sont surligneacutees Les enregistrements qui ne respectent pas la condition de jointuresont surligneacutes

Figure 4-16 Jointures externes bilateacuterales

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings

Qualifs

brevet typeAv validite

PL-4 A320 2005-06-24 PL-2 A320 2006-04-04 PL-3 A330 2006-05-13 PL-7 A380 2007-07-20

4055_04_C04 Page 131 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

132 copy Eacuteditions Eyrolles

Jointures proceacutedurales

Les jointures proceacutedurales sont eacutecrites par des requecirctes qui contiennent des sous-interroga-tions (SELECT imbriqueacute) Chaque clause FROM ne contient qursquoune seule table

SELECT colonnesTable1 FROM [nomBase]nomTable1 WHERE colonne(s) | expression(s) IN | = | opeacuterateur (SELECT colonne(s)delaTable2 FROM [nomBase]nomTable2 WHERE colonne(s) | expression(s) IN | = | opeacuterateur (SELECT hellip) [AND (conditionsTable2)] ) [AND (conditionsTable1)]

Tableau 4-39 Jointures externes bilateacuterales

Requecircte Jointure relationnelle Jointures (theacuteoriques) SQL2

R9 Sans objet SELECT nomComp brevet nom FROM Pilote --eacutequivalent agraveSELECT nomComp brevet nom FROM Compagnie

NOMCOMP BREVET NOM--------------- ------ --------------------Air France PL-4 Henri AlquieacuteAir France PL-1 Pierre LamotheAir France PL-2 Didier LinxeSingapore AL PL-3 Christian Soutou

R10 Sans objet SELECT quatypeAv pilbrevet pilnom FROM Pilote pil --eacutequivalent agraveSELECT quatypeAv pilbrevet pilnom FROM Qualifs qua

TYPE BREVET NOM---- ------ --------------------A320 PL-4 Henri AlquieacuteA320 PL-2 Didier LinxeA330 PL-3 Christian Soutou

WebFULL OUTER JOIN Compagnie ON comp = compa

FULL OUTER JOIN Pilote ON comp = compa

Castanet AL PL-5 Michel Castaings

FULL OUTER JOIN Qualifs quaON pilbrevet = quabrevet

FULL OUTER JOIN Pilote pilON pilbrevet = quabrevet

A380 PL-1 Pierre Lamothe PL-5 Michel Castaings

4055_04_C04 Page 132 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 133

chapitre ndeg 4 Interrogation des donneacutees

Cette forme drsquoeacutecriture nrsquoest pas la plus utiliseacutee mais elle permet de mieux visualiser certainesjointures Elle est plus complexe agrave eacutecrire car lrsquoordre drsquoapparition des tables dans les clausesFROM a son importance

Seules les colonnes de la table qui se trouve au niveau du premier SELECT peuvent ecirctreextraites

La sous-interrogation doit ecirctre placeacutee entre parenthegraveses Elle ne doit pas comporter de clauseORDER BY mais peut inclure GROUP BY et HAVING

Le reacutesultat drsquoune sous-interrogation est utiliseacute par la requecircte de niveau supeacuterieur Une sous-interrogation est exeacutecuteacutee avant la requecircte de niveau supeacuterieur

Une sous-interrogation peut ramener une ou plusieurs lignes Les opeacuterateurs = gt lt gt= lt=permettent drsquoen extraire une les opeacuterateurs IN ANY et ALL permettent drsquoen ramenerplusieurs

Sous-interrogations monolignes

Le tableau suivant deacutetaille quelques sous-interrogations monolignes Nous nous basons surcertaines requecirctes deacutejagrave eacutetudieacutees (forme relationnelle et SQL2)

Tableau 4-40 Sous-interrogations monolignes

Opeacuterateur Besoin Requecircte

= pour les eacutequi-jointures ou auto-jointures (= teste une ligne)

R1 (Pilotes de la compagnie de nom Air France ayant plus de 500 heures de vol)

SELECT brevet nom FROM Pilote WHERE compa AND nbHVolgt500

R3 (Pilotes sous la respon-sabiliteacute du pilote de nom Alquieacute)

SELECT brevet nom FROM Pilote WHERE chefPil =

gt pour les ineacutequi-jointures

R5 (Pilotes ayant plus drsquoexpeacuterience que le pilote de brevet PL-2)

SELECT brevet nom nbHVol FROM Pilote WHERE nbHVol gt

Web=

(SELECT compFROM CompagnieWHERE nomComp = Air France)

(SELECT brevet FROM PiloteWHERE nom LIKE Alquieacute)

(SELECT nbHVol FROM PiloteWHERE brevet = PL-2)

4055_04_C04 Page 133 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

134 copy Eacuteditions Eyrolles

Sous-interrogations multilignes (IN ALL et ANY)

Les opeacuterateurs multilignes sont les suivants

bull IN compare un eacuteleacutement agrave une donneacutee quelconque drsquoune liste rameneacutee par la sous-interro-gation Cet opeacuterateur est utiliseacute pour les eacutequijointures et les autojointures (et les intersec-tions) Lrsquoopeacuterateur NOT IN sera employeacute pour les jointures externes (et les diffeacuterences)

bull ANY compare lrsquoeacuteleacutement agrave chaque donneacutee rameneacutee par la sous-interrogation Lrsquoopeacuterateurlaquo =ANY raquo eacutequivaut agrave IN Lrsquoopeacuterateur laquo ltANY raquo signifie laquo infeacuterieur agrave au moins une desvaleurs raquo donc laquo infeacuterieur au maximum raquo Lrsquoopeacuterateur laquo gtANY raquo signifie laquo supeacuterieur agrave aumoins une des valeurs raquo donc laquo supeacuterieur au minimum raquo

bull ALL compare lrsquoeacuteleacutement agrave tous ceux rameneacutes par la sous-interrogation Lrsquoopeacuterateur laquo ltALL raquosignifie laquo infeacuterieur au minimum raquo et laquo gtALL raquo signifie laquo supeacuterieur au maximum raquo

Le tableau suivant deacutetaille quelques sous-interrogations multilignes Le dernier exempleprogramme une partie drsquoune jointure externe

La directive NOT IN doit ecirctre utiliseacutee avec prudence car elle retourne faux si un membrerameneacute par la sous-interrogation est NULL

Tableau 4-41 Sous-interrogations multilignes

Opeacuterateur Besoin Requecircte

IN R2 Coordonneacutees des compagnies qui embauchent des pilotes de moins de 500 heures de vol

SELECT nomComp nrue rue ville FROM Compagnie WHERE comp (

= et IN R4 Somme des heures de vol des pilotes placeacutes sous la responsabiliteacute des chefs pilotes de la compagnie de nom Air France

SELECT SUM(nbHVol) FROM Pilote WHERE chefPil ( )

NOT IN Compagnies nrsquoayant pas de pilote SELECT nomComp nrue rue ville FROM Compagnie WHERE comp

Web

INSELECT compa FROM Pilote

WHERE nbHVol lt 500)

INSELECT brevet FROM PiloteWHERE compa =

(SELECT comp FROM CompagnieWHERE nomComp = Air France)

NOT IN(SELECT compa FROM PiloteWHERE compa IS NOT NULL)

4055_04_C04 Page 134 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 135

chapitre ndeg 4 Interrogation des donneacutees

Afin drsquoillustrer les opeacuterateurs ANY et ALL consideacuterons la table suivante Nous avons indiqueacuteen gras les nombres drsquoheures minimal et maximal des A320 en griseacute les nombres drsquoheuresminimal et maximal des avions de la compagnie AF

Le tableau suivant deacutetaille quelques jointures proceacutedurales utilisant les opeacuterateurs ALL etANY

Figure 4-17 Table Avion

Avions

immat typeAv nbHVol compa

A1 A320 1000 AF A2 A330 1500 AF A3 A320 550 SING A4 A340 1800 SING A5 A340 200 AF A6 A330 100 AF

Tableau 4-42 Opeacuterateurs ALL et ANY

Opeacuterateur Besoin Requecircte et reacutesultat

ANY R11 Avions dont le nombre drsquoheures de vol est infeacuterieur agrave celui de nrsquoimporte quel A320

SELECT immat typeAv nbHVol FROM Avion WHERE nbHVol +-------+--------+--------+| immat | typeAv | nbHVol |+-------+--------+--------+| A3 | A320 | 55000 || A5 | A340 | 20000 || A6 | A330 | 10000 |+-------+--------+--------+

R12 Compagnies et leurs avions dont le nombre drsquoheures de vol est supeacute-rieur agrave celui de nrsquoimporte quel avion de la compagnie de code SING

SELECT immat typeAv nbHVol compa FROM Avion WHERE nbHVol +-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A1 | A320 | 100000 | AF || A2 | A330 | 150000 | AF || A4 | A340 | 180000 | SING |+-------+--------+---------+-------+

lt ANY(SELECT nbHVol FROM AvionWHERE typeAv=A320)

gt ANY(SELECT nbHVol FROM AvionWHERE compa = SING)

4055_04_C04 Page 135 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

136 copy Eacuteditions Eyrolles

Jointures mixtes

Une jointure mixte combine des clauses de jointures relationnelles proceacutedurales (avec dessous-interrogations) ou des clauses de jointures SQL2

Jointure relationnelle proceacutedurale

La jointure mixte suivante combine une clause de jointure relationnelle (en gras) avec unejointure proceacutedurale (en surligneacute) pour programmer la requecircte R4

SELECT SUM(p1nbHVol)

FROM Pilote p1 Pilote p2

WHERE p1chefPil = p2brevet

AND

Ce type drsquoeacutecriture peut ecirctre inteacuteressant srsquoil nrsquoest pas neacutecessaire drsquoafficher des colonnes destables preacutesentes dans les sous-interrogations ou si lrsquoon deacutesire appliquer des fonctions agrave desregroupements

ALL R13 Avions dont le nombre drsquoheures de vol est infeacuterieur agrave tous les A320

SELECT immat typeAv nbHVol FROM Avion WHERE nbHVol +-------+--------+--------+| immat | typeAv | nbHVol |+-------+--------+--------+| A5 | A340 | 20000 || A6 | A330 | 10000 |+-------+--------+--------+

R14 Compagnies et leurs avions dont le nombre drsquoheures de vol est supeacute-rieur agrave tous les avions de la compagnie de code AF

SELECT immat typeAv nbHVol compa FROM Avion WHERE nbHVol +-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A4 | A340 | 180000 | SING |+-------+--------+---------+-------+

Tableau 4-42 Opeacuterateurs ALL et ANY (suite)

Opeacuterateur Besoin Requecircte et reacutesultat

lt ALL(SELECT nbHVol FROM AvionWHERE typeAv=A320)

gt ALL(SELECT nbHVol FROM AvionWHERE compa = AF)

p2compa = (SELECT comp FROM Compagnie WHERE nomComp =

Air France)

4055_04_C04 Page 136 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 137

chapitre ndeg 4 Interrogation des donneacutees

Sous-interrogation dans la clause FROM

Introduite dans SQL2 la possibiliteacute de construire dynamiquement une table dans la clauseFROM drsquoune requecircte est opeacuterationnelle sous MySQL

SELECT listeColonnes

FROM table1 aliasTable1 (SELECThellip FROM table2 WHEREhellip) aliasTable2

[ WHERE (conditionsTable1etTable2) ]

Consideacuterons la table suivante Le but est drsquoextraire le pourcentage partiel de pilotes parcompagnie Dans notre exemple il y a 5 pilotes dont 3 deacutependent de AF Pour cette compa-gnie le pourcentage partiel de pilotes est de 35 soit 60

La requecircte suivante construit dynamiquement deux tables (alias a et b) dans la clause FROMpour reacutepondre agrave cette question

Sous-interrogations synchroniseacutees

Une sous-interrogation est synchroniseacutee si elle manipule des colonnes drsquoune table du niveausupeacuterieur Une sous-interrogation synchroniseacutee est exeacutecuteacutee une fois pour chaque enregistre-

Figure 4-18 Table Pilote

Pilote

brevet nom nbHVol compa

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings

Tableau 4-43 SELECT dans un FROM

Requecircte et tables eacutevalueacutees dans le FROM Reacutesultat

SELECT acompa Comp anbpilbtotal100 Pilote FROM a b +------+---------+

| Comp | Pilote |+------+---------+| NULL | 200000 || AF | 600000 || SING | 200000 |+------+---------+

(SELECT compa COUNT() nbpilFROM Pilote GROUP BY compa)

(SELECT COUNT() total FROM Pilote)

a

compa nbpil

AF 3

SING 1

1

b

total

5

4055_04_C04 Page 137 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

138 copy Eacuteditions Eyrolles

ment extrait par la requecircte de niveau supeacuterieur Cette technique peut ecirctre aussi utiliseacutee dans lesordres UPDATE et DELETE La forme geacuteneacuterale drsquoune sous-interrogation synchroniseacutee est lasuivante Les alias des tables sont utiles pour pouvoir manipuler des colonnes de tables dediffeacuterents niveaux

Une sous-interrogation synchroniseacutee peut ramener une ou plusieurs lignes Diffeacuterents opeacutera-teurs peuvent ecirctre employeacutes (= gt lt gt= lt= EXISTS)

Opeacuterateur matheacutematique

Le tableau suivant deacutetaille un exemple drsquoopeacuterateur matheacutematique appliqueacute agrave une sous-interro-gation synchroniseacutee

Opeacuterateur EXISTS

Lrsquoopeacuterateur EXISTS permet drsquointerrompre la sous-interrogation degraves le premier enregistrementtrouveacute La valeur FALSE est retourneacutee si aucun enregistrement nrsquoest extrait par la sous-interro-gation

SELECT alias1c

FROM nomTable1 alias1

WHERE colonne(s) opeacuterateur (SELECT alias2zhellip

FROM nomTable2 alias2

WHERE alias1x opeacuterateur alias2y )

[AND ( conditionsTable1 )]

Tableau 4-44 Sous-interrogation synchroniseacutee

Besoin Requecircte et reacutesultat

R15 Avions dont le nombre drsquoheures de vol est supeacuterieur au nombre drsquoheures de vol moyen des avions de leur compagnie (ici 700 heures pour AF et 1115 heures pour SING)

SELECT avi1 FROM Avion avi1 WHERE avi1nbHVol

+-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A1 | A320 | 100000 | AF || A2 | A330 | 150000 | AF || A4 | A340 | 180000 | SING |+-------+--------+---------+-------+

gt(SELECT AVG(avi2nbHVol) FROM Avion avi2WHERE avi2compa = avi1compa)

4055_04_C04 Page 138 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 139

chapitre ndeg 4 Interrogation des donneacutees

Utilisons la table suivante pour deacutecrire lrsquoutilisation de lrsquoopeacuterateur EXISTS

La sous-interrogation synchroniseacutee est surligneacutee dans le script suivant

Opeacuterateur NOT EXISTS

Lrsquoopeacuterateur NOT EXISTS retourne la valeur TRUE si aucun enregistrement nrsquoest extrait par lasous-interrogation Cet opeacuterateur peut ecirctre utiliseacute pour eacutecrire des jointures externes

Figure 4-19 Utilisation de EXISTS

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings

Tableau 4-45 Opeacuterateur EXISTS

Besoin Requecircte et reacutesultat

R15 Pilotes ayant au moins un pilote sous leur responsabiliteacute

SELECT pil1brevet pil1nom pil1compa FROM Pilote pil1 WHERE

+--------+--------------+-------+| brevet | nom | compa |+--------+--------------+-------+| PL-4 | Henri Alquieacute | AF |+--------+--------------+-------+

WebEXISTS

(SELECT pil2 FROM Pilote pil2WHERE pil2chefPil = pil1brevet)

Tableau 4-46 Opeacuterateur NOT EXISTS

Besoin Requecircte et reacutesultat

Liste des compagnies nrsquoayant pas de pilote

SELECT cpg FROM Compagnie cpg WHERE NOT EXISTS

+------+------+-------------+---------+-------------+| comp | nrue | rue | ville | nomComp |+------+------+-------------+---------+-------------+| CAST | 1 | G Brassens | Blagnac | Castanet AL |+------+------+-------------+---------+-------------+

(SELECT compa FROM PiloteWHERE compa = cpgcomp)

4055_04_C04 Page 139 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

140 copy Eacuteditions Eyrolles

Autres directives SQL2

Eacutetudions enfin les autres options des jointures SQL2 (NATURAL JOIN USING et CROSSJOIN)

Consideacuterons le scheacutema suivant (des colonnes portent le mecircme nom) La colonne typeAvdans la table Navigant deacutesigne le type drsquoappareil sur lequel le pilote est instructeur

Opeacuterateur NATURAL JOIN

La jointure naturelle est programmeacutee par la clause NATURAL JOIN La clause de jointure estautomatiquement construite sur la base de toutes les colonnes portant le mecircme nom entre lesdeux tables

Les concepteurs devraient ainsi penser agrave nommer drsquoune maniegravere semblable cleacutes primaires etcleacutes eacutetrangegraveres Ce principe nrsquoest pas souvent appliqueacute aux bases volumineuses

Le tableau suivant deacutetaille deux eacutecritures possibles drsquoune jointure naturelle La clause de join-ture est baseacutee sur les colonnes (brevet typeAv) Une clause WHERE aurait pu aussi ecirctreprogammeacutee

Figure 4-20 Deux tables agrave mettre en jointure naturelle

Navigant

brevet nom nbHVol typeAv

PL-1 Pierre Lamothe 450 PL-2 Didier Linxe 900 A320 PL-3 Henri Alquieacute 3400 A380

VolsControle

brevet typeAv validite

PL-1 A320 2005-06-24 PL-2 A320 2006-04-04 PL-2 A330 2006-05-13 PL-3 A380 2007-07-20 PL-3 A320 2005-03-12

Tableau 4-47 Jointures naturelles

Besoin Jointures SQL2 et reacutesultat

Navigants qualifieacutes sur un type drsquoappareil et instructeurs sur ce mecircme type

SELECT brevet nom typeAv validite FROM Naviguant --eacutequivalent agraveSELECT brevet nom typeAv validite FROM VolsControle

NATURAL JOIN VolsControle

NATURAL JOIN Naviguant

4055_04_C04 Page 140 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 141

chapitre ndeg 4 Interrogation des donneacutees

Opeacuterateur USING

La directive USING(col1 col2hellip) de la clause JOIN programme une jointure naturelle res-treinte agrave un ensemble de colonnes Il ne faut pas utiliser drsquoalias de tables dans la liste descolonnes

Dans notre exemple on peut restreindre la jointure naturelle aux colonnes brevet outypeAv Si on les positionnait (brevet typeAv) dans la directive USING cela reviendraitagrave construire un NATURAL JOIN Le tableau suivant deacutetaille deux eacutecritures drsquoune jointurenaturelle restreinte

Opeacuterateur CROSS JOIN

La directive CROSS JOIN programme un produit carteacutesien qursquoon peut restreindre dans laclause WHERE

+--------+--------------+--------+------------+| brevet | nom | typeAv | validite |+--------+--------------+--------+------------+| PL-2 | Didier Linxe | A320 | 2006-04-04 || PL-3 | Henri Alquieacute | A380 | 2007-07-20 |+--------+--------------+--------+------------+

Tableau 4-47 Jointures naturelles (suite)

Besoin Jointures SQL2 et reacutesultat

Tableau 4-48 Jointures naturelles restreintes

Besoin Jointures SQL2 et reacutesultat

Nom des navigants avec leurs qualifications et dates de validiteacute

SELECT nom vtypeAv vvalidite FROM Naviguant

SELECT nom vtypeAv vvalidite FROM VolsControle v

+----------------+--------+------------+| nom | typeAv | validite |+----------------+--------+------------+| Pierre Lamothe | A320 | 2005-06-24 || Didier Linxe | A320 | 2006-04-04 || Didier Linxe | A330 | 2006-05-13 || Henri Alquieacute | A380 | 2007-07-20 || Henri Alquieacute | A320 | 2005-03-12 |+----------------+--------+------------+

WebJOIN VolsControle v USING(brevet)

JOIN Naviguant USING(brevet)

4055_04_C04 Page 141 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

142 copy Eacuteditions Eyrolles

Le tableau suivant preacutesente deux eacutecritures drsquoun produit carteacutesien (seul lrsquoordre drsquoaffichage descolonnes change)

Division

La division est un opeacuterateur algeacutebrique et non ensembliste Cet opeacuterateur est semblable sur leprincipe agrave lrsquoopeacuteration qursquoon apprend au CM2 (oublieacutee plus tard en terminale agrave cause descalculettes) La division est un opeacuterateur binaire comme la jointure car il srsquoagit de diviser unetable (ou partie de) par une autre table (ou partie de) Il est possible drsquoopeacuterer une division agravepartir drsquoune seule table en ce cas on divise deux parties de cette table (analogue aux autojoin-tures)

Lrsquoopeacuterateur de division nrsquoest pas fourni par MySQL (ni par aucun de ses concurrents drsquoailleurs)Il nrsquoexiste donc malheureusement pas drsquoinstruction DIVIDE

Est-ce la complexiteacute ou le manque drsquointeacuterecirct qui freinent les eacutediteurs de logiciels agrave programmerce concept La question reste en suspens alors si vous avez un avis agrave ce sujet faites-moi signe

Cet opeacuterateur permet de traduire le terme laquo pour tous les raquo des requecirctes qursquoon deacutesire pro-grammer en SQL

On peut aussi dire que lorsque vous voulez comparer un ensemble avec un groupe de reacutefeacute-rence il faut programmer une division

La division peut se programmer sous MySQL agrave lrsquoaide drsquoune diffeacuterence (NOT IN) et la fonctionNOT EXISTS

Tableau 4-49 Produit carteacutesien

Besoin Jointures SQL2 et reacutesultat

Combinaison de toutes les lignes des deux tables

SELECT FROM Naviguant -- eacutequivalent agraveSELECT FROM VolsControle

+--------+----------------+---------+--------+--------+--------+------------+| brevet | nom | nbHVol | typeAv | brevet | typeAv | validite |+--------+----------------+---------+--------+--------+--------+------------+| PL-1 | Pierre Lamothe | 45000 | NULL | PL-1 | A320 | 2005-06-24 || PL-2 | Didier Linxe | 90000 | A320 | PL-1 | A320 | 2005-06-24 || PL-3 | Henri Alquieacute | 340000 | A380 | PL-1 | A320 | 2005-06-24 || PL-1 | Pierre Lamothe | 45000 | NULL | PL-2 | A320 | 2006-04-04 |15 rows in set

WebCROSS JOIN VolsControle

CROSS JOIN Naviguant

4055_04_C04 Page 142 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 143

chapitre ndeg 4 Interrogation des donneacutees

La figure suivante illustre lrsquoopeacuterateur de division dans sa plus simple expression (je ne parlepas du contenu des tables bien sucircrhellip) Le scheacutema fait plus apparaicirctre le deuxiegraveme aspect reacuteveacute-lateur eacutenonceacute ci-avant agrave savoir comparer un ensemble (la table T1) avec un ensemble de reacutefeacute-rence (la table T2)

Deacutefinition

La division de la table T1[a1anb1bn] par la table T2[b1bn] (la structure de T2 estincluse dans la structure de T1) donne la table T3[a1an] qui contient les enregistrements tiveacuterifiant ti isin T3 (de structure [a1an]) tj isin T2 (tj de structure [b1bn]) et titj isin T1 (titj destructure [a1anb1bn])

Classification

Consideacuterons lrsquoexemple suivant pour deacutecrire la requecircte agrave construire Il srsquoagit de reacutepondre agrave laquestion laquo Quels sont les avions affreacuteteacutes par toutes les compagnies franccedilaises raquo Lrsquoensem-ble de reacutefeacuterence (A) est constitueacute des codes des compagnies franccedilaises Lrsquoensemble agrave compa-rer (B) est formeacute des codes des compagnies pour chaque avion

Deux cas sont agrave envisager suivant la maniegravere de comparer les deux ensembles

Division inexacte (le reste nrsquoest pas nul) un ensemble est seulement inclus dans un autre(A isin B) La question agrave programmer serait laquo Quels sont les avions affreacuteteacutes par toutes lescompagnies franccedilaises raquo sans preacuteciser si les avions ne doivent pas ecirctre aussi affreacuteteacutes pardes compagnies eacutetrangegraveres Lrsquoavion (A3 Mercure) reacutepondrait agrave cette question que laderniegravere ligne de la table Affretements soit preacutesente ou pas

Division exacte (le reste est nul) les deux ensembles sont eacutegaux (B=A) La question agraveprogrammer serait laquo Quels sont les avions affreacuteteacutes exactement (ou uniquement) partoutes les compagnies franccedilaises raquo Lrsquoavion (A3 Mercure) reacutepondrait agrave cette questionsi la derniegravere ligne de la table Affretements eacutetait inexistante Les lignes concerneacuteesdans les deux tables sont griseacutees

Figure 4-21 Division

T1

Jospin Juppeacute Juppeacute Baudis Baudis Baudis Chirac Chirac Chirac

T2

Quotient

Chirac

Quels sont les enregistrements de T1 qui sont associeacutes agrave laquo tous les raquo enregistrements de T2 Reacuteponse Chirac

Quotient=(T1ndashReste)T2(ici Reste nrsquoest pas nul)

4055_04_C04 Page 143 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

144 copy Eacuteditions Eyrolles

Lrsquoopeacuterateur de diffeacuterence (programmeacute avec NOT IN) combineacute agrave la fonction EXISTS permetde programmer ces deux comparaisons (un ensemble inclus dans un autre et une eacutegaliteacutedrsquoensembles) Il existe drsquoautres solutions agrave base de regroupements et de sous-interrogations(synchroniseacutees ou pas) que nous nrsquoeacutetudierons pas parce qursquoelles me semblent plus compli-queacutees Eacutecrivons agrave preacutesent ces deux divisions agrave lrsquoaide de requecirctes SQL

Division inexacte

Pour programmer le fait qursquoun ensemble est seulement inclus dans un autre (ici A sub B) il fautqursquoil nrsquoexiste pas drsquoeacuteleacutement dans lrsquoensemble A-B La diffeacuterence se programme agrave lrsquoaide delrsquoopeacuterateur NOT IN lrsquoinexistence drsquoeacuteleacutement se programme agrave lrsquoaide de la fonction NOTEXISTS comme le montre la requecircte suivante

Division exacte

Pour programmer le fait qursquoun ensemble est strictement eacutegal agrave un autre (ici A=B) il faut qursquoilnrsquoexiste ni drsquoeacuteleacutement dans lrsquoensemble A-B ni dans lrsquoensemble B-A La traduction matheacute-matique est la suivante A=BhArr(A-B=empty et B-A=empty) Les opeacuterateurs se programment de lamecircme maniegravere que pour la requecircte preacuteceacutedente Le laquo et raquo se programme avec un AND

Figure 4-22 Divisions agrave programmer

Web

Affretements

immat typeAv compa dateAff

A1 A320 SING 1965-05-13 A2 A340 AF 1968-06-22 A3 Mercure AF 1965-02-05A4 A330 ALIB 1965-01-16

A3 Mercure ALIB 1942-03-05 A3 Mercure SING 1987-03-01

Compagnie

comp nomComp pays

AF Air France FALIB Air Lib F SING Singapore AL SG

Reacutesultat

immat typeAv

A3 Mercure

SELECT DISTINCT immat typeAv FROM Affretements aliasAff

WHERE NOT EXISTS

(SELECT DISTINCT comp FROM Compagnie WHERE pays = F

AND comp NOT IN

(SELECT compa FROM Affr etements WHERE immat = aliasAffimmat ))

Ensemble A de reacutefeacuterence

Ensemble B agrave comparer

Parcours de tous les avions

4055_04_C04 Page 144 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 145

chapitre ndeg 4 Interrogation des donneacutees

Reacutesulats en HTML ou XML

Les options laquo --html raquo et laquo --xml raquo (eacutetudieacutees dans lrsquointroduction) permettent de formater lereacutesultat des extractions au standard du Web Cela peut ecirctre inteacuteressant si vous voulez rapide-ment publier des pages (qui seront statiques bien sucircr) ou composer des fichiers destineacutes agravelrsquoeacutechange de donneacutees provenant de votre base Ainsi la requecircte preacuteceacutedente fournira les eacutetats desortie suivants Concernant XML la balise de plus haut niveau contient un attribut deacutecrivantla requecircte

SELECT DISTINCT immat typeAv FROM Affregravetements aliasAff WHERE NOT EXISTS (SELECT comp FROM Compagnie WHERE pays = F AND comp NOT IN (SELECT compa FROM Affretements WHERE immat = aliasAffimmat )) AND NOT EXISTS (SELECT compa FROM Affretements WHERE immat = aliasAffimmat AND compa NOT IN (SELECT comp FROM Compagnie WHERE pays = F ))

A-B

Parcours de tous les avions

B-A

Tableau 4-50 Reacutesultats formateacutes pour le Web

Connexion avec --hmtl Connexion avec --xml

ltTABLE BORDER=1gtltTRgtltTHgtimmatltTHgtltTHgttypeAvltTHgtltTRgtltTRgtltTDgtA3ltTDgtltTDgtMercureltTDgtltTRgtltTABLEgt

ltresultset statement=SELECT DISTINCT immat typeAv FROM Affretements alia-sAff WHERE NOT EXISTS (SELECT comp FROM Compagnie WHERE pays = F AND comp NOT IN (SELECT compa FROM Affre-tements WHERE immat = alia-sAffimmat)) AND NOT EXISTS (SELECT compa FROM Affretements WHERE immat = aliasAffimmat AND compa NOT IN (SELECT comp FROM Compagnie WHERE pays = F))gt ltrowgt ltfield name=immatgtA3ltfieldgt ltfield name=typeAvgtMercureltfieldgt ltrowgtltresultsetgt

Web

4055_04_C04 Page 145 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

146 copy Eacuteditions Eyrolles

Eacutecriture dans un fichier

Meacutecanisme inverse agrave LOAD DATA INFILE eacutetudieacute au chapitre 2 lrsquoexportation de donneacutees (auformat de fichiers) extraites agrave lrsquoaide drsquoune requecircte peut ecirctre programmeacutee agrave lrsquoaide de la direc-tive INTO OUTFILE de lrsquoinstruction SELECT Une telle requecircte eacutecrit dans un fichier dans unreacutepertoire du serveur Le privilegravege FILE est requis Le fichier cible doit ecirctre inexistant avantdrsquoexeacutecuter son chargement La syntaxe simplifieacutee de cette directive est la suivante

SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes

FROM nomTable1 [nomTable2] [ WHERE condition ]

FIELDS deacutecrit comment seront formateacutees dans le fichier les colonnes extraites de(s)table(s) En lrsquoabsence de cette clause TERMINATED BY vaut t ENCLOSED BY vaut et ESCAPED BY vaut ndash FIELDS TERMINATED BY deacutecrit le caractegravere qui seacutepare deux valeurs de colonnesndash FIELDS ENCLOSED BY permet de controcircler le caractegravere qui encadrera chaque valeur

de colonnendash FIELDS ESCAPED BY permet de controcircler les caractegraveres speacuteciaux

LINES deacutecrit comment seront eacutecrites dans le fichier les lignes extraites de(s) table(s) Enlrsquoabsence de cette clause TERMINATED BY vaut n et STARTING BY vaut

Creacuteons le fichier laquo pilotestxt raquo situeacute dans le reacutepertoire laquo Ddev raquo en exportant la tota-liteacute des enregistrements de la table Pilote (SELECT ) deacutecrite au deacutebut du chapitre Lefichier est ensuite ouvert agrave lrsquoaide du WordPad Notez lrsquoutilisation du double laquo raquo pour deacutesi-gner une arborescence Windows Le caractegravere NULL est exporteacute par le caractegravere laquo N raquo

Figure 4-23 Creacuteation drsquoun fichier

INTO OUTFILE cheminEtNomFichier

[FIELDS [TERMINATED BY string]

[[OPTIONALLY] ENCLOSED BY char]

[ESCAPED BY char ] ]

[LINES [STARTING BY string]

[TERMINATED BY string] ]

SELECT INTO OUTFILE Ddevpilotestxt FIELDS TERMINATED BY ENCLOSED BY

FROM Pilote LINES STARTING BY import-Pilote TERMINATED BY $n

4055_04_C04 Page 146 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 147

chapitre ndeg 4 Interrogation des donneacutees

Exercices

Les objectifs de ces exercices sont

de creacuteer dynamiquement des tables et leurs donneacutees

drsquoeacutecrire des requecirctes monotables et multitables

de reacutealiser des modifications synchroniseacutees

de composer des jointures et des divisions

41 Creacuteation dynamique de tables

Eacutecrire le script creacuteaDynamiquesql permettant de creacuteer les tables Softs et PCSeuls suivan-tes (en utilisant la directive AS SELECT de la commande CREATE TABLE) Vous ne poserezaucune contrainte sur ces tables Penser agrave modifier le nom des colonnes

La table Softs sera construite sur la base de tous les enregistrements de la table Logiciel quevous avez creacuteeacutee et alimenteacutee preacuteceacutedemment La table PCSeuls doit seulement contenir les enregis-trements de la table Poste qui sont de type PCWS ou PCNT Veacuterifier

SELECT FROM Softs

SELECT FROM PCSeuls

42 Requecirctes monotables

Eacutecrire le script requecirctessql permettant drsquoextraire agrave lrsquoaide drsquoinstructions SELECT les donneacuteessuivantes

1 Type du poste p8

2 Noms des logiciels UNIX

3 Noms adresses IP numeacuteros de salle des postes de type UNIX ou PCWS

4 Mecircme requecircte pour les postes du segment 13012080 trieacutes par numeacuteros de salles deacutecroissants

5 Numeacuteros des logiciels installeacutes sur le poste p6

6 Numeacuteros des postes qui heacutebergent le logiciel log1

7 Noms et adresses IP complegravetes (ex 1301208001) des postes de type TX (utiliser la fonctionde concateacutenation)

Figure 4-24 Structures des nouvelles tables

SoftsnomSoft version prix

PCSeulsnP nomP seg ad typeP salle

4055_04_C04 Page 147 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

148 copy Eacuteditions Eyrolles

43 Fonctions et groupements

8 Pour chaque poste le nombre de logiciels installeacutes (en utilisant la table Installer)

9 Pour chaque salle le nombre de postes (agrave partir de la table Poste)

10 Pour chaque logiciel le nombre drsquoinstallations sur des postes diffeacuterents

11 Moyenne des prix des logiciels UNIX

12 Plus reacutecente date drsquoachat drsquoun logiciel

13 Numeacuteros des postes heacutebergeant 2 logiciels

14 Nombre de postes heacutebergeant 2 logiciels (utiliser la requecircte preacuteceacutedente en faisant un SELECTdans la clause FROM)

44 Requecirctes multitables

Opeacuterateurs ensemblistes

15 Types de postes non recenseacutes dans le parc informatique (utiliser la table Types)

16 Types existant agrave la fois comme types de postes et de logiciels

17 Types de postes de travail nrsquoeacutetant pas des types de logiciels

Jointures proceacutedurales

18 Adresses IP complegravetes des postes qui heacutebergent le logiciel log6

19 Adresses IP complegravetes des postes qui heacutebergent le logiciel de nom Oracle 8

20 Noms des segments posseacutedant exactement trois postes de travail de type TX

21 Noms des salles ou lrsquoon peut trouver au moins un poste heacutebergeant le logiciel Oracle 6

22 Nom du logiciel acheteacute le plus reacutecent (utiliser la requecircte 12)

Jointures relationnelles

Eacutecrire les requecirctes 18 19 20 21 avec des jointures de la forme relationnelle Numeacuteroter ces nouvellesrequecirctes de 23 agrave 26

27 Installations (nom segment nom salle adresse IP complegravete nom logiciel date drsquoinstallation) trieacuteespar segment salle et adresse IP

Jointures SQL2

Eacutecrire les requecirctes 18 19 20 21 avec des jointures SQL2 (JOIN NATURAL JOIN JOIN USING)Numeacuteroter ces nouvelles requecirctes de 28 agrave 31

4055_04_C04 Page 148 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 149

chapitre ndeg 4 Interrogation des donneacutees

45 Modifications synchroniseacutees

Eacutecrire le script modifSynchroniseacuteessql pour ajouter les lignes suivantes dans la tableInstaller

Eacutecrire les requecirctes UPDATE synchroniseacutees de la forme suivante

UPDATE table1 alias1

SET colonne = (

Pour mettre agrave jour automatiquement les colonnes rajouteacutees

bull nbSalle dans la table Segment (nombre de salles traverseacutees par le segment)

bull nbPoste dans la table Segment (nombre de postes du segment)

bull nbInstall dans la table Logiciel (nombre drsquoinstallations du logiciel)

bull nbLog dans la table Poste (nombre de logiciels installeacutes par poste)

Veacuterifier le contenu des tables modifieacutees (Segment Logiciel et Poste)

46 Opeacuterateurs existentiels

Rajouter au script requecirctessql les instructions SELECT pour extraire les donneacutees suivantes

Sous-interrogation synchroniseacutee

32 Noms des postes ayant au moins un logiciel commun au poste p6 (on doit trouver les postes p2p8 et p10)

Divisions

33 Noms des postes ayant les mecircmes logiciels que le poste p6 (les postes peuvent avoir plus de logi-ciels que p6) On doit trouver les postes p2 et p8 (division inexacte)

34 Noms des postes ayant exactement les mecircmes logiciels que le poste p2 (division exacte) on doittrouver p8

Figure 4-25 Lignes agrave ajouter

Installer nPoste nLog numIns dateIns delai

p2 log6 SYSDATE() NULL p8 log1 SYSDATE () NULL p10 log1

seacutequence

SYSDATE () NULL

SELECT COUNT()

FROM table2 alias2

WHERE alias2colonneA = alias1colonneB)

4055_04_C04 Page 149 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

151

Chapitre 5

Controcircle des donneacutees

Comme dans tout systegraveme multi-utilisateur lrsquousager drsquoun SGBD doit ecirctre identifieacute avant depouvoir utiliser des ressources Les accegraves aux informations et agrave la base de donneacutees doivent ecirctrecontrocircleacutes agrave des fins de seacutecuriteacute et de coheacuterence La figure suivante illustre un groupe drsquoutilisa-teurs dans lequel existe une classification entre ceux qui peuvent consulter mettre agrave joursupprimer des enregistrements voire les tables

Nous verrons dans cette section les aspects du langage SQL qui concernent le controcircle desdonneacutees et des accegraves Nous eacutetudierons

la gestion des utilisateurs qui manipuleront des bases de donneacutees dans lequelles se trouventdes objets tels que des tables index seacutequences (pour lrsquoinstant impleacutementeacutees par des colon-nes

AUTO_INCREMENT

) vues proceacutedures etc

la gestion des privilegraveges qui permettent de donner des droits sur la base de donneacutees (privi-legraveges systegraveme) et sur les donneacutees de la base (privilegraveges objet)

la gestion des vues

lrsquoutilisation du dictionnaire des donneacutees (base de donneacutees

information_schema

)

Le chapitre 9 deacutetaille lrsquooutil graphique

MySQL Administrator

qui permet de srsquoaffranchirdrsquoeacutecrire des instructions SQL

Figure 5-1

Conseacutequences de lrsquoaspect multi-utilisateur

Peut creacuteer des pilotes

Peut consulter les vols

Peut supprimer un vol

Peut deacutetruire la base MySQLTCP-IP

4055_05_C05 Page 151 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

152

copy Eacuteditions Eyrolles

Gestion des utilisateurs

Preacutesenteacute rapidement agrave lrsquointroduction nous verrons qursquoun utilisateur (

user

) est identifieacute parMySQL par son nom et celui de la machine agrave partir de laquelle il se connecte Cela fait ilpourra acceacuteder agrave diffeacuterents objets (tables vues seacutequences index proceacutedures etc) drsquoune oude plusieurs bases sous reacuteserve drsquoavoir reccedilu un certain nombre de privilegraveges

Classification

Les types drsquoutilisateurs leurs fonctions et leur nombre peuvent varier drsquoune base agrave une autreNeacuteanmoins pour chaque base de donneacutees en activiteacute on peut classifier les utilisateurs de lamaniegravere suivante

Le DBA (

DataBase

Administrator

) Il en existe au moins un Une petite base peut nrsquoavoirqursquoun seul administrateur Une base importante peut en regrouper plusieurs qui se parta-gent les tacircches suivantes

ndash installation et mises agrave jour de la base et des outils eacuteventuels

ndash gestion de lrsquoespace disque et des espaces pour les donneacutees

ndash gestion des utilisateurs et de leurs objets (srsquoils ne les gegraverent pas eux-mecircmes)

ndash optimisation des performances

ndash sauvegardes restaurations et archivages

ndash contact avec le support technique

Lrsquoadministrateur reacuteseau (qui peut ecirctre le DBA) se charge de la configuration des couchesclient pour les accegraves distants

Les deacuteveloppeurs qui conccediloivent et mettent agrave jour la base Ils peuvent aussi agir sur leursobjets (creacuteation et modification des tables index seacutequences etc) Ils transmettent auDBA leurs demandes speacutecifiques (stockage optimisation seacutecuriteacute)

Les administrateurs drsquoapplication qui gegraverent les donneacutees manipuleacutees par la ou les applica-tions Pour les petites et les moyennes bases le DBA joue ce rocircle

Les utilisateurs qui se connectent et interagissent avec la base agrave travers les applications ouagrave lrsquoaide drsquooutils (interrogations pour la geacuteneacuteration de rapports ajouts modifications ousuppressions drsquoenregistrements)

Tous seront des utilisateurs (au sens MySQL) avec des privilegraveges diffeacuterents

Creacuteation drsquoun utilisateur (

CREATE USER

)

Pour pouvoir creacuteer un utilisateur vous devez posseacuteder le privilegravege

CREATE

USER

ou

INSERT

sur la base systegraveme

mysql

(car crsquoest la table

mysqluser

qui stockera lrsquoexistence de cenouvel arrivant)

4055_05_C05 Page 152 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

153

chapitre ndeg 5 Controcircle des donneacutees

La syntaxe de creacuteation drsquoun utilisateur est la suivante

CREATE USER

utilisateur

[IDENTIFIED BY [PASSWORD]

motdePasse

]

[

utilisateur2

[IDENTIFIED BY [PASSWORD]

motdePasse2

] ]

IDENTIFIED BY

motdePasse

permet drsquoaffecter un mot de passe (16 caractegraveres maximumsensibles agrave la casse) agrave un utilisateur (16 caractegraveres maximum sensibles aussi agrave la casse)

Le tableau suivant deacutecrit la creacuteation drsquoun utilisateur (agrave exeacutecuter en eacutetant connecteacute en local entant que

root

)

Par deacutefaut les utilisateurs une fois creacuteeacutes nrsquoont aucun droit sur aucune base de donneacutees (agrave parten lecture eacutecriture sur la base

test

et en lecture seule sur la base

information_schema

)La section

Privilegraveges

eacutetudie ces droits

Un utilisateur bien connu

Lors de lrsquoinstallation vous avez ducirc noter la preacutesence de lrsquoutilisateur

root

(mot de passe saisiagrave lrsquoinstallation) Cet utilisateur est le DBA que MySQL vous offre Il vous permettra drsquoeffec-tuer vos tacircches administratives en ligne de commande ou par une console graphique (creacuteer desutilisateurs par exemple)

Liste des utilisateurs

Agrave propos de

root

on le retrouve dans la table

user

de la base

mysql

(

mysqluser

)Lrsquoextraction des colonnes

User

et

Host

restitue la liste des utilisateurs connus du serveur Si

root

nrsquoavait pas seacutelectionneacute la base

mysql

la commande agrave exeacutecuter aurait eacuteteacute laquo

SELECTUserHost FROM mysqluser

raquo

(rootlocalhost) [mysql] mysqlgt SELECT UserHost FROM user

+--------+-----------+

| User | Host |

+--------+-----------+

| | |

| | localhost |

| root | localhost |

| soutou | localhost |

+--------+-----------+

Tableau 5-1 Creacuteation drsquoun utilisateur

Instruction SQL Reacutesultat

CREATE USER

soutoulocalhost IDENTIFIED BY iut

soutou

est deacuteclareacute laquo utilisateur agrave accegraves local raquo il devra se connecter agrave lrsquoaide de son mot de passe

4055_05_C05 Page 153 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

154

copy Eacuteditions Eyrolles

Vous devez posseacuteder une table similaire Il apparaicirct quatre accegraves potentiels Lrsquoutilisateur vide

correspond agrave une connexion anonyme La machine deacutesigneacutee par laquo

raquo indique que laconnexion est autoriseacutee agrave partir de tout site (en supposant qursquoun client MySQL est installeacute etqursquoil est relieacute au serveur par TCP-IP) La machine deacutesigneacutee par laquo

localhost

raquo speacutecifie quela connexion est autoriseacutee en local

Ici la table fait eacutetat que lrsquoaccegraves anonyme (restreint toutefois agrave la base

test

voir la section

Table

mysqldb

) est permis en local et agrave partir de tout site et que

soutou

comme

root

nepeuvent se connecter qursquoen local

Modification drsquoun utilisateur

Le mot de passe drsquoun utilisateur peut ecirctre modifieacute sans parler de privilegraveges Nous verrons plustard qursquoil est possible de restreindre le nombre de requecirctes (

SELECT

) de modifications(

UPDATE

) de connexions par heure et de connexions simultaneacutees agrave un serveur

Puisqursquoil nrsquoexiste pas de commande

ALTER USER

pour changer un mot de passe il faut doncmodifier la table

user

par la seule commande SQL capable de le faire

UPDATE

Lrsquoinstruction suivante modifie le mot de passe de lrsquoutilisateur

soutou

pour lrsquoaccegraves en localNotez lrsquoutilisation de la fonction

PASSWORD()

qui code le mot de passe agrave affecter agrave lacolonne

Password

de la table

user

Il est plus prudent drsquoutiliser ensuite

FLUSH PRIVI-LEGES

qui recharge les tables systegraveme de maniegravere agrave rendre la manipulation effective surlrsquoinstant (un peu comme un

COMMIT

sur des donneacutees)

UPDATE

mysqluser

WHERE User = soutou

AND Host = localhost

FLUSH

PRIVILEGES

Une fois cette modification reacutealiseacutee si soutou tente une connexion avec son ancien mot depasse il vient lrsquoerreur classique laquo ERROR 1045 (28000) Access denied for usersoutoulocalhost (using password xx) raquo (xx valant YES si soutou seconnecte avec son ancien mot de passe NO srsquoil nrsquoen donne pas)

Chaque utilisateur peut changer son propre mot de passe agrave lrsquoaide de cette instruction srsquoil en ale privilegravege Mais attention Le fait de lui donner ce droit (nous verrons plus loin comment lefaire) implique eacutegalement qursquoil puisse aussi modifier les mots de passe de ses copains ainsique celui du root

Renommer un utilisateur (RENAME USER)

Pour pouvoir renommer un utilisateur vous devez posseacuteder le privilegravege CREATE USER (ou leprivilegravege UPDATE sur la base de donneacutees mysql) La syntaxe SQL est la suivante

RENAME USER utilisateur TO nouveauNom

SET Password = PASSWORD(eyrolles)

4055_05_C05 Page 154 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 155

chapitre ndeg 5 Controcircle des donneacutees

Penser agrave speacutecifier lrsquoaccegraves complet agrave renommer (usermachine) Les privilegraveges et le mot depasse ne changent pas Le tableau suivant deacutecrit trois opeacuterations de renommage drsquoutilisateurs(qui reviennent drsquoailleurs agrave lrsquoeacutetat initial)

Suppression drsquoun utilisateur (DROP USER)

Pour pouvoir supprimer un utilisateur vous devez posseacuteder le privilegravege CREATE USER (ou leprivilegravege DELETE sur la base de donneacutees mysql) La syntaxe SQL est la suivante

DROP USER utilisateur [utilisateur2 ]

Il faut speacutecifier lrsquoaccegraves agrave eacuteliminer (usermachine) Tous les privilegraveges relatifs agrave cet accegravessont deacutetruits Si lrsquoutilisateur est connecteacute dans le mecircme temps sa suppression ne sera effectiveqursquoagrave la fin de sa (derniegravere) session

Aucune donneacutee drsquoaucune table que lrsquoutilisateur aura mis agrave jour durant toutes ses connexionsne sera supprimeacutee Il nrsquoy a pas de notion drsquoappartenance drsquoobjets (tables index proceacutedureetc) agrave un utilisateur Tout ceci est relatif agrave la base de donneacutees (database)

Pour supprimer le compte soutou en local la commande agrave lancer est

DROP USER

Gestion des bases de donneacutees

Abordeacutee briegravevement agrave lrsquointroduction une base de donneacutees (database) regroupe essentielle-ment des tables sur lesquelles lrsquoadministrateur affectera des autorisations agrave des utilisateursCette notion de database srsquoapparente plutocirct agrave celle de scheacutema (connu des utilisateursdrsquoOracle) Drsquoailleurs dans lrsquoinstruction de creacuteation les deux mots peuvent ecirctre utiliseacutes

Tableau 5-2 Renommer un utilisateur

Instruction SQL Commentaire

RENAME USER localhost TO localhost

Lrsquoaccegraves soutou en local est renommeacute christiansoutou en local

RENAME USER christiansoutoulocalhost TO christiansoutou

Lrsquoaccegraves christiansoutou en local est renommeacute christiansoutou en accegraves distant

RENAME USER TO

Lrsquoaccegraves est renommeacute complegravetement

soutouchristiansoutou

1945322712

christiansoutou1945322712soutoulocalhost

soutoulocalhost

4055_05_C05 Page 155 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

156 copy Eacuteditions Eyrolles

Creacuteation drsquoune base (CREATE DATABASE)

Pour pouvoir creacuteer une base de donneacutees vous devez posseacuteder le privilegravege CREATE sur lanouvelle base (ou au niveau global pour creacuteer toute table)CREATE DATABASE | SCHEMA [IF NOT EXISTS] nomBase

[ [DEFAULT] CHARACTER SET nomJeu ]

[ [DEFAULT] COLLATE nomCollation ]

IF NOT EXISTS eacutevite une erreur dans le cas ougrave la base de donneacutees existe deacutejagrave (auquelcas elle ne sera pas remplaceacutee)

nomBase deacutesigne le nom de la base (64 caractegraveres maximum caractegraveres compris par lesystegraveme de gestion de fichier du systegraveme drsquoexploitation notamment respectant les regraveglesde nommage des reacutepertoires) Les caractegraveres laquo raquo laquo raquo ou laquo raquo sont proscrits

CHARACTER SET indique le jeu de caractegraveres associeacute aux donneacutees qui reacutesideront dans lestables de la base

COLLATE deacutefinit la collation1 du jeu de caractegraveres en question La collation dans le jargoninformatique permet de deacutefinir la position des caractegraveres dans le jeu Par exemple il serapossible de diffeacuterencier laquo agrave raquo de laquo a raquo ou pas (sensibiliteacute diacritique) Le but eacutetant desrsquoadapter aux diffeacuterentes regravegles et langues de notre petite planegravete

Une fois creacuteeacutee vous constaterez lrsquoexistence drsquoun reacutepertoire portant le nom de votre nouvellebase (par deacutefaut sous CProgram FilesMySQLMySQL Server 5ndatanouvel-leBase dans le cas de Windows) Ce reacutepertoire contiendra les donneacutees des tables qui serontconstitueacutees dans la nouvelle base Si vous concevez manuellement un reacutepertoire (mkdir rep1par exemple) dans le reacutepertoire de data de MySQL rep1 sera consideacutereacute comme une base dedonneacutees avec le jeu de caractegraveres par deacutefaut (visible avec laquo SHOW DATABASES raquo)

Nrsquoeffacez pas le fichier dbopt qui stocke les caracteacuteristiques de la base Vous pouvezlrsquoouvrir avec un eacutediteur de texte pour connaicirctre le jeu de caractegraveres par deacutefaut que MySQLaffectera agrave vos bases en lrsquoabsence de clause CHARACTER SET Souhaitons que ce ne soit pasgb2312 associeacute par deacutefaut agrave la collation gb2312_chinese_ci qui vous ferait dire que jevous parle chinois Crsquoest pourtant quelquefois ce que je ressens quand mes eacutetudiants meregardent avec des yeux de poisson en utilisant le langage des carpeshellip

Le tableau suivant deacutecrit la creacuteation de deux bases de donneacutees

1 Action de comparer entre eux des textes des documents Petit Larousse

Tableau 5-3 Creacuteation de bases

Instruction SQL Reacutesultat

CREATE DATABASE bdnouvelle DEFAULT CHARACTER SET ascii COLLATE ascii_general_ci

La base bdnouvelle est creacuteeacutee le jeu de caractegraveres par deacutefaut est ASCII

CREATE DATABASE bdnouvelle2 DEFAULT CHARACTER SET gb2312

La base bdnouvelle2 est creacuteeacutee pour les Chinois

4055_05_C05 Page 156 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 157

chapitre ndeg 5 Controcircle des donneacutees

Le jeu de caractegraveres par deacutefaut est deacutefini dans myini agrave lrsquoaide de la variable default-character-set Il est donc possible de creacuteer des bases de donneacutees associeacutees agrave diffeacuterentsjeux de caractegraveres au sein drsquoun mecircme serveur Le jeu de caractegraveres drsquoune base deacutefinit celui destables qui seront constitueacutees dedans agrave moins que la table ne soit combineacutee agrave un autre jeu (creacuteeacuteavec la directive [DEFAULT] CHARACTER SET jeu [COLLATE nomCollation])

Notons enfin qursquoil est mecircme possible drsquoaffecter un jeu de caractegraveres agrave une colonne drsquounetable Lrsquoexemple suivant construit la table testChap5 dans la base bdnouvelle2 (pardeacutefaut chinoise) en speacutecifiant que la colonne col1 sera associeacutee au jeu cp850 DOS WestEuropean tandis que le reste de la table (pour lrsquoinstant de porteacutee col2) sera appliqueacute au jeulatin1 cp1252 West European Inseacuterons une ligne

CREATE TABLE bdnouvelle2testChap5

( col2 CHAR(4))

CHARACTER SET latin1

INSERT INTO bdnouvelle2testChap5 VALUES (GTRIUT)

Seacutelection drsquoune base de donneacutees (USE)

Ceux qui ont travailleacute sous Dbase se souviennent de lrsquoinstruction USE qui deacutesignait la tablecourante dans un programme Pour MySQL USE seacutelectionne une base de donneacutees qui devientactive dans une session

USE nomBase

Si vous deacutesirez travailler simultaneacutement dans diffeacuterentes bases de donneacutees faites toujourspreacutefixer le nom des tables par celui de la base par la notation pointeacutee (nomBasenomTable)

Lrsquoexemple suivant exeacutecute une jointure sur deux tables situeacutees dans deux bases distinctes

col CHAR(5) CHARACTER SET cp850

Tableau 5-4 Seacutelection de bases

Instruction SQL Reacutesultat

CREATE TABLE bdnouvelletestUSE (col3 CHAR(5) col4 CHAR(4)) CHARACTER SET latin1INSERT INTO bdnouvelletestUSE VALUES (ACTMPIUT)

Creacuteation drsquoune table dans la base

Insertion drsquoune ligne

USE bdnouvelle2 Seacutelection de la base bdnouvelle2

SELECT col col3 FROM testChap5 WHERE col2 = col4+------+-------+| col | col3 |+------+-------+| GTR | ACTMP |+------+-------+

Jointure de la table testChap5 situeacutee dans la base active (bdnouvelle2) avec testUSE situeacutee dans la base bdnouvelle

bdnouvelletestUSEbdnouvelletestUSEbdnouvelletestUSE

4055_05_C05 Page 157 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

158 copy Eacuteditions Eyrolles

Modification drsquoune base (ALTER DATABASE)

ALTER DATABASE vous permet de modifier le jeu de caractegraveres par deacutefaut drsquoune base dedonneacutees Pour pouvoir changer ainsi une base vous devez avoir le privilegravege ALTER sur la basede donneacutees en question

ALTER DATABASE nomBase

[ [DEFAULT] CHARACTER SET nomJeu ]

[ [DEFAULT] COLLATE nomCollation ]

Lrsquoinstruction suivante modifie la base laquo chinoise raquo en lui affectant le jeu de caractegraveres de typeDOS

ALTER DATABASE bdnouvelle2

Suppression drsquoune base (DROP DATABASE)

Pour pouvoir supprimer une base de donneacutees vous devez posseacuteder le privilegravege DROP sur labase (ou au niveau global pour effacer toute base) Cette commande deacutetruit tous les objets(tables index etc) et le reacutepertoire contenus dans la base

DROP DATABASE | SCHEMA [IF EXISTS] nomBase

IF EXISTS eacutevite une erreur dans le cas ougrave la base de donneacutees nrsquoexisterait pas

Cette instruction retourne le nombre de tables qui on eacuteteacute supprimeacutees (fichiers agrave lrsquoextensionlaquo frm raquo)

Disons agrave preacutesent adios agrave la base laquo chinoise raquo

DROP DATABASE bdnouvelle2

Privilegraveges

Depuis le deacutebut du livre nous avons parleacute de privilegraveges Il est temps agrave preacutesent de preacuteciser ceque recouvre ce terme Un privilegravege (sous-entendu utilisateur) est un droit drsquoexeacutecuter unecertaine instruction SQL (on parle de privilegravege systegraveme) ou un droit relatif aux donneacutees destables situeacutees dans diffeacuterentes bases (on parle de privilegravege objet) La connexion par exemplesera consideacutereacutee comme un privilegravege systegraveme bien que nrsquoeacutetant pas une commande SQL

Les privilegraveges systegraveme diffegraverent sensiblement drsquoun SGBD agrave un autre Chez Oracle il y en aplus drsquoune centaine MySQL est plus modeste en nrsquoen proposant qursquoune vingtaine En revan-che on retrouvera les mecircmes privilegraveges objet (exemple autorisation de modifier la colonnenomComp de la table Compagnie) qui sont attribueacutes ou retireacutes par les instructions GRANT etREVOKE

DEFAULT CHARACTER SET cp850

4055_05_C05 Page 158 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 159

chapitre ndeg 5 Controcircle des donneacutees

Niveaux de privilegraveges

La figure suivante illustre les diffeacuterents niveaux de privilegraveges que lrsquoon peut rencontrer

Global level privilegraveges srsquoappliquant agrave toutes les bases du serveur Ces privilegraveges sontstockeacutes dans la table mysqluser (exemple drsquoattribution drsquoun privilegravege global GRANTCREATE hellip)

Database level privilegraveges srsquoappliquant agrave tous les objets drsquoune base de donneacutees en particu-lier Ces privilegraveges sont stockeacutes dans les tables mysqldb et mysqlhost (exempledrsquoattribution drsquoun privilegravege database GRANT SELECT hellip)

Table level privilegraveges srsquoappliquant agrave la globaliteacute drsquoune table drsquoune base de donneacutees enparticulier Ces privilegraveges sont stockeacutes dans la table mysqltables_priv (exempledrsquoattribution drsquoun privilegravege table GRANT INSERT hellip)

Column level privilegraveges srsquoappliquant agrave une des colonnes drsquoune table drsquoune base dedonneacutees en particulier Ces privilegraveges sont stockeacutes dans la table mysqlcolumns_priv(exemple drsquoattribution drsquoun privilegravege column GRANT UPDATE( )ON

hellip)

Routine level privilegraveges globaux ou au niveau drsquoune base (CREATE ROUTINE ALTERROUTINE EXECUTE et GRANT) srsquoappliquant aux proceacutedures catalogueacutees (eacutetudieacutees auchapitre 7) Ces privilegraveges sont stockeacutes dans la table mysqlprocs_priv de la basemysql (exemple drsquoattribution drsquoun privilegravege routine GRANT EXECUTE ON

hellip)

Tables de la base mysqlCinq tables de la base de donneacutees mysql suffisent agrave MySQL pour stocker les privilegraveges(systegraveme et objet) de tous les utilisateurs La figure suivante illustre comment MySQL deacuteduittoutes ces preacuterogatives toujours en fonction des accegraves (couple utilisateur machine)

Figure 5-2 Niveaux de privilegraveges

Jules Paul

mysql test

information_schema

bdjules bdpaul

Routine level

Global level

Database level

Table level

Column level

ON

ON bdpaul

ON bdpaulAvion

nomCompbdpaulCompagnie

PROCEDUREbdpaulsp1

4055_05_C05 Page 159 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

160 copy Eacuteditions Eyrolles

La colonne Db est en plus dans les tables host tables_priv et columns_priv car elle estneacutecessaire pour deacutesigner la base de donneacutees sur laquelle portera le droit ou la famille de droits

Supposons pour nos exemples que lrsquoutilisateur Paul (accegraves en local) et la base de donneacuteesbdpaul soient creacuteeacutes

CREATE DATABASE bdpaul

CREATE USER Paullocalhost IDENTIFIED BY iut

Table mysqluserPreacutesenteacute briegravevement au deacutebut du chapitre Cette table est composeacutee de 37 colonnes qui deacutecriventles privilegraveges au niveau global du serveur Nous deacutetaillons ici la signification des principales

Privilegraveges objet (LMD) sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives de Paul (et des autres) Pour lrsquoinstant le caractegravereN eacutetant dans toutes les colonnes il ne peut ni interroger une table (Select_priv) ni inseacute-rer dans une table (Insert_priv) ni en modifier (Update_priv) ni en supprimer(Delete_priv) et ce quelle que soit la base de donneacutees (excepteacute les bases systegraveme test etinformation_schema) sur laquelle il voudra se connecterSELECT Host User FROM mysqluser+-----------+------+-------------+-------------+-------------+-------------+| Host | User | Select_priv | Insert_priv | Update_priv | Delete_priv |+-----------+------+-------------+-------------+-------------+-------------+| localhost | root | Y | Y | Y | Y || localhost | | Y | Y | Y | Y || | | N | N | N | N || |+-----------+------+-------------+-------------+-------------+-------------+

Figure 5-3 Stockage des preacuterogatives

Table user db host tables_priv columns_priv procs_priv+----------- +------+------------- +-------- +-------- +------------- +------

| Host | User | hellip | droit1 | droit2 | familledroit1 | hellip

+----------- +------+----------- --+-------- +-------- +---------- -----+----

| localhost | root | | Y | Y | Y | hellip

| hellip | | | | | |

| hellip | | | | | |

| localhost | Paul | | N | Y | N | hellip

+----------- +------+------------- +-------- +-------- +------------ ---+----

Paul possegravede le privilegravege droit2sur une base table objet Paul

root possegravede tous les privilegraveges sur une base table objet

root

Select_priv Insert_priv Update_priv Delete_priv

localhost | Paul | N | N | N | N

4055_05_C05 Page 160 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 161

chapitre ndeg 5 Controcircle des donneacutees

Vous pouvez par analogie pour cet exemple et pour les suivants deacutecouvrir les preacuterogativesdes autres accegraves (ici root et anonyme)

Privilegraveges objet (LDD) sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des instructions LDD Pour lrsquoinstant lecaractegravere N eacutetant dans toutes les colonnes Paul ne peut ni creacuteer une table ou une base(Create_priv) ni en supprimer (Drop_priv) ni creacuteer ou supprimer un index (Index_priv) ni modifier la structure drsquoune table la renommer ou modifier une base (Alter_priv) et ce quelle que soit la base de donneacutees (excepteacute les bases systegraveme test etinformation_schema)

SELECT Host User FROM mysqluser+-----------+------+-------------+-----------+------------+------------+| Host | User | Create_priv | Drop_priv | Index_priv | Alter_priv |+-----------+------+-------------+-----------+------------+------------+| localhost | root | Y | Y | Y | Y || localhost | | Y | Y | Y | Y || | | N | N | N | N || |+-----------+------+-------------+-----------+------------+------------+

Privilegraveges systegraveme (LCD) sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des instructions LCD Pour lrsquoinstant lecaractegravere N eacutetant dans toutes les colonnes Paul ne peut ni creacuteer un utilisateur (Create_user_priv) ni transmettre des droits qursquoil aura lui-mecircme reccedilus (Grant_priv) ni lister lesbases de donneacutees existantes (Show_db_priv) et ce quelle que soit la base de donneacutees

SELECT HostUser FROM mysqluser+-----------+------+------------------+------------+--------------+| Host | User | Create_user_priv | Grant_priv | Show_db_priv |+-----------+------+------------------+------------+--------------+| localhost | root | Y | Y | Y || localhost | | N | Y | Y || | | N | N | N || |+-----------+------+------------------+------------+--------------+

Privilegraveges agrave propos des vues sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des instructions relatives aux vues (viewsdeacutetailleacutees dans la section suivante) Pour lrsquoinstant le caractegravere N eacutetant dans toutes lescolonnes Paul ne peut ni creacuteer une vue (Create_view_priv) ni lister les vues existantes(Show_view_priv) et ce quelle que soit la base de donneacutees

Create_priv Drop_privIndex_priv Alter_priv

localhost | Paul | N | N | N | N

Create_user_priv Grant_priv Show_db_priv

localhost | Paul | N | N | N

4055_05_C05 Page 161 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

162 copy Eacuteditions Eyrolles

SELECT HostUser FROM mysqluser

+-----------+------+------------------+----------------+

| Host | User | Create_view_priv | Show_view_priv |

+-----------+------+------------------+----------------+

| localhost | root | Y | Y |

| localhost | | N | N |

| | | N | N |

| localhost | Paul | N | N |

+-----------+------+------------------+----------------+

Privilegraveges agrave propos des proceacutedures catalogueacutees sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des proceacutedures catalogueacutees (deacutetailleacuteesdans le chapitre 7) Pour lrsquoinstant le caractegravere N eacutetant dans toutes les colonnes Paul nepeut ni creacuteer une proceacutedure (Create_routine_priv) ni en modifier (Alter_routine_priv) ni en exeacutecuter (Execute_priv) et ce quelle que soit la base de donneacuteesSELECT HostUser FROM mysqluser+-----------+------+---------------------+--------------------+--------------+| Host | User | Create_routine_priv | Alter_routine_priv | Execute_priv |+-----------+------+---------------------+--------------------+--------------+| localhost | root | Y | Y | Y || localhost | | N | N | Y || | | N | N | N || localhost | Paul | N | N | N |+-----------+------+---------------------+--------------------+--------------+

Privilegraveges agrave propos des restrictions drsquoutilisateur

La requecircte suivante extrait les preacuterogatives agrave propos des restrictions qursquoon peut deacutefinir paraccegraves Pour lrsquoinstant le chiffre eacutetant agrave 0 dans toutes les colonnes aucun accegraves (utilisateur)nrsquoest limiteacute concernant le nombre de requecirctes (max_questions) de modifications (max_updates) de connexions par heure (max_connections) et de connexions simultaneacutees(max_user_connections) agrave un serveur

SELECT Host User Requetes Modifs

Connexions Cx simult FROM mysqluser+-----------+------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+------+----------+--------+------------+------------+| localhost | root | 0 | 0 | 0 | 0 || localhost | | 0 | 0 | 0 | 0 || | | 0 | 0 | 0 | 0 || localhost | Paul | 0 | 0 | 0 | 0 |+-----------+------+----------+--------+------------+------------+

Create_view_priv Show_view_priv

Create_routine_priv Alter_routine_priv Execute_priv

max_questions max_updates

max_connections max_user_connections

4055_05_C05 Page 162 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 163

chapitre ndeg 5 Controcircle des donneacutees

Privilegraveges non abordeacutes

Drsquoautres colonnes de la table mysqluser sont inteacuteressantes mais sortent un peu du cadrede ce livre Jrsquoai donc fait lrsquoimpasse sur Create_tmp_table_priv (sert agrave creacuteer des tablestemporaires) Lock_tables_priv (pose des verrous explicites) Shutdown_priv (arrecircteet redeacutemarre le serveur) Process_priv et Super_priv (gegraverent les processus) File_priv (accegravede aux fichiers du systegraveme drsquoexploitation) Repl_slave_priv et Repl_client_priv (utiliseacutes pour des aspects de reacuteplication de donneacutees)

Nul doute que vous saurez vous servir de ces privilegraveges en temps voulu par analogie avecceux que nous allons eacutetudier

Le privilegravege References_priv nrsquoest pas opeacuterationnel encore Il permettrait de beacuteneacuteficier delrsquointeacutegriteacute reacutefeacuterentielle entre deux tables appartenant agrave deux bases distinctes (par exemple latable Avion dans bd1 ferait reacutefeacuterence par cleacute eacutetrangegravere agrave la table Compagnie dans bd2)

Avant de preacutesenter les autres tables (db host tables_priv columns_priv et procs_priv) de la base mysql eacutetudions les intructions relatives agrave lrsquoattribution drsquoun privilegravege(GRANT) qursquoil soit systegraveme ou objet et celles relatives agrave la reacutevocation drsquoun privilegravege (REVOKE)

Attribution de privilegraveges (GRANT)

La figure suivante illustre le contexte qui va servir drsquoexemple agrave lrsquoattibution de preacuterogatives

Syntaxe

Lrsquoinstruction GRANT permet drsquoattribuer un (ou plusieurs) privilegravege(s) agrave propos drsquoun objet agrave un(ou plusieurs) beacuteneacuteficiaire(s) Lrsquoutilisateur qui exeacutecute cette commande doit avoir reccedilu lui-mecircme le droit de transmettre ces privilegraveges (reccedilu avec la directive GRANT OPTION) Dans lecas de root aucun problegraveme car il a implicitement tous les droits

Figure 5-4 Attribution de privilegraveges

mysql test

information_schema

bdjules bdpaul

sp1() sp2()

PaulJules

Livre

CREATE

Restrictions de connexion SELECT(titre) INSERT - UPDATE(ISBN)

DELETE - SELECTCREATEDROP

Execute sp1() sp2() Modif sp1()

4055_05_C05 Page 163 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

164 copy Eacuteditions Eyrolles

GRANT privilegravege [ (col1 [ col2])] [privilegravege2 ]

ON [ TABLE | FUNCTION | PROCEDURE ]

nomTable | | | nomBase

TO utilisateur [IDENTIFIED BY [PASSWORD] password]

[utilisateur2 ]

[ WITH [ GRANT OPTION ]

[ MAX_QUERIES_PER_HOUR nb ]

[ MAX_UPDATES_PER_HOUR nb2 ]

[ MAX_CONNECTIONS_PER_HOUR nb3 ]

[ MAX_USER_CONNECTIONS nb4 ] ]

privilegravege description du privilegravege (ex SELECT DELETE etc) voir le tableau suivant

col preacutecise la ou les colonnes sur lesquelles se portent les privilegraveges SELECT INSERT ouUPDATE (exemple UPDATE(typeAvion) pour nrsquoautoriser que la modification de lacolonne typeAvion)

GRANT OPTION permet de donner le droit de retransmettre les privilegraveges reccedilus agrave unetierce personne

Le tableau suivant reacutesume la signification des principaux privilegraveges agrave accorder ou agrave reacutevoquer

Tableau 5-5 Privilegraveges principaux pour GRANT et REVOKE

privilege Commentaire

ALL [PRIVILEGES] Tous les privilegraveges

ALTER Modification de basetable

ALTER ROUTINE Modification de proceacutedure

CREATE Creacuteation de basetable

CREATE ROUTINE Creacuteation de proceacutedure

CREATE USER Creacuteation drsquoutilisateur

CREATE VIEW Creacuteation de vue

DELETE Suppression de donneacutees de table

DROP Suppression de basetable

EXECUTE Exeacutecution de proceacutedure

INDEX CreacuteationSuppression drsquoindex

INSERT Insertion de donneacutees de table

SELECT Extraction de donneacutees de table

SHOW DATABASES Lister les bases

SHOW VIEW Lister les vues drsquoune base

SUPER Gestion des deacuteclencheurs

UPDATE Modification de donneacutees de table

USAGE Synonyme de laquo sans privilegravege raquo USAGE est utiliseacute pour conserver les privilegraveges preacuteceacutedemment deacutefinis tout en les restreignant avec des options

4055_05_C05 Page 164 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 165

chapitre ndeg 5 Controcircle des donneacutees

Exemples

Le tableau suivant deacutecrit lrsquoaffectation de quelques privilegraveges en donnant les explications asso-cieacutees

Tout ce que vous avez le droit de faire doit ecirctre explicitement autoriseacute par la commande GRANTCe qui nrsquoest pas dit par GRANT nrsquoest pas permis Par exemple Jules peut creacuteer des bases maispas en deacutetuire Paul peut modifier le numeacutero ISBN drsquoun livre mais pas son titre etc

Voir les privilegraveges

La commande SHOW GRANTS FOR liste les diffeacuterentes instructions GRANT eacutequivalentes agrave toutesles preacuterogatives drsquoun utilisateur donneacute Crsquoest bien utile quand vous avez attribueacute un certain nombrede privilegraveges agrave un utilisateur sans avoir penseacute agrave les consigner dans un fichier de commande

SHOW GRANTS FOR utilisateur

Tableau 5-6 Affectation de privilegraveges

Instruction faite par root Explication

GRANT CREATE DROP ON TO

Privilegravege systegraveme database level

Paul (en accegraves local) peut creacuteer ousupprimer des tables dans la base bdpaul

GRANT INSERT SELECT DELETE UPDATE(ISBN) ON TO

Privilegravege objet table level

Paul peut inseacuterer extraire supprimer etmodifier la colonne ISBN de la table Livrecontenue dans la base bdpaul

GRANT ALTER ON TO

Privilegravege systegraveme table level

Paul peut modifier la structure ou lescontraintes de la table Livre contenuedans la base bdpaul

GRANT SELECT(titre) ON TO WITH GRANT OPTION

Privilegravege objet column level

Jules peut extraire seulement la colonnetitre de la table Livre contenue dans labase bdpaul Il pourra par la suiteretransmettre eacuteventuellement ce droit

GRANT CREATE ON TO

Privilegravege systegraveme global level

Jules peut creacuteer des bases de donneacutees

GRANT USAGE ON TO WITH MAX_QUERIES_PER_HOUR 50 MAX_UPDATES_PER_HOUR 20 MAX_CONNECTIONS_PER_HOUR 6 MAX_USER_CONNECTIONS 3

Privilegravege systegraveme database level

Jules ne peut lancer chaque heure que50 SELECT 20 UPDATE se connecter 6 fois(dont 3 connexions simultaneacutees) sur la basede donneacutees bdpaul

bdpaulPaullocalhost

bdpaulLivrePaullocalhost

bdpaulLivrePaullocalhost

bdpaulLivreJuleslocalhost

Juleslocalhost

bdpaulJuleslocalhost

4055_05_C05 Page 165 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

166 copy Eacuteditions Eyrolles

Utilisons cette commande pour extraire les profils de Jules de Paul et de lrsquoadministrateuren chef (accegraves en local) Jrsquoavoue avoir un peu retravailleacute lrsquoeacutetat de sortie (sans en modifier uneligne quand mecircme)

SHOW GRANTS FOR Juleslocalhost+---------------------------------------------------------------------------+| Grants for Juleslocalhost |+---------------------------------------------------------------------------+| GRANT CREATE ON TO Juleslocalhost IDENTIFIED BY PASSWORD 6AE163FB9EE8BB011EB2E87316AA5BE563A6CDB7 WITH MAX_QUERIES_PER_HOUR 50 MAX_UPDATES_PER_HOUR 20 MAX_CONNECTIONS_PER_HOUR 6 MAX_USER_CONNECTIONS 3 || GRANT SELECT (titre) ON `bdpaul``Livre` TO Juleslocalhost WITH GRANT OPTION |+---------------------------------------------------------------------------+

On remarque que MySQL a regroupeacute deux privilegraveges en une instruction GRANT (CREATE etles restrictions de connexions) Par lagrave mecircme on se rend compte que les preacuterogatives deconnexion sont au niveau global bien qursquoon les ait speacutecifieacutees au niveau database

SHOW GRANTS FOR Paullocalhost+---------------------------------------------------------------------------+| Grants for Paullocalhost |+---------------------------------------------------------------------------+| GRANT USAGE ON TO Paullocalhost IDENTIFIED BY PASSWORD 6AE163FB9EE8BB011EB2E87316AA5BE563A6CDB7 || GRANT CREATE DROP ON `bdpaul` TO Paullocalhost || GRANT SELECT INSERT UPDATE (ISBN) DELETE ALTER ON `bdpaul``Livre` TO Paullocalhost |+---------------------------------------------------------------------------+

On remarque que MySQL a regroupeacute tous les privilegraveges sur la table Livre en une instructionGRANT La premiegravere exprime le fait que Paul peut se connecter agrave toutes les bases (par USEnomBase) mais qursquoil ne pourra travailler en reacutealiteacute que dans bdpaul

SHOW GRANTS FOR rootlocalhost+---------------------------------------------------------------------------+| Grants for rootlocalhost |+---------------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON TO rootlocalhost IDENTIFIED BY PASSWORD 387E25FE2CF7ED941E43A76AD9402825401698FC WITH GRANT OPTION |+---------------------------------------------------------------------------+

On remarque que MySQL nrsquoattribue qursquoun seul droit mais le plus fort Tous les droits (ALLPRIVILEGES) sur toutes les bases () avec en prime la clause GRANT OPTION quipermet de retransmettre nrsquoimporte quoi agrave nrsquoimporte qui ou de tout reacutevoquer

Interrogeons agrave nouveau la table user de la base mysql stockant les preacuterogatives au niveauglobal du moment Le droit de creacuteation en local de Jules apparaicirct sur toutes les bases

4055_05_C05 Page 166 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 167

chapitre ndeg 5 Controcircle des donneacutees

SELECT HostUser Create_privDrop_privIndex_privAlter_priv FROM mysqluser+-----------+-------+-------------+-----------+------------+------------+| Host | User | Create_priv | Drop_priv | Index_priv | Alter_priv |+-----------+-------+-------------+-----------+------------+------------+| hellip| localhost | Paul | N | N | N | N || | N | N | N |+-----------+-------+-------------+-----------+------------+------------+

Les colonnes suivantes permettent de stocker les restrictions sur les connexions

SELECT HostUser max_questions Requetes max_updates Modifs max_connections Connexions max_user_connections Cx simult FROM mysqluser+-----------+-------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+-------+----------+--------+------------+------------+| hellip| localhost | Paul | 0 | 0 | 0 | 0 || |+-----------+-------+----------+--------+------------+------------+

Analysons les autres tables de la base mysql pour deacutecouvrir les preacuterogatives des autresniveaux (database table column et routine)

Table mysqldbLa table mysqldb deacutecrit les preacuterogatives au niveau database Ainsi la colonne Db indique labase de donneacutees

SELECT Host User Db Create_priv Drop_priv Alter_priv FROM mysqldb+-----------+------+---------+-------------+-----------+------------+| Host | User | Db | Create_priv | Drop_priv | Alter_priv |+-----------+------+---------+-------------+-----------+------------+| | | test_ | Y | Y | Y || | | test | Y | Y | Y || |+-----------+------+---------+-------------+-----------+------------+

Notez la possibiliteacute de Paul avec lrsquoaccegraves local de creacuteeacuter et de supprimer des tables dans labase bdpaul Notez eacutegalement la possibiliteacute de creacuteer de supprimer de modifier des tablespar un accegraves distant anonyme sur la base test

Table mysqlhostCette table est eacutetudieacutee agrave la section Accegraves distants

localhost | Jules | Y

localhost | Jules | 50 | 20 | 6 | 3

localhost | Paul | bdpaul | Y | Y | N

4055_05_C05 Page 167 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

168 copy Eacuteditions Eyrolles

Table mysqltables_privLa table mysqltables_priv deacutecrit les preacuterogatives objet au niveau table Ainsi lacolonne Table_name indique la table concerneacutee la colonne Grantor preacutecise lrsquoutilisateurayant donneacute le droit La colonne Table_priv est un SET contenant la liste des droits delrsquoutilisateur sur la table

SELECT CONCAT(UserHost) Compte CONCAT(DbTable_name) Objet Grantor Table_priv FROM mysqltables_priv+-----------------+--------------+----------------+---------------------------+| Compte | Objet | Grantor | Table_priv |+-----------------+--------------+----------------+---------------------------+| Juleslocalhost | bdpaulLivre | rootlocalhost | Grant || Paullocalhost | bdpaulLivre | rootlocalhost | SelectInsertDeleteAlter|+-----------------+--------------+----------------+---------------------------+

On retrouve les quatre privilegraveges de Paul et celui de Jules (GRANT OPTION de SELECTsur la table)

Cette table possegravede aussi une colonne de nom Timestamp stockant lrsquoinstant au cours duquelsrsquoest deacuterouleacutee lrsquoattribution (ou la reacutevocation)

Table mysqlcolumns_privLa table mysqlcolumns_priv deacutecrit les preacuterogatives objet au niveau column Ainsi lacolonne Table_name indique la table concerneacutee la colonne Column_name preacutecise lacolonne concerneacutee par le droit La colonne Column_priv est un SET contenant la liste desdroits de lrsquoutilisateur sur la colonne de la table

SELECT CONCAT(UserHost) Compte CONCAT(DbTable_name) Objet Column_name Column_priv FROM mysqlcolumns_priv+-----------------+--------------+-------------+-------------+| Compte | Objet | Column_name | Column_priv |+-----------------+--------------+-------------+-------------+| Juleslocalhost | bdpaulLivre | titre | Select || Paullocalhost | bdpaulLivre | ISBN | Update |+-----------------+--------------+-------------+-------------+

On retrouve le privilegravege de Paul et celui de Jules (portant ici sur la mecircme table)

Table mysqlprocs_privLa table mysqlprocs_priv deacutecrit les preacuterogatives des proceacutedures et des fonctionscatalogueacutees au niveau routine

4055_05_C05 Page 168 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 169

chapitre ndeg 5 Controcircle des donneacutees

Les privilegraveges CREATE ROUTINE ALTER ROUTINE EXECUTE et GRANT srsquoappliquent surles sous-programmes catalogueacutes et peuvent ecirctre attribueacutes au niveau global et database ALTERROUTINE EXECUTE et GRANT peuvent ecirctre assigneacutes aussi au niveau routine

En supposant que la base bdpaul contient la proceacutedure catalogueacutee sp1() et la fonctionsp2() toutes deux eacutecrites par root le tableau suivant exprime lrsquoaffectation de quelquesprivilegraveges en donnant les explications associeacutees

La colonne Routine_name de la table mysqlprocs_priv deacutesigne le nom du sous-programme catalogueacute La colonne Routine_type preacutecise le type du sous-programme cata-logueacute (fonction ou proceacutedure) La colonne Grantor indique lrsquoutilisateur ayant compileacute lesous-programme La colonne Proc_priv est un SET contenant la liste des droits de lrsquoutilisa-teur sur le sous-programme de la base

Extrayons les privilegraveges relatifs aux sous-programmes au niveau database

SELECT CONCAT(UserHost) Compte Db Create_routine_priv create routine Alter_routine_priv alter routine Execute_priv exec routine FROM mysqldb+----------------+---------+----------------+---------------+---------------+| Compte | Db | create routine | alter routine | exec routine |+----------------+---------+----------------+---------------+---------------+| | test_ | N | N | N || | test | N | N | N || | N | N |+----------------+---------+----------------+---------------+---------------+

On retrouve le privilegravege de Paul Extrayons enfin les privilegraveges relatifs aux sous-programmesau niveau routine

Tableau 5-7 Affectation de privilegraveges

Instruction faite par root Explication

GRANT CREATE ROUTINE ON TO Paullocalhost

Privilegravege systegraveme database level

Paul (en accegraves local) peut creacuteer ou supprimerdes sous-programmes catalogueacutes dans la basebdpaul

GRANT ALTER ROUTINE ON TO Paullocalhost

Privilegravege systegraveme routine level

Paul peut modifier la proceacutedure sp1 contenuedans la base bdpaul

GRANT EXECUTE ON TO Juleslocalhost

GRANT EXECUTE ON TO Juleslocalhost

Privilegraveges systegraveme routine level

Jules peut exeacutecuter la proceacutedure sp1 et lafonction sp2 contenues dans la base bdpaul

bdpaul

PROCEDURE bdpaulsp1

PROCEDURE bdpaulsp1

FUNCTION bdpaulsp2

Paullocalhost | bdpaul | Y

4055_05_C05 Page 169 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

170 copy Eacuteditions Eyrolles

SELECT CONCAT(UserHost) Compte CONCAT(Routine_nameRoutine_type) Objet Grantor Proc_priv FROM mysqlprocs_priv+-----------------+----------------------+----------------+---------------+| Compte | Objet | Grantor | Proc_priv |+-----------------+----------------------+----------------+---------------+| Juleslocalhost | bdpaulsp1PROCEDURE | rootlocalhost | Execute || Juleslocalhost | bdpaulsp2FUNCTION | rootlocalhost | Execute || Paullocalhost | bdpaulsp1PROCEDURE | rootlocalhost | Alter Routine |+-----------------+----------------------+----------------+---------------+

On retrouve le privilegravege en modification de sp1 pour Paul et les deux privilegraveges drsquoexeacutecutionde Jules

Reacutevocation de privilegraveges (REVOKE)

La reacutevocation drsquoun ou de plusieurs privilegraveges est reacutealiseacutee par lrsquoinstruction REVOKE Pourpouvoir reacutevoquer un privilegravege vous devez deacutetenir (avoir reccedilu) au preacutealable ce mecircme privilegravegeavec lrsquooption WITH GRANT OPTION

Syntaxe

Dans la syntaxe suivante les options sont les mecircmes que pour la commande GRANT

REVOKE privilegravege [ (col1 [ col2])] [privilegravege2 ]

ON [ TABLE | FUNCTION | PROCEDURE ]

nomTable | | | nomBase

FROM utilisateur [utilisateur2 ]

Exemples

Le tableau suivant deacutecrit la reacutevocation de certains privilegraveges acquis des utilisateurs Paul et Jules

Tableau 5-8 Reacutevocation de privilegraveges

Instruction faite par root Explication

REVOKE CREATE ON FROM

Privilegravege systegraveme database level

Paul (en accegraves local) ne peut plus creacuteer de tables dansla base bdpaul

REVOKE ALTERINSERTUPDATE(ISBN) ON FROM

Privilegravege objet table level

Paul ne peut plus modifier la structure (ou lescontraintes) inseacuterer et modifier la colonne ISBN de latable Livre contenue dans la base bdpaul

GRANT USAGE ON bdpaul TO WITH MAX_QUERIES_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0

Privilegravege systegraveme database level

Jules nrsquoest plus limiteacute en requecirctes SELECT et UPDATEsur la base de donneacutees bdpaul Ici crsquoest un GRANT qursquoilfaut faire car il srsquoagit plus drsquoune restriction de connexionque drsquoune instruction SQL

bdpaulPaullocalhost

bdpaulLivrePaullocalhost

Juleslocalhost

4055_05_C05 Page 170 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 171

chapitre ndeg 5 Controcircle des donneacutees

Veacuterifications

Une fois ces actualisations reacutealiseacutees les cinq tables de la base mysql contiennent un peu plusle caractegravere N qursquoauparavant Les colonnes SET des tables mysqltables_privmysqlcolumns_priv et mysqlprocs_priv sont eacutegalement mises agrave jour Ainsilrsquoextraction du profil actuel de Paul au niveau table fait apparaicirctre les deux seuls droits qursquoillui reste

SELECT CONCAT(UserHost) CompteCONCAT(DbTable_name)

Objet

Grantor Table_priv FROM mysqltables_priv

WHERE User=Paul AND Host=localhost

+----------------+--------------+----------------+---------------+

| Compte | Objet | Grantor | Table_priv |

+----------------+--------------+----------------+---------------+

| Paullocalhost | bdpaulLivre | rootlocalhost | SelectDelete |

+----------------+--------------+----------------+---------------+

Lrsquoextraction du profil actuel de Jules au niveau database fait apparaicirctre que les deux limita-tions de connexion sur les SELECT et UPDATE ont disparu

SELECT HostUser max_questions Requetes max_updates Modifs max_connections Connexions max_user_connections Cx simult FROM mysqluser WHERE User=Jules AND Host=localhost+-----------+-------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+-------+----------+--------+------------+------------+| localhost | Jules | | 6 | 3 |+-----------+-------+----------+--------+------------+------------+

Tout en une fois

Il existe une instruction qui reacutevoque tous les droits en une fois Vous en avez assez drsquoun utili-sateur qui ne cesse de vous casser les pieds utilisez REVOKE ALL PRIVILEGES Pensezquand mecircme agrave sauvegarder au preacutealable le profil de Jules (SHOW GRANT FOR) pourpouvoir le faire travailler de nouveau quand vous serez calmeacute

Selon la documentation officielle la syntaxe suivante permet de supprimer toutes les preacuteroga-tives aux niveaux global database table et column Et les privilegraveges routine me direz-vous Ils ont ducirc lrsquooublier dans la documentation mais ils sont aussi effaceacutes ne vous inquieacutetez pas jelrsquoai testeacute

REVOKE ALL PRIVILEGES GRANT OPTION FROM utilisateur [ utilisateur2 ]

Pour pouvoir annihiler ainsi un utilisateur il faut deacutetenir le privilegravege CREATE USER au niveauglobal ou le privilegravege UPDATE au niveau database sur la base mysql

0 | 0

4055_05_C05 Page 171 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

172 copy Eacuteditions Eyrolles

Ne confondez pas suppression de tous les droits drsquoun accegraves et suppression de lrsquoutilisateur Paranalogie les politiciens qui se voient retirer le droit de vote ne sont pas encore guillotineacutes (queje sache) Eacutenervons-nous contre Jules

REVOKE ALL PRIVILEGES GRANT OPTION FROM Juleslocalhost

Attributions et reacutevocations laquo sauvages raquo

Le caractegravere open de MySQL fait des fois bien les choses mais dans ce cas preacutecis je netrouve pas Ici mon billet drsquohumeur conteste la possibiliteacute qui est donneacutee de modifier lescinq tables de la base mysql pour affecter tantocirct un N par-ci tantocirct un Y par-lagrave ou encorepour mettre agrave jour un SET contenant SELECT par exemple etc Bref un UPDATE rateacute unINSERT dans la mauvaise colonne un DELETE sans WHERE et vous mettez une panique noire(comme la couleur par deacutefaut de lrsquointerface de commande) dans vos bases Vous pouvez vous-mecircme empecirccher toute connexion (mecircme celle du root)

Sous Oracle les commandes GRANT et REVOKE mettent agrave jour des tables systegraveme que vouspouvez interroger mais que vous ne pouvez pas modifier Crsquoest heureux

En conclusion je ne deacutecrirai aucune de ces manipulations drsquoabord parce que je nrsquoai pas enviede me tromper en faisant des tests et bouleverser ainsi inutilement ma configuration Ensuiteparce si vous voulez laquo bidouiller raquo allez consulter des sites Web ou drsquoautres ouvrages quirecopient la documentation sans quelquefois changer ni tester les exemples vous mrsquoen direzdes nouvelles

Vous voulez donner des droits utilisez GRANT les reprendre utilisez REVOKE car

bull Ils sont programmeacutes preacuteciseacutement pour ccedila

bull Les deux instructions sont dans la norme SQL

Ne pas les employer crsquoest comme acheter une quatre cylindres chez BMW (le motoriste estspeacutecialiste des six en ligne) et verser en cachette du colza dans le reacuteservoir chez lrsquoagriculteurdu coin en croyant eacuteconomiser

La seule utilisation acceptable parce qursquoon nrsquoa pas le choix de faire autrement concerne lamise agrave jour de la table mysqlhost (deacutecrite dans la section suivante) Agrave configuration avan-ceacutee programmeur averti

Accegraves distants

La figure suivante illustre la configuration de mon test Un client est en 1921684173 surlequel sont installeacutees les couches MySQL (Complete Package ou Essentials Package) Unserveur est en 1921684118 eacutequipeacute de MySQL Complete Package Sur le serveur root creacutee

4055_05_C05 Page 172 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 173

chapitre ndeg 5 Controcircle des donneacutees

un accegraves agrave Paul en preacutecisant lrsquoadresse de la machine client et lui attribue un droit drsquoextrac-tion de la table Livre sur la base bdPaul

CREATE USER Paul1921684173 IDENTIFIED BY pauldistant

GRANT SELECT ON bdpaulLivre TO Paul1921684173

Connexion par lrsquointerface de commande

Sur le client Paul se connecte au serveur dans une fenecirctre de commande en preacutecisantlrsquoadresse de la machine serveur puis donne son mot de passe distant Pensez agrave enlever lespare-feu Windows sur le client et le serveur (bloquant le port 3306)

mysql -h 1921684118 -u Paul -p

Paul peut agrave preacutesent seulement interroger la table distante comme le montre la copie drsquoeacutecransuivante

Table mysqlhostLa table mysqlhost est utiliseacutee conjointement avec mysqldb et concerne les accegravesdistants (plusieurs machines) Cette table nrsquoest employeacutee que pour les preacuterogatives au niveau

Figure 5-5 Accegraves distant par lrsquointerface de commande MySQL

Paullocalhost

1921684118

1921684173root

Paul1921684173

TCP-IP

bdpaul

mysql

mysql

rootlocalhostPaul

Livre

Figure 5-6 Interrogation distante par lrsquointerface de commande MySQL

4055_05_C05 Page 173 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

174 copy Eacuteditions Eyrolles

database indeacutependamment des utilisateurs La structure est la mecircme que celle de mysqldbagrave lrsquoexception de la colonne User qui nrsquoest pas preacutesente Le couple de colonnes (Host Db)est unique

MySQL lit et trie les tables db (sur les colonnes Host Db et User) et host (sur les colonnesHost et Db) en mecircme temps qursquoil parcourt la table user Pour les opeacuterations relatives auxbases (INSERT UPDATE etc) MySQL interroge la table user Si lrsquoaccegraves nrsquoy est pas deacutecritla recherche se poursuit dans les tables db et host Si la colonne Host de la table db estrenseigneacutee en fonction de lrsquoaccegraves lrsquoutilisateur reccediloit ses privilegraveges

Si la colonne Host de la table db nrsquoest pas renseigneacutee ( ) cela signifie que la table hosteacutenumegravere les machines qui sont autoriseacutees agrave acceacuteder agrave une base de donneacutees en particulier Si lamachine ne correspond pas lrsquoaccegraves nrsquoest pas permis Dans le cas contraire les privilegraveges sontvalueacutes agrave Y agrave partir drsquoune intersection (et pas drsquoune union) entre les tables db et host sur lecouple (Host Db)

La table mysqlhost nrsquoest mise agrave jour ni par GRANT ni par REVOKE Il faudra directement inseacute-rer (par INSERT) modifier (par UPDATE) ou supprimer (par DELETE) les lignes de cette tableElle nrsquoest pas utiliseacutee par la plupart des serveur MySQL car elle est deacutedieacutee agrave des usages tregravesspeacutecifiques (pour geacuterer un ensemble de machines agrave accegraves seacutecuriseacute par exemple) Elle peutaussi ecirctre utiliseacutee pour deacutefinir un ensemble de machines agrave accegraves non seacutecuriseacute

En supposant que vous deacuteclariez une machine agrave accegraves non seacutecuriseacute camparolsgtrfr Ilest possible drsquoautoriser lrsquoaccegraves seacutecuriseacute agrave toutes les autres machines du reacuteseau local Ceci enajoutant des enregistrements par INSERT dans la table mysqlhost comme suit

+------------------+----+----------------------------

| Host | Db |

+------------------+----+-----------------------------

| camparolsgtrfr | | (tous les privilegraveges agrave N)

| gtrfr | | (tous les privilegraveges agrave Y)

+------------------+----+-----------------------------

Vous deacuteclareriez lrsquoinverse des conditions initiales en remplaccedilant les N par des Y et reacutecipro-quement Dans tous les cas il sera neacutecessaire de mettre agrave jour les autres tables pour affiner lesprivilegraveges

Tableau 5-9 Tables pour les accegraves distants

Caractegravere Signification pour mysqldb Signification pour mysqlhost

colonne Host colonne Db colonne Host colonne Db

toute machine toute base toute machine toute base

(chaicircne vide)

consultez la table mysqlhost

toute base toute machine toute base

4055_05_C05 Page 174 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 175

chapitre ndeg 5 Controcircle des donneacutees

Vues

Outre le controcircle de lrsquoaccegraves aux donneacutees (privilegraveges) la confidentialiteacute des informations est unaspect important qursquoun SGBD relationnel doit prendre en compte Depuis la version 5 de MySQLla confidentialiteacute est renforceacutee par lrsquoutilisation de vues (views) qui agissent comme des fenecirctres surla base de donneacutees Cette section deacutecrit les diffeacuterents types de vues qursquoon peut rencontrer

Les vues correspondent agrave ce qursquoon appelle laquo le niveau externe raquo qui reflegravete la partie visible dela base de donneacutees pour chaque utilisateur

Seules les tables contiennent des donneacutees et pourtant pour lrsquoutilisateur une vue apparaicirctcomme une table En theacuteorie les utilisateurs ne devraient acceacuteder aux informations qursquoenquestionnant des vues Ces derniegraveres masquant la structure des tables interrogeacutees En pratiquela plupart des applications se passent de ce concept en manipulant directement les tables

La figure suivante illustre ce qui a eacuteteacute dit en preacutesentant trois utilisateurs Ils travaillent chacunsur une base de donneacutees contenant des vues formeacutees agrave partir de diffeacuterentes tables

Une vue est consideacutereacutee comme une table virtuelle car elle nrsquoa pas drsquoexistence propre Seule sastructure est stockeacutee dans le dictionnaire Ses donneacutees seront extraites de la meacutemoire agrave partirdes tables source agrave la demande

Une vue est creacuteeacutee agrave lrsquoaide drsquoune instruction SELECT appeleacutee laquo requecircte de deacutefinition raquo Cetterequecircte interroge une (ou plusieurs) table(s) ou vue(s) Une vue se recharge chaque foisqursquoelle est interrogeacutee

Outre le fait drsquoassurer la confidentialiteacute des informations une vue est capable de reacutealiser descontrocircles de contraintes drsquointeacutegriteacute et de simplifier la formulation de requecirctes complexes

Figure 5-7 Les vues

Niveau externe

Table1 Table2

Vue1 Vue2

Vue3

Vue1Vue2

Vue3

Niveau physique

scheacutema1 scheacutema2

Jules

Louise

Paul

4055_05_C05 Page 175 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

176 copy Eacuteditions Eyrolles

Dans certains cas la deacutefinition drsquoune vue temporaire est neacutecessaire pour eacutecrire une requecircteqursquoil ne serait pas possible de construire agrave partir des tables seules Attribueacutees comme des privi-legraveges (GRANT) les vues ameacuteliorent la seacutecuriteacute des informations stockeacutees

Creacuteation drsquoune vue (CREATE VIEW)

Pour pouvoir creacuteer une vue dans une base vous devez posseacuteder le privilegravege CREATE VIEW etles privilegraveges en SELECT des tables preacutesentes dans la requecircte de deacutefinition de la vue Lasyntaxe SQL de creacuteation drsquoune vue est la suivante

CREATE [OR REPLACE] [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE]

VIEW [nomBase]nomVue [(listecolonnes)]

AS requecircteSELECT

[WITH [CASCADED | LOCAL] CHECK OPTION]

OR REPLACE remplace la vue par la nouvelle deacutefinition mecircme si elle existait deacutejagrave (eacutevitede deacutetruire la vue avant de la recreacuteer) Vous devez avoir le privilegravege DELETE sur la basepour beacuteneacuteficier de cette directive

ALGORITHM=MERGE la deacutefinition de la vue et sa requecircte sont fusionneacutees en interne

ALGORITHM=TEMPTABLE les reacutesultats sont extraits dans une table temporaire (TEMPO-RARY) qui est utiliseacutee par la suite Inteacuteressant si les tables source sont sujettes agrave de nombreuxverrous qui ne gecircnent plus la manipulation de la vue utilisant elle une table temporaire

Aucune option ou ALGORITHM=UNDEFINED MySQL choisit la politique agrave adoptersouvent en faveur de MERGE la seule qui convient aux vues modifiables

nomBase deacutesigne le nom de la base de donneacutees qui heacutebergera la vue En lrsquoabsence de ceparamegravetre la vue est creacuteeacutee dans la base en cours drsquoutilisation

requecircteSELECT requecircte de deacutefinition interrogeant une (ou des) table(s) ou vue(s) pourcharger les donneacutees dans la vue

bull La requecircte de deacutefinition ne peut interroger une table temporaire ni contenir de paramegravetresou de variables de session

bull Si la requecircte de deacutefinition seacutelectionne toutes les colonnes drsquoun objet source (SELECT FROMhellip) et si des colonnes sont ajouteacutees par la suite agrave cet objet la vue ne contiendra pasces colonnes deacutefinies ulteacuterieurement agrave elle Il faudra recreacuteer la vue pour prendre en comptelrsquoeacutevolution structurelle de lrsquoobjet source

WITH CHECK OPTION garantit que toute mise agrave jour de la vue par INSERT ou UPDATEsrsquoeffectuera conformeacutement au preacutedicat contenu dans la requecircte de deacutefinition

Les paramegravetres LOCAL et CASCADED (par deacutefaut) determinent la porteacutee de la veacuterificationquand une vue est deacutefinie agrave partir drsquoune autre vue LOCAL restreint la veacuterification du preacutedi-cat agrave la vue elle-mecircme CASCADED permet drsquoeacutetendre eacuteventuellement les veacuterifications auxautres vues source de la vue qui vient drsquoecirctre deacutefinie

4055_05_C05 Page 176 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 177

chapitre ndeg 5 Controcircle des donneacutees

Classification

On distingue les vues simples des vues complexes en fonction de la nature de la requecircte dedeacutefinition Le tableau suivant reacutesume ce que nous allons deacutetailler au cours de cette section

Une vue monotable est deacutefinie par une requecircte SELECT ne comportant qursquoune seule table danssa clause FROM

Vues monotables

Les meacutecanismes preacutesenteacutes ci-apregraves srsquoappliquent aussi pour la plupart aux vues multitables(eacutetudieacutees plus loin) Consideacuterons les deux vues illustreacutees par la figure suivante et deacuteriveacutees dela table Pilote La vue PilotesAF deacutecrit les pilotes drsquoAir France agrave lrsquoaide drsquoune restriction(eacuteleacutements du WHERE) La vue Etat_civil est constitueacutee par une projection de certainescolonnes (eacuteleacutements du SELECT)

Une fois creacuteeacutee une vue srsquointerroge comme une table par tout utilisateur sous reacuteserve qursquoil aitobtenu le privilegravege en lecture directement (GRANT SELECT ON nomVue TOhellip) Le tableausuivant preacutesente une interrogation des deux vues

Tableau 5-10 Classification des vues

Requecircte de deacutefinition Vue simple Vue complexe

Nombre de tables 1 1 ou plusieurs

Fonction non oui

Regroupement non oui

Mises agrave jour possibles oui pas toujours

Figure 5-8 Deux vues drsquoune table

Web

Pilote

brevet nom nbHVol adresse compa

PL-1 Soutou 890 Castanet CAST

PL-2 Laroche 500 Montauban CAST

PL-3 Lamothe 1200 Ramonville AF

PL-4 Albaric 500 Vieille-Toulouse AF

PL-5 Bidal 120 Paris ASO

PL-6 Labat 120 Pau ASO

PL-7 Tauzin 100 Bas-Mauco ASO

CREATE VIEW PilotesAF

AS SELECT FROM Pilote

WHERE compa = AF

CREATE VIEW Etat_civil AS SELECT nom nbHVol adresse compa FROM Pilote

4055_05_C05 Page 177 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

178 copy Eacuteditions Eyrolles

Agrave partir de cette table et de ces vues nous allons eacutetudier drsquoautres options de lrsquoinstructionCREATE VIEW

AliasLes alias srsquoils sont utiliseacutes deacutesignent le nom de chaque colonne de la vue Ce meacutecanismepermet de mieux controcircler les noms de colonnes Quand un alias nrsquoest pas preacutesent la colonneprend le nom de lrsquoexpression renvoyeacutee par la requecircte de deacutefinition Ce meacutecanisme sert agravemasquer les noms des colonnes de lrsquoobjet source

Les vues suivantes sont creacuteeacutees avec des qui masquent le nom des colonnes de la tablesource Les deux eacutecritures sont eacutequivalentes

Vue drsquoune vueLrsquoobjet source drsquoune vue est en geacuteneacuteral une table mais peut aussi ecirctre une vue La vuesuivante est deacutefinie agrave partir de la vue preacuteceacutedemment creacuteeacutee Notez qursquoilaurait eacuteteacute possible drsquoutiliser des alias pour renommer les colonnes de la nouvelle vue

Tableau 5-11 Interrogation drsquoune vue

Besoin et requecircte ReacutesultatSomme des heures de vol des pilotes dAir FranceSELECT SUM(nbHVol) FROM PilotesAF

+-------------+| SUM(nbHVol) |+-------------+| 170000 |+-------------+

Nombre de pilotesSELECT COUNT() FROM Etat_civil

+----------+| COUNT() |+----------+| 7 |+----------+

Web

alias

Tableau 5-12 Vue avec alias

Eacutecriture 1 Eacutecriture 2CREATE OR REPLACE VIEW PilotesPasAF ( ) AS SELECT FROM Pilote WHERE NOT (compa = AF)

CREATE OR REPLACE VIEW PilotesPasAF AS SELECT brevet nom nbHVol adresse compa FROM Pilote WHERE NOT (compa = AF)

Contenu de la vue +---------+---------+-----------+------------+---------+| |+---------+---------+-----------+------------+---------+| PL-1 | Soutou | 89000 | Castanet | CAST || PL-2 | Laroche | 50000 | Montauban | CAST || PL-5 | Bidal | 12000 | Paris | ASO || PL-6 | Labat | 12000 | Pau | ASO || PL-7 | Tauzin | 10000 | Bas-Mauco | ASO |+---------+---------+-----------+------------+---------+

Web

codepilnomPilheuresPiladressePil societe

codepil nomPilheuresPil adressePil

societe

codepil | nomPil | heuresPil | adressePil | societe

PilotesPasAF

4055_05_C05 Page 178 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 179

chapitre ndeg 5 Controcircle des donneacutees

Vues en lecture seuleLrsquooption ALGORITHM=TEMPTABLE deacuteclare la vue non modifiable par INSERT UPDATE ouDELETE

Redeacutefinissons une vue des pilotes nrsquoeacutetant pas drsquoAir France agrave lrsquoaide de cette option Les messa-ges drsquoerreur induits par la clause de lecture seule geacuteneacutereacutes par MySQL sont tregraves parlants

Vues modifiables

Lorsqursquoil est possible drsquoexeacutecuter des instructions INSERT UPDATE ou DELETE sur une vuecette derniegravere est dite laquo modifiable raquo (updatable view) Vous pouvez creacuteer une vue qui estmodifiable intrinsegravequement

Pour mettre agrave jour une vue il doit exister une correspondance biunivoque entre les lignes de lavue et celles de lrsquoobjet source De plus certaines conditions doivent ecirctre remplies

Si une vue nrsquoest pas modifiable en soi il nrsquoest pas encore possible de programmer un deacuteclen-cheur de type instead of qui prenne le pas sur lrsquoinstruction de modification de la vue en speacuteci-fiant un bloc drsquoinstructions agrave effectuer agrave la place Les mises agrave jour de la vue seraient ainsiautomatiquement reacutepercuteacutees au niveau drsquoune ou de plusieurs tables Notons que ce type dedeacuteclencheur nrsquoest arriveacute qursquoassez tardivement sous Oracle DB2 et SQL Server

Tableau 5-13 Vue drsquoune vue

Creacuteation Contenu de la vue

CREATE OR REPLACE VIEW EtatCivilPilotesPasAF AS SELECT nomPilheuresPiladressePil FROM

+---------+-----------+------------+| nomPil | heuresPil | adressePil |+---------+-----------+------------+| Soutou | 89000 | Castanet || Laroche | 50000 | Montauban || Bidal | 12000 | Paris || Labat | 12000 | Pau || Tauzin | 10000 | Bas-Mauco |+---------+-----------+------------+

Web

PilotesPasAF

Tableau 5-14 Vue en lecture seule

Creacuteation Opeacuterations impossibles

CREATE OR REPLACE VIEW PilotesPasAFRO AS SELECT FROM Pilote WHERE NOT (compa = AF)

INSERT INTO PilotesPasAFRO VALUES (PL-8Ferry5ParisASO)ERROR 1288 (HY000) The target table PilotesPasAFRO of the INSERT is not updatableUPDATE PilotesPasAFRO SET nbHvol=nbHvol+2ERROR 1288 (HY000) The target table PilotesPasAFRO of the UPDATE is not updatableDELETE FROM PilotesPasAFROERROR 1288 (HY000) The target table PilotesPasAFRO of the DELETE is not updatable

Web

ALGORITHM=TEMPTABLE

4055_05_C05 Page 179 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

180 copy Eacuteditions Eyrolles

Pour qursquoune vue simple soit modifiable sa requecircte de deacutefinition doit respecter les critegraveres suivants

bull pas de directive DISTINCT de fonction (AVG COUNT MAX MIN SUM ou VARIANCE)drsquoexpression dans le SELECT

bull pas de GROUP BY ORDER BY ou HAVING

Dans notre exemple nous constatons qursquoil sera quand mecircme possible drsquoajouter un pilote agrave la vueEtat_civil bien que la cleacute primaire de la table source ne soit pas renseigneacutee MySQL insegravere agravela place en lrsquoabsence de valeur par deacutefaut de la cleacute primaire la chaicircne vide ( ) si la cleacute avaiteacuteteacute une seacutequence les insertions se feraient normalement Cette opeacuteration ne pourra donc se faireqursquoune seule fois apregraves cela sera contradictoire avec la condition de correspondance biunivo-que

En revanche il sera possible de modifier les colonnes de cette vue On pourra aussi ajoutermodifier (sous reacuteserve de respecter les eacuteventuelles contraintes issues des colonnes de la tablesource) ou supprimer des pilotes en passant par la vue PilotesAF

La derniegravere instruction est paradoxale car elle permet drsquoajouter un pilote de la compagnieASO en passant par la vue des pilotes de la compagnie AF La directive WITH CHECKOPTION permet drsquoeacuteviter ces effets de bord indeacutesirables pour lrsquointeacutegriteacute de la base

Tableau 5-15 Mises agrave jour de vues

Opeacuterations possibles Opeacuterations non conseilleacutees et impossibles

Suppression des pilotes de ASO

DELETE FROM WHERE compa = ASOLe pilote Lamothe double ses heuresUPDATE SET nbHVol = nbHVol2 WHERE nom = Lamothe

Ajout drsquoun pilote (pas conseilleacute)INSERT INTO VALUES(Raffarin10PoitiersASO)

Ajout drsquoun autre pilote impossibleINSERT INTO Etat_civil VALUES (Lebur20BordeauxASO)ERROR 1062 (23000) Duplicate entry for key 1

Ajout drsquoun piloteINSERT INTO VALUES (PL-8Ferry5 ParisAF)ModificationUPDATE SET nbHVol = nbHVol2SuppressionDELETE FROM WHERE nom=FerryAjout drsquoun pilote qui nrsquoest pas de AF INSERT INTO VALUES (PL-9Caboche 600RennesASO)

Toute mise agrave jour qui ne respecterait pas les contraintes de la table Pilote

Web

Etat_civil

Etat_civil

Etat_civil

PilotesAF

PilotesAF

PilotesAF

PilotesAF

4055_05_C05 Page 180 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 181

chapitre ndeg 5 Controcircle des donneacutees

Directive CHECK OPTION

La directive WITH CHECK OPTION empecircche un ajout ou une modification non conformes agrave ladeacutefinition de la vue

Interdisons lrsquoajout (ou la modification de la colonne compa) drsquoun pilote au travers de la vuePilotesAF si le pilote nrsquoappartient pas agrave la compagnie de code AF Il est neacutecessaire deredeacutefinir la vue PilotesAF Le script suivant deacutecrit la redeacutefinition de la vue lrsquoajout drsquounpilote et les tentatives drsquoajout et de modification ne respectant pas les caracteacuteristiques de lavue Les messages sont tregraves clairs

Vues complexes

Une vue complexe est caracteacuteriseacutee par le fait qursquoelle contient dans sa deacutefinition plusieurstables (jointures) et une fonction appliqueacutee agrave des regroupements ou agrave des expressions La miseagrave jour de telles vues nrsquoest pas toujours possible

Pour pouvoir modifier une vue complexe les restrictions sont les suivantes

bull La requecircte de deacutefinition ne doit pas contenir de sous-interrogation (jointure proceacutedurale)

bull Il nrsquoest pas possible drsquoutiliser drsquoopeacuterateur ensembliste (sauf UNION [ALL])

La figure suivante preacutesente deux vues complexes qui ne sont pas modifiables La vue multita-ble Pilotes_multi_AF est creacuteeacutee agrave partir drsquoune jointure entre les tables Compagnie etPilote La vue Moyenne_Heures_Pil est creacuteeacutee agrave partir drsquoun regroupement de la tablePilote

Tableau 5-16 Vue avec CHECK OPTION

Opeacuterations possibles Opeacuterations impossibles

Recreacuteation de la vueCREATE OR REPLACE VIEW PilotesAF AS SELECT FROM pilote WITH CHECK OPTION

Nouveau piloteINSERT INTO PilotesAF VALUES(PL-11Teste900RevelAF)Query OK 1 row affected (003 sec)

Ajout drsquoun piloteINSERT INTO PilotesAF VALUES (PL-9Caboche600RennesASO)ERROR 1369 (HY000) CHECK OPTION failedbdsoutouPilotesAF

Modification de pilotesUPDATE PilotesAF SET compa=ASOERROR 1369 (HY000) CHECK OPTION failedbdsoutouPilotesAF

Web

WHERE compa = AF

Web

4055_05_C05 Page 181 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

182 copy Eacuteditions Eyrolles

Mises agrave jour

Il semblerait qursquoon ne puisse inseacuterer aucun enregistrement dans ces vues du fait de la coheacute-rence qursquoil faudrait eacutetablir du sens vue vers tables Les messages drsquoerreur geacuteneacutereacutes par MySQLsont diffeacuterents suivant la nature de la vue (monotable ou multitable) Nous verrons commentreacutesoudre lrsquoerreur du deuxiegraveme cas

On pourrait croire qursquoil en est de mecircme pour les modifications Ce nrsquoest pas le cas Alors quela vue monotable Moyenne_Heures_Pil nrsquoest pas modifiable ni par UPDATE ni parDELETE (message drsquoerreur 1288) la vue multitable Pilotes_multi_AF est transformabledans une certaine mesure car la table Pilote (qui entre dans sa composition) est ditelaquo proteacutegeacutee par cleacute raquo (key preserved) Nous verrons dans le prochain paragraphe la significa-tion de cette notion

Figure 5-9 Vues complexes

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

CREATE VIEW Pilotes_multi_AF

AS SELECT pbrevet pnom pnbHVol cville cnomComp FROM Pilote p Compagnie c WHERE pcompa = ccomp AND pcompa = AF

CREATE VIEW Moyenne_Heures_Pil AS SELECT compa

AVG(nbHVol) moyenne FROM Pilote GROUP BY compa

compa moyenne

AF 675 SING 1000

Tableau 5-17 Tentatives drsquoinsertions dans des vues complexes

Vue monotable Vue multitable

INSERT INTO Moyenne_Heures_Pil VALUES (TAT50)ERROR 1288 (HY000) The targettable Moyenne_Heures_Pil of theINSERT is not updatable

INSERT INTO Pilotes_multi_AF VALUES(PL-4Test400CastanetCastanet AL)ERROR 1394 (HY000) Can not insert into joinview bdsoutouPilotes_multi_AF without fields list

Web

4055_05_C05 Page 182 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 183

chapitre ndeg 5 Controcircle des donneacutees

Les colonnes de la vue correspondant agrave la table proteacutegeacutee par cleacute ne sont pas les seules agrave pou-voir ecirctre modifieacutees Ici nbHVol peut ecirctre mise agrave jour car elle appartient agrave la table proteacutegeacutee ville qui nrsquoappartient pas agrave une table proteacutegeacutee peut aussi ecirctre modifeacutee

Les suppressions ne se reacutepercutent pas sur les enregistrements de la table proteacutegeacutee par cleacute(Pilote)

Modifions et tentons de supprimer des enregistrements agrave travers la vue multitable Pilotes_multi_AF

Tableau 5-18 Mise agrave jour drsquoune vue multitable

Mise agrave jour Reacutesultats

-- Multiplie par 2 le nombre drsquoheuresUPDATE SET nbHVol = nbHVol 2

Query OK 2 rows affectedRows matched 2 Changed 2 Warnings 0

SELECT brevetnomnbHVol FROM Pilotes_multi_AF+--------+-------------+---------+| brevet | nom | nbHVol |+--------+-------------+---------+| PL-1 | Louise Ente | 90000 || PL-2 | Paul Ente | 180000 |+--------+-------------+---------+

-- Modif de la ville de la compagnieUPDATE SET ville = Orly

SELECT brevetnomville FROM Pilotes_multi_AF+--------+-------------+-------+| brevet | nom | ville |+--------+-------------+-------+| PL-1 | Louise Ente | Orly || PL-2 | Paul Ente | Orly |+--------+-------------+-------+

SELECT compvillenomComp FROM Compagnie+------+-----------+--------------+| comp | ville | nomComp |+------+-----------+--------------+| AF | Orly | Air France || SING | Singapour | Singapore AL |+------+-----------+--------------+

--Pas possible DELETE FROM ERROR 1395 (HY000) Can not delete

from join view bdsoutouPilotes_multi_AF

WebPilotes_multi_AF

Pilotes_multi_AF

Pilotes_multi_AF

4055_05_C05 Page 183 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

184 copy Eacuteditions Eyrolles

Tables proteacutegeacutees (key preserved tables)

Une table est dite proteacutegeacutee par sa cleacute (key preserved) si sa cleacute primaire est preacuteserveacutee dans laclause de jointure et se retrouve en tant que colonne de la vue multitable (elle peut jouer le rocirclede cleacute primaire de la vue)

En consideacuterant les donneacutees initiales pour la vue multitable Vue_Multi_Comp_Pil la tablepreacuteserveacutee est la table Pilote car la colonne brevet identifie chaque enregistrement extraitde la vue alors que la colonne comp ne le fait pas

Cela ne veut pas dire pour autant que cette vue est modifiable Eacutetudions agrave preacutesent les condi-tions qui reacutegissent ces limitations

Critegraveres

Une vue multitable modifiable (updatable join view ou modifiable join view) est une vue quinrsquoest pas deacutefinie avec lrsquooption ALGORITHM=TEMPTABLE et qui est telle que la requecircte dedeacutefinition contient plusieurs tables dans la clause FROM

Aucune suppression nrsquoest possible

Les insertions sont permises seulement en isolant toutes les colonnes drsquoune seule table source

Attention aux effets de bord quand vous modifiez une colonne provenant drsquoune table non pro-teacutegeacutee par cleacute Il est plus naturel de modifier directement la table en question

Modifions de diffeacuterentes maniegraveres la vue multitable Vue_Multi_Comp_Pil La premiegraveretente une suppression les deux suivantes modifient tantocirct une colonne de la table proteacutegeacuteetantocirct une colonne de la table non proteacutegeacutee Les deux derniegraveres instructions insegraverent danschacune des deux tables

Tableau 5-19 Vue multitable

Creacuteation de la vue Reacutesultats

CREATE VIEW

AS SELECT ccomp cnomComp pnom pnbHVol FROM Pilote p Compagnie c WHERE pcompa=ccomp

+------+--------------+--------+-------------+---------+| comp | nomComp | brevet | nom | nbHVol |+------+--------------+--------+-------------+---------+| AF | Air France | PL-1 | Louise Ente | 45000 || AF | Air France | PL-2 | Paul Ente | 90000 || SING | Singapore AL | PL-3 | Paul Soutou | 100000 |+------+--------------+--------+-------------+---------+

WebVue_Multi_Comp_Pil

pbrevet

4055_05_C05 Page 184 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 185

chapitre ndeg 5 Controcircle des donneacutees

Autres utilisations de vues

Les vues peuvent eacutegalement servir pour simplifier lrsquoeacutecriture de requecirctes complexes renforcerla confidentialiteacute et une certaine inteacutegriteacute

Tableau 5-20 Mises agrave jour

Mise agrave jour Reacutesultats

DELETE FROM Vue_Multi_Comp_Pil WHERE comp=AF

ERROR 1395 (HY000) Can not delete from join view bdsoutouVue_Multi_Comp_Pil

UPDATE Vue_Multi_Comp_Pil SET nbHVol = nbHVol 3Query OK 3 rows affected (010 sec)

Warnings 0

SELECT brevet nbHVol FROM Pilote+--------+---------+| brevet | nbHVol |+--------+---------+| PL-1 | 135000 || PL-2 | 270000 || PL-3 | 300000 |+--------+---------+

UPDATE Vue_Multi_Comp_Pil SET nomComp = Dupond Query OK 2 rows affected (038 sec)

Warnings 0

(SELECT compvillenomComp FROM Compagnie+------+-----------+---------+| comp | ville | nomComp |+------+-----------+---------+| AF | Paris | Dupond || SING | Singapour | Dupond |+------+-----------+---------+

INSERT INTO Vue_Multi_Comp_Pil VALUES (PL-5 Jean2500)

SELECT brevetnomnbHVol FROM Pilote+--------+-------------+---------+| brevet | nom | nbHVol |+--------+-------------+---------+| PL-1 | Louise Ente | 135000 || PL-2 | Paul Ente | 270000 || PL-3 | Paul Soutou | 300000 || |+--------+-------------+---------+

INSERT INTO Vue_Multi_Comp_Pil VALUES (TAT Test)

SELECT compvillenomComp FROM Compagnie+------+-----------+---------+| comp | ville | nomComp |+------+-----------+---------+| AF | Paris | Dupond || SING | Singapour | Dupond || |+------+-----------+---------+

Web

Rows matched 3 Changed 3

Rows matched 3 Changed 2

(brevetnomnbHVol)

PL-5 | Jean | 250000

(compnomComp)

TAT | Paris | Test

4055_05_C05 Page 185 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

186 copy Eacuteditions Eyrolles

Simplifier les noms

Une vue permet de simplifier la manipulation drsquoune table ayant un nom long ou des colonnesportant des noms compliqueacutes Consideacuterons par exemple la table COLLATION_CHARACTER_SET_APPLICABILITY[COLLATION_NAMECHARACTER_SET_NAME] qui deacutecrit les colla-tions des jeux de caractegraveres disponibles et qui est situeacutee dans la base de donneacutees stockant ledictionnaire des donneacutees (INFORMATION_SCHEMA) Nous eacutetudierons dans la prochainesection les diffeacuterentes tables de cette base systegraveme Supposons que lrsquoon deacutesire souvent acceacutederagrave cette table pour connaicirctre les diffeacuterentes collations possibles pour les jeux de caractegraveres latins

Creacuteons la vue CollationsLatines qui simplifie lrsquoaccegraves agrave cette table au niveau du nommais aussi au niveau des colonnes Interrogeons cette vue de maniegravere agrave connaicirctre les collationsspeacutecifiques agrave la langue de Moliegravere ou agrave celle de Goethe

On dira que MySQL est plus laquo brancheacute raquo par la nouveauteacute Goethe eacutetant neacute 76 ans apregraves ledeacutecegraves de Moliegravere Aucun french dans la base donc

Contraintes de veacuterification

Nous avons deacutecrit au chapitre 1 les contraintes de veacuterification (CHECK) qui ne sont pas encoretotalement prises en charge Il est possible de programmer ce type de contraintes par des vues

Consideacuterons la table Pilote illustreacutee ci-apregraves et programmons par lrsquointermeacutediaire de la vueVueGradePilotes la contrainte veacuterifiant qursquoun pilote

ne peut ecirctre commandant de bord qursquoagrave la condition qursquoil ait entre 1 000 et 4 000 heures de vol

ne peut ecirctre copilote qursquoagrave la condition qursquoil ait entre 100 et 1 000 heures de vol

ne peut ecirctre instructeur qursquoagrave partir de 3 000 heures de vol

Les regravegles conseilleacutees pour manipuler les enregistrements drsquoune vue v1 deacutecrivant des con-traintes de veacuterification sur une table t1 sont les suivantes

bull modification et insertion par la vue v1

bull suppression et lecture par la table t1

Tableau 5-21 Vue pour simplifier les noms

Creacuteation Interrogation

CREATE VIEW CollationsLatines (collationjeu) AS SELECT FROM INFORMATION_SCHEMAcrarr COLLATION_CHARACTER_SET_APPLICABILITY WHERE CHARACTER_SET_NAME LIKE Latin

SELECT FROM CollationsLatines WHERE collation LIKE french OR collation LIKE german+-------------------+--------+| collation | jeu |+-------------------+--------+| latin1_german1_ci | latin1 || latin1_german2_ci | latin1 |+-------------------+--------+

Web

4055_05_C05 Page 186 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 187

chapitre ndeg 5 Controcircle des donneacutees

Manipulons agrave preacutesent la vue de notre exemple

Confidentialiteacute

La confidentialiteacute est une des vocations premiegraveres des vues Outre lrsquoutilisation de variablesdrsquoenvironnement il est possible de restreindre lrsquoaccegraves agrave des tables en fonction de momentspreacutecis

Les vues suivantes limitent temporellement les accegraves en lecture et en eacutecriture agrave des tables

Notez qursquoil est possible en plus de limiter lrsquoaccegraves agrave un utilisateur particulier en utilisant unevariable drsquoenvironnement (exemple rajout de la condition AND CURRENT_USER() =Paullocalhost agrave une vue)

Figure 5-10 Vue simulant la contrainte CHECK

Web Pilote

brevet nom nbHVol grade

PL-1 Daniel Vielle 1000 CDB PL-2 Benoit Treilhou 450 COPI PL-3 Pierre Filoux 9000 INST PL-4 Philippe Minier 1000 COPI

CREATE VIEW VueGradePilotesAS SELECT brevetnomnbHVolgradeFROM PiloteWHERE (grade =CDB

AND nbHVol BETWEEN 1000 AND 4000) OR (grade = COPI

AND nbHVol BETWEEN 100 AND 1000) OR (gr ade = INST AND nb HVol gt 3000)

WITH CHECK OPTION

Tableau 5-22 Manipulations des vues pour lrsquointeacutegriteacute reacutefeacuterentielle

Mises agrave jour possibles Mises agrave jour non valides ERROR 1369 (HY000) CHECK OPTION failed bdsoutouVueGradePilotes

INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-1Daniel Vielle )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-2Benoit Treihlou )INSERT INTO VueGradePilotes(brevetnomnbHVolgrade) VALUES (PL-3Pierre Filoux )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-4Philippe Minier )

INSERT INTO VueGradePilotes (brevetnomnbHVolgrade)VALUES (PL-5Trop jeune )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-6Inexperimente )

UPDATE VueGradePilotes SET WHERE brevet = PL-2

UPDATE VueGradePilotes SET WHERE brevet = PL-4

UPDATE VueGradePilotes SET WHERE brevet = PL-3

Web

1000CDB

450COPI

9000INST

1000COPI

100CDB

2999INST

grade =INST

grade =CDB nbHVol= 50

4055_05_C05 Page 187 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

188 copy Eacuteditions Eyrolles

Transmission de droits

Les meacutecanismes de transmission et de reacutevocation de privilegraveges que nous avons eacutetudieacutes srsquoappli-quent eacutegalement aux vues Ainsi si un utilisateur deacutesire transmettre des droits sur une partiedrsquoune de ses tables il utilisera une vue Seules les donneacutees appartenant agrave la vue seront acces-sibles aux beacuteneacuteficiaires

Les privilegraveges objet qursquoil est possible drsquoattribuer sur une vue sont les mecircmes que ceux appli-cables sur les tables (SELECT INSERT UPDATE sur une ou plusieurs colonnes DELETE)

Modification drsquoune vue (ALTER VIEW)

Vous devez au moins posseacuteder les privilegraveges CREATE VIEW et DELETE au niveau drsquoune vuepour pouvoir la modifier La syntaxe SQL est la suivante

ALTER [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE]

VIEW [nomBase]nomVue [(listecolonnes)]

AS requecircteSELECT

[WITH [CASCADED | LOCAL] CHECK OPTION]

Tableau 5-23 Vues pour restreindre lrsquoaccegraves agrave des moments preacutecis

Deacutefinition de la vue Accegraves

CREATE VIEW VueDesCompagniesJoursFeries AS SELECT FROM Compagnie WHERE

Restriction en lecture de la table Compagnie lessamedis et dimanches Mises agrave jour possibles agravetout moment

CREATE VIEW VueDesPilotesJoursOuvrables AS SELECT FROM Pilote WHERE AND DATE_FORMAT(SYSDATE()W) NOT IN (Sunday Saturday) WITH CHECK OPTION

Restriction en lecture et en eacutecriture (agrave cause deWITH CHECK OPTION) de la table Pilote lesjours ouvrables de 8h30 agrave 17h30

Web

DATE_FORMAT(SYSDATE()W)IN (SundaySaturday)

CURTIME()+0BETWEEN 83000 AND 173000

Tableau 5-24 Privilegraveges sur les vues

Attribution du privilegravege Signification

GRANT SELECT ON VueDesCompagniesJoursFeries TO Paullocalhost

Accegraves en local de lrsquoutilisateur Paul en lec-ture sur la vue VueDesCompagniesJoursFeacuterieacutes

GRANT INSERT ON VueDesPilotesJoursOuvrables TO Juleslocalhost

Accegraves en local de lrsquoutilisateur Jules eneacutecriture sur la vue VueDesCompagniesJoursFeacuterieacutes

4055_05_C05 Page 188 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 189

chapitre ndeg 5 Controcircle des donneacutees

Les transformations peuvent concerner toutes les parties drsquoune vue existante la politique decreacuteation (ALGORITHM) la liste des colonnes la requecircte etc Voir la section Creacuteation drsquoune vue

Visualisation drsquoune vue (SHOW CREATE VIEW)

Pour pouvoir visualiser la requecircte de deacutefinition drsquoune vue lrsquoinstruction que MySQL proposeest la suivante

SHOW CREATE VIEW [nomBase]nomVue

En arrangeant lrsquoeacutetat de sortie vous pouvez deacutecouvrir comment MySQL stocke la deacutefinition dela vue preacuteceacutedemment creacuteeacutee

SHOW CREATE VIEW VueDesCompagniesJoursFeries+-----------------------------+-----------------------------------------------+| View | Create View |+-----------------------------+-----------------------------------------------+| VueDesCompagniesJoursFeries | CREATE ALGORITHM=UNDEFINED || | DEFINER=`root``localhost` SQL SECURITY || | DEFINER VIEW `VueDesCompagniesJoursFeries` AS || | select sql_no_cache `Compagnie``comp` AS || | `comp``Compagnie``nrue` AS || | `nrue``Compagnie``rue` AS || | `rue``Compagnie``ville` AS || | `ville``Compagnie``nomComp` AS `nomComp` || | from `Compagnie` where || | (date_format(sysdate()_latin1W) in || | (_latin1Sunday_latin1Saturday)) |+-----------------------------+-----------------------------------------------+

Suppression drsquoune vue (DROP VIEW)

Vous devez posseacuteder le privilegravege DROP sur une vue pour pouvoir la supprimer

La suppression drsquoune vue nrsquoentraicircne pas la destruction des donneacutees qui reacutesident toujours dansles tables

La syntaxe SQL est la suivante

DROP VIEW [IF EXISTS]

[nomBase]nomVue [nomBase2]nomVue2

[RESTRICT | CASCADE]

IF EXISTS eacutevite une erreur dans le cas ougrave la vue nrsquoexiste pas

RESTRICT et CASCADE ne sont pas encore opeacuterationnels il concerneront probablement lareacutepercussion de la suppression entre vues interdeacutependantes

4055_05_C05 Page 189 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

190 copy Eacuteditions Eyrolles

Dictionnaire des donneacutees

Le dictionnaire des donneacutees (metadata ou data dictionary) est une partie majeure drsquoune basede donneacutees MySQL qursquoon peut assimiler agrave une structure centraliseacutee

Pour MySQL 16 vues sont issues de tables systegraveme non visibles Ces vues qui sont appeleacuteestables par abus de langage (dans la documentation officielle dans les livres et sur les forums1)et qui sont situeacutees dans la base INFORMATION_SCHEMA suffisent agrave stocker toutes lesinformations deacutecrivant tous les objets contenus dans toutes les bases de donneacutees MySQL serapproche davantage de DB2 et de SQL Server que drsquoOracle (qui possegravede 600 vues) Lesnoms des vues sont similaires et se rapprochent de la speacutecification ANSIISO SQL2003standard Part 11 Schemata

Constitution

Le dictionnaire des donneacutees contient

la deacutefinition des tables vues index seacutequences proceacutedures fonctions et deacuteclencheurs

la description de lrsquoespace disque alloueacute et occupeacute par chaque objet

les valeurs par deacutefaut des colonnes (DEFAULT)

la description des contraintes drsquointeacutegriteacute reacutefeacuterentielle (de veacuterification agrave venir)

le nom des utilisateurs de la base

les privilegraveges pour chaque utilisateur

des informations drsquoaudit (accegraves aux objets) et drsquoautre nature (commentaires par exemple)

Toutes les tables du dictionnaire des donneacutees ne sont accessibles qursquoen lecture seulementElles appartiennent agrave la base de donneacutees INFORMATION_SCHEMA Lrsquointerrogation du diction-naire des donneacutees est permise agrave tout utilisateur (qui ne verra que les objets qui lui sont toute-fois accessibles avec ses propres privilegraveges) et peut se faire au travers de requecirctes SELECT oupar le biais de la commande SHOW

Toutes les informations contenues dans les tables du dictionnaire des donneacutees sont codeacutees enminuscules

Le dictionnaire des donneacutees est mis automatiquement agrave jour apregraves chaque instruction SQL duLMD (INSERT UPDATE DELETE LOCK TABLE)

Les avantages drsquointerroger le dictionnaire des donneacutees par des requecirctes sont les suivants

1 Je conserve le vocable de laquo vue raquo pour ecirctre plus pregraves de la reacutealiteacute Cependant parler de table ou de vue est eacutequiva-lent puisqursquoelles sont interrogeables de la mecircme maniegravere par SELECT

4055_05_C05 Page 190 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 191

chapitre ndeg 5 Controcircle des donneacutees

Conforme aux regravegles drsquoEF Codd (le pegravere du modegravele relationnel) toutes les manipula-tions sont reacutealiseacutees agrave lrsquoaide des opeacuterateurs relationnels sur des tables

Inutile drsquoapprendre de nouvelles instructions (SHOW paramegravetres) proprieacutetaires deMySQL La migration vers un autre SGBD est ainsi faciliteacutee

Les possibiliteacutes drsquoextraction sont quasiment illimiteacutees du fait du grand nombre de tables etde jointures (ou drsquoautres opeacuterateurs) possible

Vous avez tellement souffert au chapitre 4 que vous avez ici lrsquooccasion de mettre agravelrsquoeacutepreuve vos connaissances dans un contexte plus laquo systegraveme raquo

Modegravele graphique du dictionnaire des donneacutees

Le diagramme suivant ndash qui srsquoapparente plus au niveau logique car les cleacutes eacutetrangegraveresapparaissent ndash tireacute de httpmysqldevelopmentcom deacutecrit la structure des vues du diction-naire des donneacutees

Deacutemarche agrave suivre

La deacutemarche agrave suivre afin drsquointerroger correctement le dictionnaire des donneacutees agrave propos drsquounobjet est la suivante

trouver le nom de la vue (ou des vues) pertinente(s) agrave partir du scheacutema preacuteceacutedent

choisir les colonnes de la vue (ou des vues) agrave seacutelectionner (soit agrave partir du graphique soiten affichant la structure de la vue par la commande DESCRIBE)

interroger la vue (ou les vues) en exeacutecutant une instruction SELECT contenant les colonnesinteacuteressantes

Recherche du nom drsquoune vue

Il nrsquoy a pas de moyen automatique de trouver le nom de la vue pertinente Cela dit il nrsquoy en aque 16 et vous en aurez vite fait le tour

Choisir les colonnes

Le choix des colonnes drsquoune vue du dictionnaire des donneacutees srsquoeffectue apregraves avoir listeacute lastructure de cette vue (par DESCRIBE) Le nom de la colonne est en geacuteneacuteral assez parlantDans notre exemple la vue contient huit colonnes Il apparaicirct que la clause de deacutefinition dechaque vue est contenue dans la colonne VIEW_DEFINITION La colonne CHECK_OPTIONdoit indiquer en principe le fait que la vue est deacuteclareacutee avec une contrainte de veacuterificationMais quelle colonne renseigne donc le nom de ladite vue

4055_05_C05 Page 191 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

192 copy Eacuteditions Eyrolles

Figure 5-11 Modegravele graphique du dictionnaire des donneacutees

4055_05_C05 Page 192 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 193

chapitre ndeg 5 Controcircle des donneacutees

DESCRIBE INFORMATION_SCHEMAVIEWS

+-----------------+--------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-----------------+--------------+------+-----+---------+-------+

| TABLE_CATALOG | varchar(512) | YES | | NULL | |

| TABLE_SCHEMA | varchar(64) | NO | | | |

| TABLE_NAME | varchar(64) | NO | | | |

| VIEW_DEFINITION | longtext | NO | | | |

| CHECK_OPTION | varchar(8) | NO | | | |

| IS_UPDATABLE | varchar(3) | NO | | | |

| DEFINER | varchar(77) | NO | | | |

| SECURITY_TYPE | varchar(7) | NO | | | |

+-----------------+--------------+------+-----+---------+-------+

Interroger la vue

Lrsquointerrogation de la vue sur les colonnes choisies est lrsquoeacutetape finale de la recherche de donneacuteesdans le dictionnaire Il convient drsquoeacutecrire une requecircte monotable ou multitable (jointures) quiextrait des donneacutees contenues dans la vue Ces donneacutees sont en fait contenues dans des tablessystegraveme qui ne sont pas accessibles pour des raisons seacutecuritaires

Supposons que je sois root en local et que je deacutesire connaicirctre le nom lrsquoemplacement et lecaractegravere contraint de toutes les vues existantes

SELECT TABLE_SCHEMATABLE_NAMECHECK_OPTION FROM INFORMATION_SCHEMAVIEWS+--------------+-----------------------------+--------------+| TABLE_SCHEMA | TABLE_NAME | CHECK_OPTION |+--------------+-----------------------------+--------------+| bdnouvelle | VueDesSocietes | NONE || bdsoutou | VueDesPilotesJoursOuvrables | CASCADED |+--------------+-----------------------------+--------------+

Si jrsquoavais voulu connaicirctre les vues contenues seulement dans la base bdsoutou il suffisaitdrsquoajouter la condition (WHERE TABLE_SCHEMA=bdsoutou)

Vous pouvez noter que MySQL utilise

La colonne TABLE_SCHEMA pour deacutesigner une database

La colonne TABLE_NAME pour stocker le nom de chaque vue des diffeacuterents scheacutemas Ici lanorme SQL doit y ecirctre pour quelque chose (Oracle nomme la colonne VIEW_NAME)

La colonne CHECK_OPTION pour indiquer le caractegravere restreint de chaque vue (lapremiegravere nrsquoest pas restreinte la seconde lrsquoest)

Classification des vues

Le tableau suivant classifie les vues selon leur fonctionnaliteacute Notez qursquoaucune redondance nide synonyme nrsquoexistent (si vous voulez reacutealiser une extraction pour deacutecouvrir quelque choseil nrsquoy aura pas beaucoup de requecirctes diffeacuterentes possibles)

4055_05_C05 Page 193 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

194 copy Eacuteditions Eyrolles

Interrogeons agrave preacutesent quelques-unes de ces vues dans le cadre drsquoexemples concrets

Bases de donneacutees du serveur

La requecircte suivante interroge la vue SCHEMATA et permet de retrouver les caracteacuteristiques(jeux de caractegraveres) des bases de donneacutees heacutebergeacutees par le serveur

SELECT SCHEMA_NAME AS Base de donnees

AS Jeu caracteres

AS Collation

FROM INFORMATION_SCHEMASCHEMATA

+--------------------+----------------+-------------------+

| Base de donnees | Jeu caracteres | Collation |

+--------------------+----------------+-------------------+

| information_schema | utf8 | utf8_general_ci |

| bdnouvelle | ascii | ascii_general_ci |

| bdsoutou | latin1 | latin1_swedish_ci |

| mysql | latin1 | latin1_swedish_ci |

| test | latin1 | latin1_swedish_ci |

+--------------------+----------------+-------------------+

Tableau 5-25 Vues du dictionnaire des donneacutees

Nature de lrsquoobjet Vues

Serveur SCHEMATA caracteacuteristiques du serveur (jeux de caractegraveres utiliseacutes)CHARACTER_SETS informations sur les colonnes pour lesquelles lrsquoutilisa-teur a reccedilu une autorisationCOLLATIONS et COLLATION_CHARACTER_SET_APPLICABILITY rela-tifs aux jeux de caractegraveres

Privilegraveges SCHEMA_PRIVILEGES liste des preacuterogatives au niveau databaseTABLE_PRIVILEGES liste des preacuterogatives au niveau tableUSER_PRIVILEGES liste des preacuterogatives au niveau userCOLUMN_PRIVILEGES liste des preacuterogatives au niveau columns

Tables et seacutequences TABLES caracteacuteristiques des tables (et seacutequences) dans les bases

Colonnes COLUMNS colonnes des tables et vues

Index STATISTICS description des index

Contraintes TABLE_CONSTRAINTS deacutefinition des contraintes de tablesKEY_COLUMN_USAGE composition des contraintes (colonnes)

Vues VIEWS description des vues

Sous-programmes ROUTINES description des sous-programmes stockeacutesTRIGGERS description des deacuteclencheurs

DEFAULT_CHARACTER_SET_NAME

DEFAULT_COLLATION_NAME

4055_05_C05 Page 194 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 195

chapitre ndeg 5 Controcircle des donneacutees

Notez que MySQL utilise

la colonne DEFAULT_CHARACTER_SET_NAME pour deacutesigner le jeu de caractegraveres drsquounedatabase Le dictionnaire est lui-mecircme codeacute en utf8

la colonne DEFAULT_COLLATION_NAME pour deacutesigner la collation du jeu de caractegraveres

Les colonnes CATALOG_NAME et SQL_PATH ne sont pas encore renseigneacutees Elles proviennenttoutes deux de la speacutecification de la norme SQL La premiegravere est relative au concept descheacutema (qursquoon peut assimiler agrave une collection de bases) et la seconde concerne un nom sym-bolique qursquoon pourrait associer agrave une routine (sous-programme)

Composition drsquoune base

La requecircte suivante interroge la vue TABLES et deacutecrit la composition des bases de donneacuteesutilisateur (jrsquoai filtreacute volontairement les lignes qui correspondent aux bases de MySQL)

SELECT TABLE_SCHEMATABLE_NAME FROM INFORMATION_SCHEMATABLES WHERE TABLE_SCHEMA NOT IN (information_schematestmysql)+--------------+-----------------------------+------------+-------------------+| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | DATE(CREATE_TIME) |+--------------+-----------------------------+------------+-------------------+| bdnouvelle | VueDesSocietes | VIEW | NULL || bdsoutou | Installer | BASE TABLE | 2005-11-30 || bdsoutou | Logiciel | BASE TABLE | 2005-11-30 || bdsoutou | PCSeuls | BASE TABLE | 2005-11-30 || bdsoutou | Pilote | BASE TABLE | 2005-11-30 || bdsoutou | Poste | BASE TABLE | 2005-11-30 || bdsoutou | Salle | BASE TABLE | 2005-11-30 || bdsoutou | Segment | BASE TABLE | 2005-11-30 || bdsoutou | Softs | BASE TABLE | 2005-11-30 || bdsoutou | Types | BASE TABLE | 2005-11-30 || bdsoutou | VueDesPilotesJoursOuvrables | VIEW | NULL |+--------------+-----------------------------+------------+-------------------+

Vous pouvez remarquer que MySQL utilise

la colonne TABLE_TYPE pour deacutesigner le type de la structure de stockage (les tablestemporaires si elles existent nrsquoapparaissent pas)

la colonne CREATE_TIME pour deacutesigner la date de creacuteation de lrsquoobjet

Deacutetail de stockage drsquoune base

En utilisant la mecircme vue du dictionnaire inteacuteressons-nous agrave la table Installer dans la basebdsoutou qui fait partie du scheacutema des exercices de ce livre La requecircte suivante extrait desinformations inteacuteressantes

TABLE_TYPEDATE(CREATE_TIME)

4055_05_C05 Page 195 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

196 copy Eacuteditions Eyrolles

SELECT FROM INFORMATION_SCHEMATABLES WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+--------+----------------+------------+----------------+-------------+| ENGINE | AUTO_INCREMENT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |+--------+----------------+------------+----------------+-------------+| InnoDB | 15 | 14 | 1170 | 16384 |+--------+----------------+------------+----------------+-------------+

Notez que MySQL utilise

la colonne ENGINE pour deacutesigner le type de moteur de stockage de la table en question

la colonne AUTO_INCREMENT pour deacutesigner la prochaine valeur de la seacutequence

la colonne TABLE_ROWS pour donner le nombre drsquoenregistrements de la table (ici crsquoestbien coheacuterent avec la seacutequence qui fait office de cleacute primaire)

la colonne AVG_ROW_LENGTH pour deacutesigner la taille moyenne drsquoune ligne en octets

la colonne DATA_LENGTH pour deacutesigner la taille de la table en octets

Citons pour en terminer avec cette vue les colonnes

TABLE_COLLATION qui indique le jeu de caractegraveres de la table

TABLE_COMMENT qui renseigne notamment agrave propos des reacutefeacuterences entre tables par lescleacutes eacutetrangegraveres

Structure drsquoune table

Inteacuteressons-nous agrave preacutesent agrave la vue COLUMNS qui deacutecrit la structure des tables au niveaucolumn level

Structure au premier niveau

La requecircte suivante deacutecrit en partie la table Installer Notez que ccedila ressemble assez auDESCRIBE (normal car lrsquoinstruction a eacuteteacute programmeacutee agrave lrsquoaide drsquoune requecircte analogue)

SELECT FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+-------------+-----------+------------------+-------------------+------------+| COLUMN_NAME | DATA_TYPE | ORDINAL_POSITION | COLUMN_DEFAULT | COLUMN_KEY |+-------------+-----------+------------------+-------------------+------------+| nPoste | varchar | 1 | NULL | || nLog | varchar | 2 | NULL | || numIns | int | 3 | NULL | PRI || dateIns | timestamp | 4 | CURRENT_TIMESTAMP | || delai | time | 5 | NULL | |+-------------+-----------+------------------+-------------------+------------+

ENGINEAUTO_INCREMENTTABLE_ROWSAVG_ROW_LENGTHDATA_LENGTH

COLUMN_NAMEDATA_TYPEORDINAL_POSITIONCOLUMN_DEFAULTCOLUMN_KEY

4055_05_C05 Page 196 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 197

chapitre ndeg 5 Controcircle des donneacutees

Remarquez que MySQL utilise

COLUMN_NAME pour renseigner le nom de chaque colonne

DATA_TYPE pour donner le typeMySQL

ORDINAL_POSITION pour renseigner lrsquoordre des colonnes dans la table (utiliseacute en cas deSELECT )

COLUMN_DEFAULT pour preacuteciser la valeur par deacutefaut de chaque colonne

COLUMN_KEY pour donner la composition de la cleacute primaire

Extraction des colonnes caractegraveres

La requecircte suivante deacutecrit en deacutetail les colonnes chaicircnes de caractegraveres de la table Installer

SELECT AS Taille max FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer AND NUMERIC_PRECISION IS NULL AND DATA_TYPE NOT IN (timestamptimedate)+-------------+-----------+------------+-------------+| COLUMN_NAME | DATA_TYPE | Taille max | IS_NULLABLE |+-------------+-----------+------------+-------------+| nPoste | varchar | 7 | YES || nLog | varchar | 5 | YES |+-------------+-----------+------------+-------------+

Vous pouvez noter que MySQL utilise

IS_NULLABLE pour renseigner le fait qursquoune colonne puisse ecirctre nulle

CHARACTER_OCTET_LENGTH pour renseigner la taille des chaicircnes de caractegraveres pourchaque colonne

Extraction des colonnes numeacuteriques

La requecircte suivante deacutetaille les colonnes numeacuteriques de la table Installer

SELECT COLUMN_NAMEDATA_TYPE AS Taille max

AS Preacutecision

FROM INFORMATION_SCHEMACOLUMNS

WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer

AND CHARACTER_MAXIMUM_LENGTH IS NULL

AND DATA_TYPE NOT IN (timestamptimedate)

+-------------+-----------+------------+-----------+

| COLUMN_NAME | DATA_TYPE | Taille max | Preacutecision |

+-------------+-----------+------------+-----------+

| numIns | int | 10 | 0 |

+-------------+-----------+------------+-----------+

COLUMN_NAMEDATA_TYPECHARACTER_OCTET_LENGTH IS_NULLABLE

NUMERIC_PRECISION

NUMERIC_SCALE

4055_05_C05 Page 197 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

198 copy Eacuteditions Eyrolles

Vous pouvez notez que MySQL utilise

NUMERIC_PRECISION pour renseigner la taille des numeacuteriques pour chaque colonne

NUMERIC_SCALE pour renseigner la preacutecision des numeacuteriques

Extraction des colonnes date-heure

La requecircte suivante extrait toutes les colonnes de type date-heure de la table Installer

SELECT COLUMN_NAMEDATA_TYPECOLUMN_DEFAULT

FROM INFORMATION_SCHEMACOLUMNS

WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer

AND CHARACTER_MAXIMUM_LENGTH IS NULL

AND )

+-------------+-----------+-------------------+

| COLUMN_NAME | DATA_TYPE | COLUMN_DEFAULT |

+-------------+-----------+-------------------+

| dateIns | timestamp | CURRENT_TIMESTAMP |

| delai | time | NULL |

+-------------+-----------+-------------------+

Citons pour en terminer avec cette vue les colonnes

CHARACTER_SET_NAME et COLLATION_NAME qui renseignent sur le jeu de caractegraverespour chaque colonne de la table

COLUMN_COMMENT qui renseigne sur les eacuteventuels commentaires sur chaque colonne

Recherche des contraintes drsquoune table

La vue TABLE_CONSTRAINTS deacutecrit la nature des contraintes La requecircte suivante deacutetailleles contraintes contenues dans la table Installer de la base bdsoutou

SELECT FROM INFORMATION_SCHEMATABLE_CONSTRAINTS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+-------------------+----------------------------+-----------------+| CONSTRAINT_SCHEMA | CONSTRAINT_NAME | CONSTRAINT_TYPE |+-------------------+----------------------------+-----------------+| bdsoutou | PRIMARY | PRIMARY KEY || bdsoutou | un_installation | UNIQUE || bdsoutou | fk_Installer_nLog_Logiciel | FOREIGN KEY || bdsoutou | fk_Installer_nPoste_Poste | FOREIGN KEY |+-------------------+----------------------------+-----------------+

MySQL utilise

CONSTRAINT_SCHEMA pour indiquer la base de donneacutees qui contient la contrainte (quipeut ecirctre situeacutee dans une autre base de donneacutees que la table elle-mecircme)

DATA_TYPE IN (timestamptimedate

CONSTRAINT_SCHEMACONSTRAINT_NAMECONSTRAINT_TYPE

4055_05_C05 Page 198 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 199

chapitre ndeg 5 Controcircle des donneacutees

CONSTRAINT_NAME pour renseigner le nom de la contrainte Notez ici que MySQLnrsquoextrait pas le nom de ma contrainte (pk_Installer) sans doute est-ce le fait qursquoelleest deacuteclareacutee eacutegalement AUTO_INCREMENT

CONSTRAINT_TYPE pour renseigner le type de chaque contrainte

La valeur CHECK dans la colonne CONSTRAINT_TYPE nrsquoest pas encore prise en charge Vouspouvez toutefois creacuteer des tables avec des contraintes CHECK rien ne se passera si vousinseacuterez des donneacutees non valides et le dictionnaire restera coheacuterent en nrsquoextrayant pas cesinformations

Composition des contraintes drsquoune table

La vue KEY_COLUMN_USAGE deacutecrit la composition des contraintes

Positions

La requecircte suivante permet drsquoextraire la composition des contraintes de la table Installerdans la base bdsoutou et en particulier celle de lrsquouniciteacute du couple (nPostenLog)

SELECT CONSTRAINT_NAME COLUMN_NAME AS Position

AS Position index FROM INFORMATION_SCHEMAKEY_COLUMN_USAGE WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+----------------------------+-------------+----------+----------------+| CONSTRAINT_NAME | COLUMN_NAME | Position | Position index |+----------------------------+-------------+----------+----------------+| PRIMARY | numIns | 1 | NULL || un_installation | nPoste | 1 | NULL || un_installation | nLog | 2 | NULL || fk_Installer_nLog_Logiciel | nLog | 1 | 1 || fk_Installer_nPoste_Poste | nPoste | 1 | 1 |+----------------------------+-------------+----------+----------------+

MySQL utilise

ORDINAL_POSITION qui indique la position de la colonne dans la contrainte (deacutebutantagrave 1)

POSITION_IN_UNIQUE_CONSTRAINT est eacutevalueacutee agrave NULL pour les index (unique et cleacuteprimaire) Pour les cleacutes eacutetrangegraveres composites elle indique la position de la colonne dansla contrainte

Deacutetails des contraintes reacutefeacuterentielles

Cette mecircme vue permet eacutegalement de retrouver la nature de la reacutefeacuterence pour chaque cleacuteeacutetrangegravere

ORDINAL_POSITION

POSITION_IN_UNIQUE_CONSTRAINT

4055_05_C05 Page 199 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

200 copy Eacuteditions Eyrolles

SELECT CONSTRAINT_NAME COLUMN_NAME AS Cle AS Base cible

AS Table pere

AS Col pere FROM INFORMATION_SCHEMAKEY_COLUMN_USAGE WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer AND REFERENCED_TABLE_SCHEMA IS NOT NULL+----------------------------+--------+------------+------------+----------+| CONSTRAINT_NAME | Cle | Base cible | Table pere | Col pere |+----------------------------+--------+------------+------------+----------+| fk_Installer_nLog_Logiciel | nLog | bdsoutou | logiciel | nLog || fk_Installer_nPoste_Poste | nPoste | bdsoutou | poste | nPoste |+----------------------------+--------+------------+------------+----------+

MySQL utilise

REFERENCED_TABLE_SCHEMA qui indique la base de donneacutees heacutebergeant la tablelaquo pegravere raquo Ici la base donneacutees contient les tables laquo fils raquo et laquo pegraveres raquo mais il se peut que cestables soient dans deux bases distinctes

REFERENCED_TABLE_NAME qui indique le nom de la table laquo pegravere raquo

REFERENCED_COLUMN_NAME qui indique le nom de la colonne reacutefeacuterenceacutee dans la tablelaquo pegravere raquo Ici les noms des colonnes des tables laquo fils raquo et laquo pegravere raquo sont identiques mais il sepeut qursquoils diffegraverent

Recherche du code source drsquoun sous-programme

La vue ROUTINES deacutecrit la composition des sous-programmes (proceacutedures et fonctions cata-logueacutees) La requecircte suivante permet drsquoextraire le code source des sous-programmes stockeacutesdans la base test

SELECT FROM INFORMATION_SCHEMAROUTINES WHERE ROUTINE_SCHEMA = test+--------------+--------------+-----------------------------------------------+| ROUTINE_NAME | ROUTINE_TYPE | ROUTINE_DEFINITION |+--------------+--------------+-----------------------------------------------+| sp1 | PROCEDURE | BEGIN DECLARE v_brevet CHAR(6) SET v_brevet = PROC END || sp2 | FUNCTION | BEGIN DECLARE v_brevet CHAR(3) SET v_brevet = FCT RETURN v_brevet END |+--------------+--------------+-----------------------------------------------+

REFERENCED_TABLE_SCHEMA

REFERENCED_TABLE_NAME

REFERENCED_COLUMN_NAME

ROUTINE_NAMEROUTINE_TYPEROUTINE_DEFINITION

4055_05_C05 Page 200 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 201

chapitre ndeg 5 Controcircle des donneacutees

MySQL utilise

ROUTINE_SCHEMA qui indique le nom de la base heacutebergeant le sous-programme

ROUTINE_NAME qui indique le nom du sous-programme

ROUTINE_TYPE qui indique la nature du sous-programme

ROUTINE_DEFINITION qui liste le code MySQL du sous-programme

Citons pour en terminer avec cette vue les colonnes

SECURITY_TYPE qui renseigne sur les privilegraveges associeacutes agrave la vue lors de son exeacutecution(soit les privilegraveges de lrsquoutilisateur creacuteateur definer soit ceux de lrsquoutilisateur qui lancelrsquoexeacutecution invoker)

CREATED et LAST_ALTERED pour stocker la date de creacuteation du sous-programme etlrsquoinstant de la derniegravere compilation

DEFINER qui indique lrsquoidentiteacute de lrsquoutilisateur qui a creacuteeacute le sous-programme

ROUTINE_COMMENT qui stocke un eacuteventuel commentaire relatif au sous-programme(initialiseacute lors de la compilation)

Privilegraveges des utilisateurs drsquoune base de donneacutees

On retrouve les diffeacuterents niveaux de privilegraveges eacutetudieacutes en deacutebut de chapitre

Au niveau global

La vue USER_PRIVILEGES liste les privilegraveges des accegraves utilisateurs au niveau global (lesdonneacutees viennent de la table mysqluser) La requecircte suivante extrait les privilegraveges dePaul et de Jules (en accegraves distant ou en local) Non vous ne recircvez pas trois simples quotessont neacutecessaires pour tester la valeur de la colonne GRANTEE

SELECT

FROM INFORMATION_SCHEMAUSER_PRIVILEGES

WHERE GRANTEE LIKE Paul OR GRANTEE LIKE Jules

+------------------------+----------------+--------------+

| GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE |

+------------------------+----------------+--------------+

| Paullocalhost | USAGE | NO |

| Juleslocalhost | USAGE | NO |

| Paul1921684173 | SELECT | NO |

| Paul1921684173 | CREATE | NO |

+------------------------+----------------+--------------+

GRANTEEPRIVILEGE_TYPEIS_GRANTABLE

4055_05_C05 Page 201 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

202 copy Eacuteditions Eyrolles

MySQL utilise

GRANTEE qui indique le nom de lrsquoaccegraves utilisateur

PRIVILEGE_TYPE qui indique le type du privilegravege

IS_GRANTABLE qui renseigne sur la possibiliteacute que lrsquoaccegraves utilisateur puisse retransmet-tre le privilegravege acquis (reccedilu avec WITH GRANT OPTION)

Au niveau database

La vue SCHEMA_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne TABLE_SCHEMA Celle-ci donne le nom de la base de donneacutees concerneacutee par lesprivilegraveges des accegraves utilisateurs (les donneacutees viennent de la table dbuser) La requecirctesuivante extrait les privilegraveges au niveau database de Paul en accegraves distant ou local

SELECT GRANTEEPRIVILEGE_TYPEIS_GRANTABLE FROM INFORMATION_SCHEMASCHEMA_PRIVILEGES WHERE GRANTEE LIKE Paul+--------------+------------------------+----------------+--------------+| TABLE_SCHEMA | GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE |+--------------+------------------------+----------------+--------------+| bdpaul | Paul1921684173 | SELECT | NO || bdpaul | Paullocalhost | DROP | NO || bdpaul | Paullocalhost | CREATE ROUTINE | NO |+--------------+------------------------+----------------+--------------+

Au niveau table

La vue TABLE_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne TABLE_NAME Celle-ci donne le nom de la table concerneacutee par les privilegraveges desaccegraves utilisateurs (les donneacutees viennent de la table mysqltables_priv) La requecirctesuivante extrait les privilegraveges au niveau table de Paul en accegraves distant ou local

SELECT AS BaseTable GRANTEEPRIVILEGE_TYPE AS Privilege FROM INFORMATION_SCHEMATABLE_PRIVILEGES WHERE GRANTEE LIKE Paul+--------------------------------------+------------------------+-----------+| | GRANTEE | Privilege |+--------------------------------------+------------------------+-----------+| bdsoutouVueDesCompagniesJoursFeries | Paullocalhost | SELECT || bdpaulLivre | Paul1921684173 | SELECT || bdpaulLivre | Paullocalhost | SELECT || bdpaulLivre | Paullocalhost | DELETE |+--------------------------------------+------------------------+-----------+

TABLE_SCHEMA

CONCAT(TABLE_SCHEMATABLE_NAME)

BaseTable

4055_05_C05 Page 202 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 203

chapitre ndeg 5 Controcircle des donneacutees

Au niveau column

La vue COLUMN_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne COLUMN_NAME Celle-ci preacutecise le nom de la colonne concerneacutee par les privilegravegesdes accegraves utilisateurs (les donneacutees viennent de la table mysql columns_priv) La requecirctesuivante extrait les privilegraveges au niveau column de Paul en accegraves distant ou local sur la basebdpaul

SELECT CONCAT(TABLE_NAME ) AS Tablecolonne

GRANTEEPRIVILEGE_TYPE AS Privilege

FROM INFORMATION_SCHEMACOLUMN_PRIVILEGES

WHERE TABLE_SCHEMA=bdpaul

+---------------+--------------------+-----------+

| Tablecolonne | GRANTEE | Privilege |

+---------------+--------------------+-----------+

| LivreISBN | Paullocalhost | UPDATE |

+---------------+--------------------+-----------+

Au niveau routine

Se reporter au niveau database

Commande SHOWLa commande SHOW permet drsquoextraire facilement des informations provenant du dictionnairedes donneacutees Elle est bien sucircr agrave lrsquoinverse plus limiteacutee que lrsquoeacutecriture drsquoune requecircte SELECT ndashqui pourra toujours extraire les mecircmes informations mais en interrogeant les vues adeacutequatesLa copie drsquoeacutecran suivante illustre la commande SHOW TABLES qui restitue une reacuteponse agrave laquestion laquo Quelles sont les tables et les vues preacutesentes dans la base de donneacutees en coursdrsquoutilisation raquo

COLUMN_NAME

Figure 5-12 Exemple de SHOW pour lister les tables drsquoun scheacutema

4055_05_C05 Page 203 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

204 copy Eacuteditions Eyrolles

Le tableau suivant deacutecrit quelques exemples qui vous seront peut-ecirctre utiles

Tableau 5-26 Exemples de SHOW

Commande Reacutesultat

SHOW COLUMNS FROM Installer FROM bdsoutou LIKE n

Liste des colonnes dont le nom commence parn dans la table Installer de la basebdsoutou

SHOW CREATE DATABASE bdsoutou Options de creacuteation de la base bdsoutou

SHOW CREATE TABLE bdsoutouInstaller Description totale de lrsquoinstruction permettant decreacuteer la table Installer de la base bdsou-tou

SHOW DATABASES Liste des bases preacutesentes sur le serveur

SHOW ENGINES Liste des moteurs de stockage utilisables sur leserveur

SHOW ERRORS Libelleacute de lrsquoerreur SQL courante

SHOW GRANTS FOR Paullocalhost Pour un accegraves utilisateur liste de ses privilegravegesaux niveaux global database column et rou-tine

SHOW INDEX FROM Installer FROM bdsoutou Description des index de la table Installerde la base bdsoutou

SHOW PRIVILEGES Liste de tous les privilegraveges possibles

SHOW TABLE STATUS FROM bdsoutou LIKE S

Caracteacuteristiques physiques des tables dont lenom commence par S dans la base bdsoutou

SHOW TABLES FROM mysql Liste des tables de la base mysql

SHOW TRIGGERS Caracteacuteristiques des deacuteclencheurs preacutesentssur le serveur

4055_05_C05 Page 204 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 205

chapitre ndeg 5 Controcircle des donneacutees

Exercices

Les objectifs de ces exercices sont

de creacuteer des vues monotables et multitables

drsquoinseacuterer des enregistrements dans des vues

drsquoeffectuer une mise agrave jour conditionneacutee via une vue

51 Vues monotables

Vues sans contraintes

Eacutecrire le script vuessql permettant de creacuteer

bull La vue LogicielsUnix qui contient tous les logiciels de type UNIX (toutes les colonnes sontconserveacutees) Veacuterifier la structure et le contenu de la vue (DESCRIBE et SELECT)

bull La vue Poste_0 de structure (nPos0 nomPoste0 nSalle0 TypePoste0 indIP ad0) quicontient tous les postes du rez-de-chausseacutee (etage=0 au niveau de la table Segment) Faireune jointure proceacutedurale sinon la vue sera consideacutereacutee comme une vue multitable Veacuterifier la struc-ture et le contenu de la vue

Inseacuterer deux nouveaux postes dans la vue tels qursquoun poste soit connecteacute au segment du rez-de-chausseacutee et lrsquoautre agrave un segment drsquoun autre eacutetage Veacuterifier le contenu de la vue et celui de la tableConclusion

Supprimer ces deux enregistrements de la table Poste

Reacutesoudre une requecircte complexe

Creacuteer la vue SallePrix de structure (nSalle nomSalle nbPoste prixLocation) quicontient les salles et leur prix de location pour une journeacutee (en fonction du nombre de postes) Lemontant de la location drsquoune salle agrave la journeacutee sera drsquoabord calculeacute sur la base de 100 euro par posteServez-vous de lrsquoexpression 100nbPoste dans la requecircte de deacutefinition

Veacuterifier le contenu de la vue puis afficher les salles dont le prix de location deacutepasse 150 euro

Ajouter la colonne tarif de type SMALLINT(4) agrave la table Types Mettre agrave jour cette table demaniegravere agrave inseacuterer les valeurs suivantes

Tableau 5-27 Tarifs des postes

Type du poste Tarif en euro

TX 50

PCWS 100

PCNT 120

UNIX 200

NC 80

BeOS 400

4055_05_C05 Page 205 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

206 copy Eacuteditions Eyrolles

Creacuteer la vue SalleIntermediaire de structure (nSalle typePoste nombre tarif) detelle sorte que le contenu de la vue reflegravete le tarif ajusteacute des salles en fonction du nombre et du typedes postes de travail Il srsquoagit de grouper par salle type et tarif (tout en faisant une jointure avec la tableTypes pour les tarifs) et de compter le nombre de postes pour avoir le reacutesultat suivant

+--------+-----------+--------+-------+

| nSalle | typePoste | nombre | tarif |

+--------+-----------+--------+-------+

| s01 | TX | 2 | 50 |

| s01 | UNIX | 2 | 200 |

| s02 | PCWS | 2 | 100 |

| s03 | TX | 1 | 50 |

| |

Agrave partir de la vue SalleIntermediaire creacuteer la vue SallePrixTotal(nSalle PrixReel)qui reflegravete le prix reacuteel de chaque salle (par exemple la s01 sera factureacutee 250 + 1200 = 300 euro) Veacuteri-fier le contenu de cette vue

Afficher les salles les plus eacuteconomiques agrave la location

Vues avec contraintes

Remplacer la vue Poste0 en rajoutant lrsquooption de controcircle (CHECK OPTION) Tenter drsquoinseacuterer unposte appartenant agrave un eacutetage diffeacuterent du rez-de-chausseacutee

Creacuteer la vue Installer0 de structure (nPoste nLog dateIns) ne permettant de travaillerqursquoavec les postes du rez-de-chausseacutee tout en interdisant lrsquoinstallation drsquoun logiciel de type PCNTTenter drsquoinseacuterer deux postes dans cette vue ne correspondant pas agrave ces deux contraintes un postedrsquoun eacutetage puis un logiciel de type PCNT Inseacuterer lrsquoenregistrement p6 log2 qui doit passer agrave traversla vue

52 Vue multitable

Creacuteer la vue SallePoste de structure (nomSalle nomPoste adrIP nomTypePoste)permettant drsquoextraire toutes les installations sous la forme suivante

SELECT FROM SallePoste

+----------+----------+---------------+-------------------+

| nomSalle | nomPoste | adrIP | nomTypePoste |

+----------+----------+---------------+-------------------+

| Salle 1 | Poste 1 | 1301208001 | Terminal X-Window |

| Salle 1 | Poste 2 | 1301208002 | Systegraveme Unix |

| Salle 1 | Poste 3 | 1301208003 | Terminal X-Window |

| |

4055_05_C05 Page 206 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie II

Programmation proceacutedurale

4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

209

Chapitre 6

Bases du langage

de programmation

Ce chapitre deacutecrit les caracteacuteristiques geacuteneacuterales du langage proceacutedural de programmation deMySQL

structure drsquoun programme

deacuteclaration et affectation de variables

structures de controcircle (

si

tant que

reacutepeacuteter

pour

)

meacutecanismes drsquointeraction avec la base

programmation de transactions

Geacuteneacuteraliteacutes

Les structures de controcircle habituelles drsquoun langage (

IF

WHILE

hellip) ne font pas partie inteacute-grante de la norme SQL Elles apparaissent dans une sous-partie optionnelle de la norme(ISOIEC 9075-51996

Flow-control statements

) MySQL les prend en compte

Le langage proceacutedural de MySQL est une extension de SQL car il permet de faire cohabiterles habituelles structures de controcircle (

si

pour

et

tant que

pour les plus connues) avec desinstructions SQL (principalement

SELECT

INSERT

UPDATE

et

DELETE

)

Environnement client-serveur

Dans un environnement client-serveur chaque instruction SQL donne lieu agrave lrsquoenvoi drsquounmessage du client vers le serveur suivi de la reacuteponse du serveur vers le client Il est preacutefeacuterablede travailler avec un sous-programme (qui sera stockeacute en fait cocircteacute serveur) plutocirct qursquoavecune suite drsquoinstructions SQL susceptibles drsquoencombrer le trafic reacuteseau En effet un bloc donnelieu agrave un seul eacutechange sur le reacuteseau entre le client et le serveur Les reacutesultats intermeacutediairessont traiteacutes cocircteacute serveur et seul le reacutesultat final est retourneacute au client

4055_06_C06 Page 209 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

210

copy Eacuteditions Eyrolles

Avantages

Les principaux avantages drsquoutiliser des sous-programmes (proceacutedures ou fonctions catalo-gueacutees qui sont stockeacutees cocircteacute serveur) sont

La modulariteacute un sous-programme peut ecirctre composeacute drsquoautres blocs drsquoinstructions Unsous-programme peut aussi ecirctre reacuteutilisable car il peut ecirctre appeleacute par un autre

La portabiliteacute un sous-programme est indeacutependant du systegraveme drsquoexploitation qui heacutebergele serveur MySQL En changeant de systegraveme les applicatifs nrsquoont pas agrave ecirctre modifieacutes

Lrsquointeacutegration avec les donneacutees des tables on retrouvera avec ce langage proceacutedural tousles types de donneacutees et drsquoinstructions disponibles sous MySQL des meacutecanismes pourparcourir des reacutesultats de requecirctes (curseurs) pour traiter des erreurs (

handlers

) et pourprogrammer des transactions (

COMMIT

ROLLBACK

SAVEPOINT

)

La seacutecuriteacute car les sous-programmes srsquoexeacutecutent dans un environnement

a priori

seacutecuriseacute(SGBD) ougrave il est plus facile de garder la maicirctrise sur les ordres SQL exeacutecuteacutes et donc surles agissements des utilisateurs

Structure drsquoun bloc

Un bloc drsquoinstructions est composeacute de

BEGIN

(section obligatoire) contient le code incluant ou non des directives SQL se termi-nant par le symbole laquo raquo

DECLARE

(directive optionnelle) deacuteclare une variable un curseur une exception etc

END

ferme le bloc

Un bloc peut ecirctre imbriqueacute dans un autre bloc Pour tester un bloc nous verrons dans lasection

Tests des exemples

qursquoil faut lrsquoinclure dans une proceacutedure catalogueacutee MySQL neprend pas encore en charge les proceacutedures anonymes (sans nom)

Figure 6-1

Trafic sur le reacuteseau drsquoinstructions SQL

CALL Bloc

SGBDExeacutecution globale

SELECT hellip

UPDATE hellip

INSERT INTO helliphellip

SGBDExeacutecution requecircte par requecircte

Client

Bloc

Suitedrsquoinstructions Serveur

BEGINSELECT hellip

UPDATE hellip

INSERT INTOhelliphellipEND

4055_06_C06 Page 210 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

211

chapitre ndeg 6 Bases du langage de programmation

Porteacutee des objets

La porteacutee drsquoun objet (variable curseur ou exception) est la zone du programme qui peut yacceacuteder Un objet deacuteclareacute dans un bloc est accessible dans les sous-blocs En revanche unobjet deacuteclareacute dans un sous-bloc nrsquoest pas visible du bloc supeacuterieur (principe des accolades deslangages C et Java)

Casse et lisibiliteacute

Comme SQL les sous-programmes sont capables drsquointerpreacuteter les caractegraveres alphanumeacuteri-ques du jeu de caractegraveres seacutelectionneacute Aucun objet manipuleacute par programme nrsquoest sensible agrave lacasse (

not case sensitive

) Ainsi

numeroBrevet

et

NumeroBREVET

deacutesignent le mecircmeidentificateur (tout est traduit en minuscules au niveau du dictionnaire des donneacutees) Lesregravegles drsquoeacutecriture classiques concernant lrsquoindentation et les espaces entre variables mots-cleacuteset instructions doivent ecirctre respecteacutees dans un souci de lisibiliteacute

Figure 6-2

Structure drsquoun bloc drsquoinstructions MySQL

BEGIN[DECLARE deacuteclaration]hellip-- codehellip

hellipEND

BEGIN[DECLARE deacuteclaration ]-- codehellipEND

BEGIN[DECLARE deacuteclaration ]-- codehellipEND

Figure 6-3

Visibiliteacute des objets

BEGINDECLARE v_brevet CHAR(6)hellip-- v_brevet accessible

hellip

END

BEGINDECLARE v_nom VARCHAR (20)-- v_brevet et v_nom accessibleshellipEND

v_nom inaccessible

Tableau 6-1 Lisibiliteacute du code

Peu lisible Crsquoest mieux

IF xgty THEN SET max=xELSE SET max=yEND IF IF xgty THEN SET max=xELSE SET max=yEND IF

4055_06_C06 Page 211 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

212

copy Eacuteditions Eyrolles

Identificateurs

Avant de parler des diffeacuterents types de variables MySQL deacutecrivons comment il est possiblede nommer les objets des sous-programmes Un identificateur commence par une lettre (ou unchiffre) Un identificateur nrsquoest pas limiteacute en nombre de caractegraveres Les autres signes pourtantconnus du langage sont interdits comme le montre le tableau suivant

Commentaires

MySQL prend en charge deux types de commentaires monolignes commenccedilant au symbolelaquo

--

raquo et finissant agrave la fin de la ligne et multilignes commenccedilant par laquo

raquo

et finissant parlaquo

raquo

Le tableau suivant deacutecrit quelques exemples

Variables

Un sous-programme est capable de manipuler des variables qui sont deacuteclareacutees (et eacuteventuelle-ment initialiseacutees) par la directive

DECLARE

Ces variables permettent de transmettre desvaleurs agrave des sous-programmes via des paramegravetres ou drsquoafficher des eacutetats de sortie souslrsquointerface Deux types de variables sont disponibles sous MySQL

scalaires recevant une seule valeur drsquoun type SQL (ex colonne drsquoune table)

externes deacutefinies dans la session et qui peuvent servir de paramegravetres drsquoentreacutee ou de sortie

Tableau 6-2 Identificateurs

Autoriseacutes Interdits

t2code_brevet2nombresMysql_t

moiamptoi

(symbole laquo amp raquo)

debit-credit

(symbole laquo - raquo)

onoff

(symbole laquo raquo)

code brevet

(symbole espace)

Tableau 6-3 Commentaires

Sur une ligne Sur plusieurs lignes

SELECT nbHVol INTO v_nbHVol FROM Pilote WHERE nom = Gratien VielSET v_bonus = v_nbHVol015

SELECT salaire INTO v_salaire FROM Pilote

WHERE nom = Thierry Albaric

SET v_bonus = v_salaire015

-- Lecture de la table Pilote

ndash- Extraction heures de vol

-- Calcul

Lecture de la table Pilote

Extraction du salairepour calculer le bonus

Calcul

4055_06_C06 Page 212 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

213

chapitre ndeg 6 Bases du langage de programmation

Variables scalaires

La deacuteclaration drsquoune variable scalaire est de la forme suivante

DECLARE

nomVariable1

[

nomVariable2

]

typeMSQL

[DEFAULT

expression

]

DEFAULT

permet drsquoinitialiser la (ou les) variable(s) ndash pas forceacutement agrave lrsquoaide drsquoune cons-tante Le tableau suivant deacutecrit quelques exemples

Affectations

Il existe plusieurs possibiliteacutes pour affecter une valeur agrave une variable

lrsquoaffectation comme on la connaicirct dans les langages de programmation (

SET

variable

expression) Vous pouvez aussi utiliser le symbole laquo = raquo mais il est plus prudentde le reacuteserver agrave la programmation de conditions

la directive DEFAULT

la directive INTO drsquoune requecircte (SELECT hellip INTO variable FROM hellip)

Restrictions

Le type tableau (array) nrsquoest pas encore preacutesent dans le langage de MySQL Cela peut ecirctrepeacutenalisant quand on deacutesire travailler en interne avec des reacutesultats drsquoextractions de taillemoyenne

Il est impossible drsquoutiliser un identificateur dans une expression srsquoil nrsquoest pas deacuteclareacute au preacutea-lable Ici la deacuteclaration de la variable v_maxi est incorrecte

DECLARE v_maxi INT DEFAULT 2 v_mini

DECLARE v_mini INT DEFAULT 15

Tableau 6-4 Deacuteclarations

Deacuteclarations Commentaires

DECLARE v_dateNaissance DATE Deacuteclare la variable sans lrsquoinitialiser Eacutequivalent agrave SET v_dateNaissance = NULL

DECLARE v_capacite SMALLINT(4) DEFAULT 999 Initialise la variable agrave 999

DECLARE v_trouve BOOLEAN DEFAULT TRUE Initialise la variable agrave vrai (1)

DECLARE v_Dans2jours DATE DEFAULT ADDDATE(SYSDATE()2)

Initialise la variable agrave dans 2 jours

=

4055_06_C06 Page 213 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

214 copy Eacuteditions Eyrolles

Comme la plupart des langages reacutecents les deacuteclarations multiples sont permises Celle qui suitest juste

DECLARE INT

Reacutesolution de noms

Lors des conflits potentiels de noms (variables ou colonnes) dans des instructions SQL (prin-cipalement INSERT UPDATE DELETE et SELECT) le nom de la variable est prioritairementinterpreacuteteacute au deacutetriment de la colonne de la table (de mecircme nom)

Dans lrsquoexemple suivant lrsquoinstruction DELETE supprime tous les pilotes de la table (et non passeulement le pilote de nom Placide Fresnais) car MySQL considegravere les deux identificateurscomme eacutetant la mecircme variable et non pas comme colonne de la table et variable

DECLARE nom VARCHAR(16) DEFAULT Placide Fresnais

DELETE FROM Pilote WHERE

Pour se preacutemunir de tels effets de bord une seule solution existe elle consiste agrave nommertoutes les variables diffeacuteremment des colonnes (en utilisant un preacutefixe par exemple) Uneautre solution serait drsquoutiliser une eacutetiquette de bloc (block label) pour lever drsquoeacuteventuellesambiguiumlteacutes Bien qursquoil soit possible drsquoemployer des eacutetiquettes de blocs (aussi disponibles pourles structures de controcircle) on ne peut pas encore preacutefixer des variables pour en distinguer unede mecircme nom entre diffeacuterents blocs

Opeacuterateurs

Les opeacuterateurs SQL eacutetudieacutes au chapitre 4 (logiques arithmeacutetiques de concateacutenationhellip) sontdisponibles au sein drsquoun sous-programme Les regravegles de prioriteacute sont les mecircmes que dans lecas de SQL

Lrsquoopeacuterateur IS NULL permet de tester une formule avec la valeur NULL Toute expressionarithmeacutetique contenant une valeur nulle est eacutevalueacutee agrave NULL

Le tableau suivant illustre quelques utilisations possibles drsquoopeacuterateurs logiques

i j k

nom = nom

Tableau 6-5 Eacuteviter les ambiguiumlteacutes

Preacutefixer les variables Eacutetiquette de bloc (preacutefixe pas opeacuterationnel)

DECLARE v_nom VARCHAR(16) DEFAULT Placide FresnaishellipDELETE FROM Pilote WHERE --ouDELETE FROM Pilote WHERE

DECLARE nom VARCHAR(16) DEFAULT Placide Fresnais DELETE FROM Pilote WHERE principalnom = nom

nom = v_nom

v_nom = nom

principal BEGIN

END principal

4055_06_C06 Page 214 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 215

chapitre ndeg 6 Bases du langage de programmation

Variables de session

Il est possible de passer en paramegravetres drsquoentreacutee drsquoun bloc des variables externes Ces variablessont dites de session (user variables) Elles nrsquoexistent que durant la session On deacuteclare cesvariables en ligne de commande agrave lrsquoaide du symbole laquo raquo

SET [ var2 = expression2]

Le tableau suivant illustre un exemple de deux variables de session on extrait le nom et lenombre drsquoheures de vol drsquoun pilote (table deacutecrite au deacutebut du chapitre 4) augmenteacute drsquounnombre en paramegravetre Son numeacutero de brevet et la dureacutee du vol sont lus au clavier Ces varia-bles de session ne sont bien sucircr pas agrave deacuteclarer dans le bloc

Conventions recommandeacutees

Adoptez les conventions drsquoeacutecriture suivantes pour que vos programmes MySQL soient plusfacilement lisibles et maintenables

Tableau 6-6 Utilisation drsquoopeacuterateurs

Code MySQL Commentaires

DECLARE v_compteur INT(3) DEFAULT 0DECLARE v_boolean BOOLEANDECLARE v_nombre INT(3)

Trois deacuteclarations dont une avec initialisation

SET v_compteur = v_compteur+1 Increacutementation de v_compteur (opeacuterateur +)

SET v_boolean = (v_compteur=v_nombre) v_boolean reccediloit NULL car la condition est fausse

SET v_boolean = (v_nombre IS NULL) v_boolean reccediloit TRUE (1 en fait) car la condi-tion est vraie

var1 = expression1

Tableau 6-7 Variables de session

Code MySQL Reacutesultat

hellipBEGIN DECLARE v_nom CHAR(16) DECLARE v_nbHVol DECIMAL(72) SELECT nomnbHVol INTO v_nom v_nbHVol FROM Pilote WHERE brevet = SET v_nbHVol = v_nbHVol + SELECT v_nom v_nbHVolEND

+------------------+----------+| v_nom | v_nbHVol |+------------------+----------+| Placide Fresnais | 246500 |+------------------+----------+

WebSET vs_num = PL-4$SET vs_hvol = 15$

vs_numvs_hvol

4055_06_C06 Page 215 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

216 copy Eacuteditions Eyrolles

Test des exemples

Parce qursquoil nrsquoest pas encore possible drsquoexeacutecuter des blocs anonymes (sous-programme sansnom et qui nrsquoest pas stockeacute dans la base) vous devez les inclure dans une proceacutedure catalo-gueacutee que vous appellerez dans lrsquointerface de commande

Lrsquoexemple suivant extrait le nombre drsquoheures de vol du pilote de nom Placide FresnaisPensez agrave redeacutefinir le deacutelimiteur agrave laquo $ raquo (par exemple) pour pouvoir utiliser dans le bloc lesymbole laquo raquo pour terminer chaque instruction

Le reacutesultat dans lrsquointerface de commande est le suivant Allez-y tester vos exemples mainte-nant

Tableau 6-8 Conventions

Objet Convention Exemple

Variable v_nomVariable v_compteur

Constante c_nomConstante c_pi

Variable de session (globale) vs_nomVariable vs_brevet

Tableau 6-9 Tester un exemple de bloc

Preacutefixer les variables Commentaire

delimiter $SET vs_nom = Placide Fresnais$

Deacuteclaration du deacutelimiteur et drsquoune variable de session

DROP PROCEDURE sp1$ Suppression de la proceacutedure

CREATE PROCEDURE sp1() Creacuteation de la proceacutedure

BEGIN DECLARE v_nbHVol DECIMAL(72) SELECT nbHVol INTO v_nbHVol FROM Pilote WHERE nom = vs_nom SELECT v_nbHVolEND$

Bloc drsquoinstructions

Trace du reacutesultatFin du bloc

CALL sp1()$ Appel de la proceacutedure

Web

4055_06_C06 Page 216 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 217

chapitre ndeg 6 Bases du langage de programmation

Structures de controcircle

En tant que langage proceacutedural MySQL offre la possibiliteacute de programmer

les structures conditionnelles si et cas (IFhellip et CASE)

des structures reacutepeacutetitives tant que reacutepeacuteter et boucle sans fin (WHILE REPEAT et LOOP)

Pas de structure FOR pour lrsquoinstant Deux directives suppleacutementaires qui sont toutefois agrave utiliseravec modeacuteration LEAVE qui sort drsquoune boucle (ou drsquoun bloc eacutetiqueteacute) et ITERATE qui force leprogramme agrave refaire un tour de boucle depuis le deacutebut

Structures conditionnelles

MySQL propose deux structures pour programmer des actions conditionneacutees la structure IFet la structure CASE

Trois formes de IF

Suivant les tests agrave programmer on peut distinguer trois formes de structure IF IF-THEN (si-alors) IF-THEN-ELSE (avec le sinon agrave programmer) et IF-THEN-ELSEIF (imbricationsde conditions)

Le tableau suivant donne lrsquoeacutecriture des diffeacuterentes structures conditionnelles IF Notezlaquo END IF raquo en fin de structure et non pas laquo ENDIF raquo Lrsquoexemple affiche un message diffeacute-rent selon la nature du numeacutero de teacuteleacutephone contenu dans la variable v_telephone

Figure 6-4 Exeacutecution drsquoun bloc

4055_06_C06 Page 217 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

218 copy Eacuteditions Eyrolles

Conditions booleacuteennes

Les tableaux suivants preacutecisent le reacutesultat drsquoopeacuterateurs logiques qui mettent en jeu des varia-bles booleacuteennes pouvant prendre trois valeurs (TRUE FALSE NULL) Bien sucircr en lrsquoabsencedrsquoun vrai type booleacuteen MySQL repreacutesente TRUE avec 1 et FALSE avec 0 Il est agrave noter que laneacutegation de NULL (NOT NULL) renvoie une valeur nulle

Structure CASE

Comme lrsquoinstruction IF la structure CASE permet drsquoexeacutecuter une seacutequence drsquoinstructions enfonction de diffeacuterentes conditions La structure CASE est utile lorsqursquoil faut eacutevaluer une mecircmeexpression et proposer plusieurs traitements pour diverses conditions

Tableau 6-10 Structures IF

IF-THEN IF-THEN-ELSE IF-THEN-ELSEIF

IF condition THEN instructionsEND IF

IF condition THEN instructionsELSE instructionsEND IF

IF condition1 THEN instructionsELSEIF condition2 THEN instructions2 ELSE instructions3END IF

BEGIN DECLARE v_telephone CHAR(14) DEFAULT 06-76-85-14-89 SELECT Cest un portable ELSE SELECT Cest un fixe END IFEND

IF SUBSTR(v_telephone12)=06 THEN

Tableau 6-11 Opeacuterateur AND

AND TRUE FALSE NULL

TRUE TRUE FALSE NULL

FALSE FALSE FALSE FALSE

NULL NULL FALSE NULL

Tableau 6-12 Opeacuterateur OR

OR TRUE FALSE NULL

TRUE TRUE TRUE TRUE

FALSE TRUE FALSE NULL

NULL TRUE NULL NULL

4055_06_C06 Page 218 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 219

chapitre ndeg 6 Bases du langage de programmation

Selon la nature de lrsquoexpression et des conditions une des deux eacutecritures suivantes peut ecirctreutiliseacutee

Le tableau suivant nous livre lrsquoeacutecriture avec IF drsquoune programmation qursquoil est plus rationneldrsquoeffectuer avec une structure CASE (de type searched)

Structures reacutepeacutetitives

Eacutetudions agrave preacutesent les trois structures reacutepeacutetitives tant que reacutepeacuteter et boucle sans fin

Structure tant que

La structure tant que se programme agrave lrsquoaide de la syntaxe suivante Avant chaque iteacuteration (etnotamment avant la premiegravere) la condition est eacutevalueacutee Si elle est vraie la seacutequence drsquoinstruc-tions est exeacutecuteacutee puis la condition est reacuteeacutevalueacutee pour un eacuteventuel nouveau passage dans la

Tableau 6-13 Structures CASE

CASE searched CASE

CASE variable WHEN expr1 THEN instructions1 WHEN expr2 THEN instructions2 hellip WHEN exprN THEN instructionsN [ELSE instructionsN+1]END CASE

CASE WHEN condition1 THEN instructions1 WHEN condition2 THEN instructions2 hellip WHEN conditionN THEN instructionsN [ELSE instructionsN+1]END CASE

Tableau 6-14 Diffeacuterentes programmations

IF CASE

BEGINDECLARE v_mention CHAR(2)DECLARE v_note DECIMAL(42) DEFAULT 98

IF v_note gt= 16 THEN SET v_mention = TB ELSEIF v_note gt= 14 THEN SET v_mention = B ELSEIF v_note gt= 12 THEN SET v_mention = AB ELSEIF v_note gt= 10 THEN SET v_mention = P ELSE END IF

CASE WHEN v_note gt= 16 THEN SET v_mention = TB WHEN v_note gt= 14 THEN SET v_mention = B WHEN v_note gt= 12 THEN SET v_mention = AB WHEN v_note gt= 10 THEN SET v_mention = P ELSE SET v_mention = REND CASE

Web

SET v_mention = R

4055_06_C06 Page 219 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

220 copy Eacuteditions Eyrolles

boucle Ce processus continue jusqursquoagrave ce que la condition soit fausse pour passer en seacutequenceapregraves le END WHILE Quand la condition nrsquoest jamais fausse on dit que le programme bouclehellip

[etiquette] WHILE condition DO

instructions

END WHILE [etiquette]

Le tableau suivant deacutecrit la programmation de deux tant que Le premier calcule la somme des100 premiers entiers Le second recherche le premier numeacutero 4 dans une chaicircne de caractegraveres

Cette structure est la plus puissante car elle permet de programmer aussi un reacutepeacuteter uneboucle sans fin et mecircme un pour (qui nrsquoest pas encore opeacuterationnel) Elle doit ecirctre utiliseacuteequand il est neacutecessaire de tester une condition avant drsquoexeacutecuter les instructions contenues dansla boucle

Structure reacutepeacuteter

La structure reacutepeacuteter se programme agrave lrsquoaide de la syntaxe REPEAThellip UNTIL

Enfin un reacutepeacuteter qui se programme comme il faut (agrave savoir laquo reacutepeacuteterhellip jusqursquoagrave condition raquo) Leslangages C et Java nous avaient deacuteformeacute cette traduction par do hellip while(condition)qui neacutecessite drsquoeacutecrire lrsquoinverse de la condition du jusqursquoagrave de lrsquoalgorithmique Ouf MySQL(comme Oracle) a bien programmeacute la structure reacutepeacuteter en traduisant ce fameux jusqursquoagrave par ladirective until et non plus par ce facirccheux while

Tableau 6-15 Structures tant que

Condition simple Condition composeacutee

DECLARE v_somme INT DEFAULT 0DECLARE v_entier SMALLINT DEFAULT 1

SET v_somme = v_somme+v_entier SET v_entier = v_entier+1

SELECT v_somme

+---------+| v_somme |+---------+| 5050 |+---------+

DECLARE v_telephone CHAR(14) DEFAULT 06-76-85-14-89DECLARE v_trouve BOOLEAN DEFAULT FALSEDECLARE v_indice SMALLINT DEFAULT 1

IF SUBSTR(v_telephonev_indice1) = 4 THEN SET v_trouve = TRUE ELSE SET v_indice = v_indice + 1 END IF

IF v_trouve THEN SELECT CONCAT(Trouveacute 4 agrave lindice v_indice)END IF

Trouveacute 4 agrave lindice 11

Web

WHILE (v_entier lt= 100) DO

END WHILEWHILE (v_indice lt= 14 AND NOT v_trouve) DO

END WHILE

4055_06_C06 Page 220 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 221

chapitre ndeg 6 Bases du langage de programmation

[etiquette] REPEAT

instructions

UNTIL condition END REPEAT [etiquette]

La particulariteacute de cette structure est que la premiegravere iteacuteration est effectueacutee quelles que soientles conditions initiales La condition nrsquoest eacutevalueacutee qursquoen fin de boucle

Si la condition est fausse la seacutequence drsquoinstructions est de nouveau exeacutecuteacutee Ce processuscontinue jusqursquoagrave ce que la condition soit vraie pour passer en seacutequence apregraves le END REPEAT

Quand la condition nrsquoest jamais vraie on dit aussi que le programme bouclehellip

Le tableau suivant deacutecrit la programmation de la somme des 100 premiers entiers et de larecherche du premier numeacutero 4 dans une chaicircne de caractegraveres agrave lrsquoaide de la structure reacutepeacuteterLes variables sont les mecircmes qursquoau tableau preacuteceacutedent

Cette structure doit ecirctre utiliseacutee quand il nrsquoest pas neacutecessaire de tester la condition avec lesdonneacutees initiales avant drsquoexeacutecuter les instructions contenues dans la boucle

Structure boucle sans fin

La syntaxe geacuteneacuterale de cette structure est programmeacutee par la directive LOOP Elle devient sansfin si vous nrsquoutilisez pas lrsquoinstruction LEAVE qui passe en seacutequence du END LOOP

[etiquette] LOOP

instructions

END LOOP [etiquette]

Le tableau suivant donne lrsquoeacutecriture du calcul de la somme des 100 premiers entiers en utilisantdeux boucles sans fin (qui se terminent toutefois car tout a une fin mais celles-lagrave je lesprogramme avec LEAVE) Jrsquoen profite pour preacutesenter ITERATE qui force agrave reprendrelrsquoexeacutecution au deacutebut de la boucle

Tableau 6-16 Structures reacutepeacuteter

Condition simple Condition composeacutee

REPEATSET v_somme = v_somme + v_entierSET v_entier = v_entier + 1

UNTIL END REPEAT

REPEAT IF SUBSTR(v_telephonev_indice1) = 4 THEN SET v_trouve = TRUE ELSE SET v_indice = v_indice + 1 END IFUNTIL END REPEATIF v_trouve THEN SELECT CONCAT(Trouveacute 4 agrave lindice v_indice)END IF

Web

v_entier gt 100

(v_indice gt 14 OR v_trouve)

4055_06_C06 Page 221 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

222 copy Eacuteditions Eyrolles

Il est agrave noter que LEAVE peut ecirctre aussi utiliseacute pour sortir drsquoun bloc (srsquoil est eacutetiqueteacute) LEAVEet ITERATE peuvent aussi ecirctre employeacutes au sein de structures REPEAT ou WHILE

Redirection (GOTO)Ceacutelegravebre pour faire tendre un programme vers une configuration plutocirct de feu drsquoartifice que decours drsquoeau tranquille lrsquoinstruction GOTO est bien connue mais souvent mal utiliseacutee Elle peutecirctre pratique dans certains cas pour sortir drsquoune boucle ou drsquoun bloc Il nrsquoest pas souhaitableque vous utilisiez GOTO agrave moins que vous eacutecriviez vos algorithmes avec des organigrammes

Dans son livre blanc (httpdevmysqlcomtech-resourcesarticlesmysql-storedprocedu-reshtml) Peter Gulutzan parle de laquo GOTO etiquette raquo et de laquo LABEL etiquette raquo Cetarticle est sorti alors que la version becircta de MySQL 50 nrsquoen eacutetait qursquoagrave ses deacutebuts Cette fonc-tionnaliteacute semble avoir eacuteteacute supprimeacutee dans la version de production Agrave suivre donc

Structure pourRenommeacutee pour les parcours de vecteurs tableaux et matrices en tout genre la structure pourse caracteacuterise par la connaissance a priori du nombre drsquoiteacuterations que le programmeur souhaitefaire effectuer agrave son algorithme La syntaxe geacuteneacuterale de cette structure est programmeacutee danstous les langages par lrsquoinstruction for

Absente pour lrsquoinstant de MySQL elle peut se programmer par un reacutepeacuteter un tant que ouencore par une boucle sans fin Dans tous ces cas il faudra deacutefinir un indice allant drsquoune valeurinitiale agrave une valeur finale tout en increacutementant ce mecircme indice en fin de boucle

Interactions avec la base

Cette section deacutecrit les meacutecanismes que MySQL offre pour interfacer un sous-programmeavec une base de donneacutees

Tableau 6-17 TStructures boucle sans fin

Avec LEAVE Avec ITERATE

SET v_somme = v_somme + v_entier SET v_entier = v_entier + 1 IF v_entier gt 100 THEN END IF

SET v_somme = v_somme + v_entier SET v_entier = v_entier + 1 IF v_entier lt= 100 THEN END IF

Webboucle1 LOOP

LEAVE boucle1

END LOOP boucle1

boucle1 LOOP

ITERATE boucle1

LEAVE boucle1END LOOP boucle1

4055_06_C06 Page 222 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 223

chapitre ndeg 6 Bases du langage de programmation

Extraire des donneacutees

La principale instruction capable drsquoextraire des donneacutees contenues dans des tables estSELECT Eacutetudieacutee au chapitre 4 dans un contexte SQL la particulariteacute de cette instruction auniveau drsquoun sous-programme est la directive INTO qui permet de charger des variables agrave partirde valeurs de colonnes comme le montre la syntaxe suivante

SELECT col1 [col2 ]INTO variable1 [variable2 ]

FROM nomTable

Cette instruction peut aussi ecirctre utiliseacutee agrave lrsquoexteacuterieur drsquoun bloc pour charger une variable desession par exemple

Veillez agrave ne reacutecupeacuterer qursquoun seul enregistrement agrave lrsquoaide du WHERE de la requecircte Crsquoest logi-que puisque vous deacutesirez ne charger qursquoune valeur par variable

bull Si vous en extrayez plusieurs vous verrez lrsquoerreur laquo ERROR 1172 (42000) Resultconsisted of more than one row raquo

bull Si vous nrsquoen extrayez aucun (no data found) aucune erreur nrsquoest souleveacutee et la variable estinchangeacutee (elle reste initialiseacutee agrave la valeur preacutesente avant la requecircte)

Colonnes simples

Le tableau suivant deacutecrit lrsquoextraction de la colonne compa pour le pilote de code PL-2 dansdiffeacuterents contextes

Tableau 6-18 Extraction de donneacutees

Code MYSQL Commentaires

BEGIN DECLARE v_comp VARCHAR(15) SELECT FROM Pilote WHERE brevet=PL-2 END

Chargement drsquoune variable locale agrave un blocNeacutecessiteacute drsquoappeler par la suite cette proceacute-dure (CALL)

SET vs_compa=$SELECT compa FROM Pilote WHERE brevet=PL-2$

Chargement drsquoune variable de session horsdrsquoun sous-programme

SET vs_compa=$CREATE PROCEDURE sp1() BEGIN SELECT FROM Pilote WHERE brevet=PL-2 END

Chargement drsquoune variable de session dans unsous-programme

compa INTO v_comp

INTO vs_compa

compa INTO vs_compa

4055_06_C06 Page 223 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

224 copy Eacuteditions Eyrolles

Pour traiter des requecirctes renvoyant plusieurs enregistrements il faudra utiliser des curseurs(eacutetudieacutes au chapitre suivant)

Fonctions SQL

Il est naturel que les fonctions SQL (mono et multilignes) eacutetudieacutees au chapitre 4 soienteacutegalement disponibles dans un sous-programme agrave condition de les utiliser au sein drsquouneinstruction SELECT Deux exemples sont deacutecrits dans le tableau suivant le premier char-gera la variable avec le nom du pilote de code PL-1 en majuscules (table deacutecrite au deacutebutdu chapitre 4) le second affectera agrave la variable le maximum du nombre drsquoheures de voltous pilotes confondus

Manipuler des donneacutees

Les principales instructions disponibles pour manipuler par un sous-programme leseacuteleacutements drsquoune base de donneacutees sont les mecircmes que celles proposeacutees par SQL agrave savoirINSERT UPDATE et DELETE Pour libeacuterer les verrous au niveau drsquoun enregistrement (etdes tables) il faudra ajouter les instructions COMMIT ou ROLLBACK (aspects eacutetudieacutes en finde chapitre)

Insertions

Le tableau suivant deacutecrit lrsquoinsertion de diffeacuterents enregistrements sous plusieurs eacutecritures (ilest aussi possible drsquoutiliser des variables de session)

Comme sous SQL il faut respecter les noms types et domaines de valeurs des colonnes Demecircme les contraintes de veacuterification (CHECK qui nrsquoest pas encore opeacuterationel et NOT NULL)et drsquointeacutegriteacute (PRIMARY KEY et FOREIGN KEY) doivent ecirctre valides

Dans le cas inverse une exception qui preacutecise la nature du problegraveme est leveacutee et peut ecirctreintercepteacutee par la directive HANDLER (voir chapitre suivant) Si une telle directive nrsquoexiste pas

Tableau 6-19 Utilisation de fonctions

Monoligne Multiligne

BEGIN DECLARE v_nomEnMAJUSCULES CHAR(20) SELECT FROM Pilote WHERE brevet = PL-1SELECT v_nomEnMAJUSCULESEND

BEGIN DECLARE v_plusGrandHVol DECIMAL(72) SELECT FROM PiloteSELECT v_plusGrandHVol END

+-------------------+| v_nomEnMAJUSCULES |+-------------------+| GRATIEN VIEL |+-------------------+

+-----------------+| v_plusGrandHVol |+-----------------+| 245000 |+-----------------+

Web

UPPER(nom)INTO v_nomEnMAJUSCULES

MAX(nbHVol) INTO v_plusGrandHVol

4055_06_C06 Page 224 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 225

chapitre ndeg 6 Bases du langage de programmation

dans le bloc qui contient lrsquoinstruction INSERT la premiegravere exception fera srsquointerrompre leprogramme

Modifications

Concernant la mise agrave jour de colonnes par UPDATE la clause SET peut ecirctre ambigueuml dans lesens ougrave lrsquoidentificateur agrave gauche de lrsquoopeacuterateur drsquoaffectation est toujours une colonne de basede donneacutees alors que celui agrave droite de lrsquoopeacuterateur peut correspondre agrave une colonne ou agrave unevariable

UPDATE nomTable

SET col1 = variable1 | expression1 | autrecol | (requecircte)

[col2 = ]

[WHERE ]

Si aucun enregistrement nrsquoest modifieacute aucune erreur ne se produit et aucune exception nrsquoestleveacutee

Alors que les affectations dans le code MYSQL (SET hellip) peuvent srsquoeacutecrire par les symboleslaquo = raquo ou laquo = raquo les comparaisons ou affectations SQL neacutecessitent le symbole laquo = raquo

Le tableau suivant deacutecrit la modification de diffeacuterents enregistrements (il est aussi possibledrsquoemployer des variables de session)

Tableau 6-20 Insertion drsquoenregistrements

Code MySQL Commentaires

BEGIN DECLARE v_brevet VARCHAR(6) DEFAULT PL-7 DECLARE v_nom VARCHAR(6) DECLARE v_HVol DECIMAL(72) DEFAULT 0 DECLARE v_comp VARCHAR(6)

Deacuteclaration des variables locales aubloc

INSERT INTO Pilote VALUES

Insertion drsquoun enregistrement en rensei-gnant les colonnes par des constantes

SET v_nom = Fabrice Peyrard SET v_comp = SING INSERT INTO Pilote VALUES END

Insertion drsquoun enregistrement en rensei-gnant les colonnes par des variableslocales

Web

(PL-6 Jules Ente 3000 AF)

(v_brevetv_nomv_HVolv_comp)

4055_06_C06 Page 225 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

226 copy Eacuteditions Eyrolles

Suppressions

La suppression par DELETE peut ecirctre ambigueuml (mecircme raison que pour lrsquoinstruction UPDATE)au niveau de la clause WHERE

DELETE FROM nomTable

[WHERE col1 = variable1 | expression1 | autrecol | (requecircte)

[col2 = ] ]

Si aucun enregistrement nrsquoest modifieacute aucune erreur ne se produit et aucune exception nrsquoestleveacutee

Le tableau suivant deacutecrit la suppression de diffeacuterents enregistrements (il est aussi possibledrsquoutiliser des variables de session)

Tableau 6-21 Modifications drsquoenregistrements

Code MySQL Commentaires

BEGIN DECLARE v_dureeVol DECIMAL(31) DEFAULT 48

Deacuteclaration

UPDATE Pilote SET WHERE brevet= PL-6

Modification drsquoun enregistrement de la table Pilote en utilisant une variable

UPDATE Pilote SET WHERE compa = AFEND

Modification de plusieurs enregistrements de la table Pilote en utilisant une cons-tante

Web

nbHVol= nbHVol + v_dureeVol

nbHVol= nbHVol + 10

Tableau 6-22 Suppression drsquoenregistrements

Code MYSQL Commentaires

BEGIN DECLARE v_hVolMini DECIMAL(72) DEFAULT 100000

DELETE FROM Pilote WHERE nbHVol lt

DELETE FROM Pilote WHERE Supprime les enregistrements dela table Pilote dont le nombredrsquoheures de vol est infeacuterieur agrave1 000Supprime un pilote

DELETE FROM Pilote WHERE END

Ne supprime aucun pilote

Web

v_hVolMini

brevet = PL-3

brevet = NULL

4055_06_C06 Page 226 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 227

chapitre ndeg 6 Bases du langage de programmation

Transactions

Une transaction est un bloc drsquoinstructions LMD faisant passer la base de donneacutees drsquoun eacutetatcoheacuterent agrave un autre eacutetat coheacuterent Si un problegraveme logiciel ou mateacuteriel survient au cours drsquounetransaction aucune des instructions contenues dans la transaction nrsquoest effectueacutee quel quesoit lrsquoendroit de la transaction ougrave est intervenue lrsquoerreur

On peut supposer que la majoriteacute des transactions sous MySQL sont programmeacutees dans lelangage du serveur Les langages plus eacutevolueacutes permettent aussi de deacutevelopper des transactionsagrave travers des API (par exemple la meacutethode commit est comprise dans le paquetagejavasql)

Lrsquoexemple typique drsquoune transaction est celui du transfert drsquoun compte eacutepargne vers uncompte courant Imaginez qursquoapregraves une panne votre compte eacutepargne a eacuteteacute deacutebiteacute de la sommede 500 euro sans que votre compte courant soit creacutediteacute du mecircme montant Vous ne seriez pastregraves content des services de votre banque (agrave moins que lrsquoerreur ne soit intervenue dans lrsquoautresens) Le meacutecanisme transactionnel empecircche un tel sceacutenario en invalidant toutes les opeacutera-tions faites depuis le deacutebut de la transaction si une panne survient au cours de cette mecircmetransaction

Caracteacuteristiques

Une transaction assure

lrsquoatomiciteacute des instructions qui sont consideacutereacutees comme une seule opeacuteration (principe dutout ou rien)

la coheacuterence (passage drsquoun eacutetat coheacuterent de la base agrave un autre eacutetat coheacuterent)

lrsquoisolation des transactions entre elles (lecture consistante meacutecanisme deacutecrit plus loin)

la durabiliteacute des opeacuterations (les mises agrave jour perdurent mecircme si une panne se produit apregravesla transaction)

Figure 6-5 Transaction

TRANSFERT(500euro) Deacutebut Transaction hellip UPDATE Codevi( -500euro) UPDATE CompteCourant(+500euro) Fin Transaction

Eacutetat coheacuterent

TEMPS

PANNE

Eacutetat coheacuterent

4055_06_C06 Page 227 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

228 copy Eacuteditions Eyrolles

Deacutebut et fin drsquoune transaction

Deux instructions sont disponibles pour marquer le deacutebut drsquoune transaction START TRAN-SACTION ou BEGIN Ainsi entre BEGIN et END drsquoun programme MySQL il est possibledrsquoeacutecrire plusieurs transactions Le fait de commencer une transaction termine implicitementcelle qui preacuteceacutedait ladite transaction

Une transaction se termine explicitement par les instructions SQL COMMIT ou ROLLBACK Ellese termine implicitement

bull agrave la premiegravere commande SQL du LDD ou du LCD rencontreacutee (CREATE ALTER DROPhellip)

bull agrave la fin normale drsquoune session utilisateur avec deacuteconnexion

bull agrave la fin anormale drsquoune session utilisateur (sans deacuteconnexion)

Nous deacutetaillons ici les principes de base drsquoune transaction MySQL sans entrer dans des deacutetailsplus techniques (veacuterouillages accegraves concurrents et transactions reacuteparties) qui sortent du cadrede cet ouvrage

Mode de validation

Deux modes de fonctionnement sont possibles celui par deacutefaut (autocommit) qui validesysteacutematiquement toutes les instructions reccedilues par la base Dans ce mode point de salut car ilvous sera impossible de revenir en arriegravere afin drsquoannuler une instruction Le mode agrave utiliserpour programmer des transactions est celui inverse (autocommit off) qui se deacuteclare agrave lrsquoaide duparamegravetre 0 dans lrsquoinstruction suivante

SET AUTOCOMMIT = 0 | 1

Le tableau suivant preacutecise la validiteacute de la transaction en fonction des eacuteveacutenements possibles

Votre premiegravere transaction

Vous pouvez tester rapidement une transaction en eacutecrivant le bloc suivant qui insegravere une lignedans une de vos tables

Tableau 6-23 Validiteacute drsquoune transaction

Eacuteveacutenement Validiteacute

COMMIT Transaction valideacutee

ROLLBACKCommande SQL (LDD ou LCD)Fin anormale drsquoune session

Transaction non valideacutee

4055_06_C06 Page 228 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 229

chapitre ndeg 6 Bases du langage de programmation

delimiter $

DROP PROCEDURE sp1$

CREATE PROCEDURE sp1()

BEGIN

SET AUTOCOMMIT = 0

INSERT INTO TableaVous VALUES ()

END

$

--appel de la transaction

CALL sp1()$

SELECT FROM TableaVous$

Exeacutecutez ce bloc dans lrsquointerface puis deacuteconnectez-vous soit en cassant la fenecirctre (icocircne enhaut agrave droite) soit proprement avec exit Reconnectez-vous et constatez que lrsquoenregistre-ment nrsquoest pas preacutesent dans votre table Mecircme quand la fin du programme est normale la tran-saction nrsquoest pas valideacutee (car il manque COMMIT) Relancez le bloc en ajoutant cetteinstruction apregraves lrsquoinsertion Notez que lrsquoenregistrement est preacutesent deacutesormais dans votretable mecircme apregraves une deacuteconnexion douce ou dure

Controcircle des transactions

Il est inteacuteressant de pouvoir deacutecouper une transaction en inseacuterant des points de validation(savepoints) qui rendent possible lrsquoannulation de tout ou partie des opeacuterations composantladite transaction

La figure suivante illustre une transaction deacutecoupeacutee en trois parties Lrsquoinstruction ROLLBACKpeut srsquoeacutecrire sous diffeacuterentes formes Ainsi ROLLBACK TO SAVEPOINTPointvalidation1 invalidera les UPDATE et le DELETE tout en laissant la possibiliteacute deconfirmer lrsquoinstruction INSERT (en fonction des commandes se trouvant apregraves ce ROLLBACKrestreint et de la maniegravere dont la session se terminera)

Web

Figure 6-6 Points de validation

Deacutebut Transaction INSERThellipPoint validation 1 UPDATEhellip UPDATEhellipPoint validation 2 DELETE hellip hellip

Fin Transaction

ROLLBACK

ROLLBACK TO SAVEPOINTPoint validation1

ROLLBACK TO SAVEPOINTPoint validation2

4055_06_C06 Page 229 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

230 copy Eacuteditions Eyrolles

Le tableau suivant deacutecrit une transaction MySQL deacutecoupeacutee en trois parties Le programmeuraura le choix entre les instructions ROLLBACK TO SAVEPOINT indiqueacutees en commentairepour valider tout ou partie de la transaction Il faudra finalement se deacutecider entre COMMIT etROLLBACK

Lrsquoinstruction SAVEPOINT deacuteclare un point de validation

Transactions imbriqueacutees

Il nrsquoest pas possible drsquoimbriquer plusieurs transactions se deacuteroulant dans diffeacuterents blocs

Il nrsquoest pas possible drsquoinvalider par ROLLBACK une commande SQL du LDD ou du LCD rencon-treacutee (CREATE ALTER DROPhellip)

Tableau 6-24 Transaction deacutecoupeacutee

Code MYSQL Commentaires

BEGINSET AUTOCOMMIT = 0 INSERT INTO Compagnie VALUES(C22 Place Brassens Blagnac Easy Jet)

Premiegravere partie de la transaction

UPDATE Compagnie SET nrue = 125 WHERE comp = AF UPDATE Compagnie SET ville = Castanet WHERE comp = C1

Deuxiegraveme partie de la transaction

DELETE FROM Compagnie WHERE comp = C1

Troisiegraveme partie de la transaction

-- Premiegravere partie agrave valider

-- Deuxiegraveme partie agrave valider

-- Troisiegraveme partie agrave valider

Tout agrave invalider

END

Valide la ou les sous-parties

Web

SAVEPOINT P1

SAVEPOINT P2

ROLLBACK TO SAVEPOINT P1

ROLLBACK TO SAVEPOINT P2

ROLLBACK TO SAVEPOINT P3

ROLLBACK

COMMIT

4055_06_C06 Page 230 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 231

chapitre ndeg 6 Bases du langage de programmation

Exercices

Lrsquoobjectif de ces exercices est drsquoeacutecrire des blocs puis des transactions manipulant des tablesdu scheacutema Parc Informatique Vous utiliserez une proceacutedure pour tester vos blocs comme ilest indiqueacute dans la section Test des exemples

61 Extraction de donneacutees

Eacutecrire le bloc MySQL qui affiche les deacutetails de la derniegravere installation de logiciel sous la forme suivante(les champs en gras sont agrave extraire)

+------------------------------------------------+

| Resultat 1 exo 1 |

+------------------------------------------------+

| Derniere installation en salle numeacuterodeSalle |

+------------------------------------------------+

+--------------------------------------------------------------------+

| Resultat 2 exo 1 |

+--------------------------------------------------------------------+

| Poste numeacuteroPoste Logiciel nomLogiciel en date du dateInstallation |

+--------------------------------------------------------------------+

Vous utiliserez SELECT hellip INTO pour extraire ces valeurs Ne tenez pas compte pour le moment deserreurs qui pourraient eacuteventuellement se produire (aucune installation de logiciel poste ou logiciel nonreacutefeacuterenceacutes dans la base etc)

62 Variables de session

Eacutecrire le bloc MySQL qui affecte hors drsquoun bloc par des variables session un numeacutero de salle et untype de poste et qui retourne des variables session permettant de composer un message indiquantles nombres de postes et drsquoinstallations de logiciels correspondants

+--------------------------------------------------------------------+

| Resultat exo2 |

+--------------------------------------------------------------------+

| x poste(s) installe(s) en salle y z installation(s) de type t |

+--------------------------------------------------------------------+

Essayez pour la salle s01 et le type UNIX Vous devez extraire 1 poste et 3 installations Ne tenez pascompte pour le moment drsquoeacuteventuelles erreurs (aucun poste trouveacute ou aucune installation reacutealiseacutee etc)

63 Transaction

Eacutecrire une transaction permettant drsquoinseacuterer un nouveau logiciel dans la base apregraves avoir passeacute enparamegravetres par des variables de session toutes ses caracteacuteristiques (numeacutero nom version et type dulogiciel) La date drsquoachat doit ecirctre celle du jour Tracer lrsquoinsertion du logiciel (message Logicielinseacutereacute dans la base)

4055_06_C06 Page 231 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

232 copy Eacuteditions Eyrolles

Il faut ensuite proceacuteder agrave lrsquoinstallation de ce logiciel sur le poste de code p7 (utiliser une variable pourpouvoir plus facilement modifier ce paramegravetre) Lrsquoinstallation doit se faire aussi agrave la date du jour Penseragrave actualiser correctement la colonne delai qui mesure le deacutelai (TIME) entre lrsquoachat et lrsquoinstallationPour ne pas que ce deacutelai soit nul (les deux insertions se feraient dans la mecircme seconde dans cettetransaction) placer une attente de 5 secondes entre lrsquoajout dans la table Logiciel et celui dans latable Installer agrave lrsquoaide de lrsquoinstruction SELECT SLEEP(5) Utiliser la fonction TIMEDIFF pourcalculer ce deacutelai

Inseacuterer par exemple le logiciel log15 de nom MySQL Query version 14 typePCWS coucirctant 95 euroTracer la transaction comme suit

+------------------------------+

| message1 |

+------------------------------+

| Logiciel insere dans la base |

+------------------------------+

1 row in set (001 sec)

+----------------------------------+

| message2 |

+----------------------------------+

| Date achat 2005-11-23 191604 |

+----------------------------------+

+----------+

| SLEEP(5) |

+----------+

| 0 |

+----------+

+-----------------------------------------+

| message3 |

+-----------------------------------------+

| Date installation 2005-11-23 191610 |

+-----------------------------------------+

+--------------------------------+

| message4 |

+--------------------------------+

| Logiciel installe sur le poste |

+--------------------------------+

Veacuterifiez lrsquoeacutetat des tables mises agrave jour apregraves la transaction Ne tenez pas compte pour le momentdrsquoeacuteventuelles erreurs (numeacutero du logiciel deacutejagrave reacutefeacuterenceacute type du logiciel incorrect installation deacutejagravereacutealiseacutee etc)

Attente de 5 secondes agrave ce niveau

4055_06_C06 Page 232 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

233

Chapitre 7

Programmation avanceacutee

Ce chapitre est consacreacute agrave des caracteacuteristiques avanceacutees du langage proceacutedural de MySQL

eacutecriture et appel de sous-programmes

programmation des curseurs

gestion des exceptions

mise en place de deacuteclencheurs

utilisation du SQL dynamique

Sous-programmes

Les sous-programmes sont des blocs nommeacutes qui sont compileacutes et qui reacutesident dans la basede donneacutees Dans le vocabulaire des bases de donneacutees on appelle les sous-programmes

storedprocedures

ou

stored routines

Ce sont des fonctions ou proceacutedures laquo catalogueacutees raquo (oulaquo stockeacutees raquo) capables drsquoinclure des paramegravetres en entreacutee Comme dans tous les langages deprogrammation les fonctions retournent un unique reacutesultat alors que les proceacutedures reacutealisentdes actions sans en donner (sauf eacuteventuellement en paramegravetre de sortie)

Eacutetant un des plus laquo jeunes raquo des SGBD MySQL tend au plus pregraves (en ajoutant toutefois desextensions) de la syntaxe normative de SQL2003 (sections

Stored Modules

et

Computationalcompleteness

) Lrsquoautre SGBD se rapprochant le plus de la norme est DB2 drsquoIBM Oracle etSQL Server de Microsoft ont un grand nombre de caracteacuteristiques absentes de la norme

Pour lrsquoinstant seules les proceacutedures sont capables drsquoinclure des paramegravetres en sortie

Un sous-programme ne se recompile pas automatiquement suite agrave la modification drsquoun objet

de la base manipuleacute dans son code (ajout drsquoune colonne dans une table par exemple)

Geacuteneacuteraliteacutes

Il est possible de retrouver le code drsquoun sous-programme au niveau du dictionnaire desdonneacutees (voir la fin du chapitre 5) Le sous-programme peut ecirctre ainsi partageacute dans un

4055_07_C07 Page 233 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

234

copy Eacuteditions Eyrolles

contexte multi-utilisateur Les avantages drsquoutiliser des sous-programmes ont eacuteteacute souligneacutes auchapitre 6 (modulariteacute portabiliteacute extensibiliteacute reacuteutilisabiliteacute inteacutegriteacute et confidentialiteacute)

Comme les blocs nous verrons que les sous-programmes ont une partie de deacuteclaration desvariables une autre contenant les instructions et eacuteventuellement une partie pour geacuterer lesexceptions (erreurs produites durant lrsquoexeacutecution)

Une proceacutedure peut ecirctre appeleacutee agrave lrsquoaide de lrsquointerface de commande (par

CALL

) dans unprogramme externe (Java PHP Chellip) par drsquoautres proceacutedures ou fonctions ou dans le corpsdrsquoun deacuteclencheur Les fonctions peuvent ecirctre invoqueacutees dans une instruction SQL (

SELECT

INSERT

et

UPDATE

) ou dans une expression (affectation de variable ou calcul)

Le cycle de vie drsquoun sous-programme est le suivant creacuteation de la proceacutedure ou de la fonction(compilation et stockage dans la base) appel et eacuteventuellement suppression du sous-programme de la base

Proceacutedures catalogueacutees

La syntaxe de creacuteation drsquoune proceacutedure catalogueacutee est la suivante Le privilegravege

CREATEROUTINE

est requis sur la base de donneacutees (ou au niveau global) en question (

ALTERROUTINE

et

EXECUTE

sont affecteacutes par la suite automatiquement)

CREATE

PROCEDURE

[

nomBase

]

nomProceacutedure

(

[ [ IN | OUT | INOUT ]

param

typeMySQL

[[ IN | OUT | INOUT ]

param2

typeMySQL

] ] )

[ LANGUAGE SQL

| [NOT] DETERMINISTIC

| CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

| SQL SECURITY DEFINER | INVOKER

| COMMENT

commentaire

]

BEGIN

[DECLARE ]

bloc drsquoinstructions

SQL et MySQL

END

deacutelimiteur

Par deacutefaut la proceacutedure est creacuteeacutee dans la base de donneacutees courante (seacutelectionneacutee) Si unnom est speacutecifieacute (

nomBase

) la proceacutedure appartiendra agrave cette base de donneacutees

IN

deacutesigne un paramegravetre drsquoentreacutee (par deacutefaut)

OUT

un paramegravetre de sortie et

INOUT

unparamegravetre drsquoentreacutee et de sortie

LANGUAGE SQL

(par deacutefaut) deacutetermine le langage de programmation de la proceacutedureMySQL nrsquoest pas encore compatible avec drsquoautres langages que le sien

4055_07_C07 Page 234 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

235

chapitre ndeg 7 Programmation avanceacutee

DETERMINISTIC

est simplement informationnel (lrsquooptimiseur srsquoen servira dans desversions ulteacuterieures) et deacutecrit le caractegravere deacuteterministe de la proceacutedure Si vous interrogezla base il serait plus naturel drsquoutiliser

NOT DETERMINISTIC

car on ne sait pas a priorice que lrsquoon va extraire (comme dans la boicircte de chocolats de

Forrest Gump)

CONTAINS SQL

renseigne sur le fait que la proceacutedure interagit avec la base

NO SQL

indi-que lrsquoinverse

READS SQL DATA

preacutecise que les interactions sont en lecture seulement

MODIFIES SQL DATA

signifie que des mises agrave jour de la base sont possibles

SQL SECURITY

deacutetermine si la proceacutedure srsquoexeacutecute avec les privilegraveges du creacuteateur(option par deacutefaut

definer-rights procedure

) ou ceux de lrsquoutilisateur qui appelle la proceacute-dure (

invoker-rights procedure

)

COMMENT

permet de commenter la proceacutedure au niveau du dictionnaire des donneacutees (voirchapitre 5)

bloc drsquoinstructions

SQL et MySQL

contient les deacuteclarations et les instructions dela proceacutedure eacutecrite dans le langage de MySQL (voir le chapitre preacuteceacutedent)

deacutelimiteur

deacutelimiteur de commandes diffeacuterent de laquo raquo (symbole utiliseacute obligatoire-ment en fin de chaque deacuteclaration et instruction du langage proceacutedural de MySQL)

Fonctions catalogueacutees

La syntaxe de creacuteation drsquoune fonction catalogueacutee est

CREATE FUNCTION

Les preacuterogativeset les options sont les mecircmes que pour les proceacutedures Nrsquooubliez pas lrsquoinstruction laquo

RETURN

variable

raquo

qui termine la fonction et retourne le reacutesultat (de mecircme type que celui deacuteclareacutedans la clause

RETURNS

CREATE

FUNCTION

[

nomBase

]

nomFonction

(

[

param

typeMySQL

[

param2

typeMySQL

] ] )

RETURNS

typeMySQL

[ LANGUAGE SQL

| [NOT] DETERMINISTIC

| CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

| SQL SECURITY DEFINER | INVOKER

| COMMENT commentaire

]

BEGIN

[DECLARE ]

bloc drsquoinstructions SQL et MySQL

contenant un laquo RETURN variable raquo

END

deacutelimiteur

4055_07_C07 Page 235 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

236 copy Eacuteditions Eyrolles

Structure drsquoun sous-programme

Dans une proceacutedure comme dans une fonction les deacuteclarations des variables curseurs etexceptions suivent directement lrsquoen-tecircte du bloc (apregraves la directive BEGIN) La figure suivanteillustre la structure drsquoune speacutecification et drsquoun corps drsquoun sous-programme MySQL Le blocdrsquoinstructions doit contenir au moins une instruction MySQL

Exemples

Consideacuterons la table Pilote Nous allons eacutecrire (dans la base bdsoutou) une fonction etune proceacutedure

La fonction EffectifsHeure(compheures) devra renvoyer le nombre de pilotesdrsquoune compagnie donneacutee (premier paramegravetre) qui ont plus drsquoheures de vol que la valeur dudeuxiegraveme paramegravetre (si aucun pilote retourne 0) Si aucune compagnie nrsquoest passeacutee enparamegravetre (mettre NULL) le calcul inclut toutes les compagnies Les eacuteventuelles erreurs nesont pas encore traiteacutees (compagnie de code inexistant par exemple)

La proceacutedure PlusExperimente(compnomheures) doit retourner le nom et lenombre drsquoheures de vol du pilote (par lrsquointermeacutediaire des deuxiegraveme et troisiegraveme paramegrave-tres) le plus expeacuterimenteacute drsquoune compagnie donneacutee (premier paramegravetre) Si plusieurs pilo-tes ont la mecircme expeacuterience un message drsquoerreur est afficheacute Si aucune compagnie nrsquoestpasseacutee en paramegravetre (mettre NULL) la proceacutedure retourne le nom du plus expeacuterimenteacute et lecode de sa compagnie (par lrsquointermeacutediaire du premier paramegravetre)

Remarquez que la fonction aurait pu ecirctre programmeacutee par une proceacutedure ayant un troisiegravemeparamegravetre de sortie

Figure 7-1 Structure drsquoun sous-programme

CREATE PROCEDURE | FUNCTION nomSousProgramme [()] [RETURNS typeMSQL ]

BEGIN[DECLARE deacuteclaration ] instructions MySQL

BEGIN [DECLARE deacuteclaration ]

instructions MySQL END hellipEND

$

4055_07_C07 Page 236 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 237

chapitre ndeg 7 Programmation avanceacutee

Une fonction

La creacuteation de la fonction est reacutealiseacutee agrave lrsquoaide du script suivant (EffectifsHeuresql)Notez que les deux paramegravetres drsquoentreacutee ne sont pas deacutefinis par la directive IN et que la clauseRETURN doit ecirctre preacutesente en fin de codage

BEGIN

DECLARE resultat SMALLINT

IF (pcomp IS NULL) THEN

SELECT COUNT() INTO resultat FROM Pilote WHERE nbHVol gt pheuresVol

ELSE

SELECT COUNT() INTO resultat FROM Pilote WHERE nbHVol gt pheuresVol

AND comp = pcomp

END IF

END

Une proceacutedure

La creacuteation de la proceacutedure est reacutealiseacutee agrave lrsquoaide du script suivant (PlusExperimentesql)Notez les deux derniers paramegravetres de sortie deacutefinis par la directive OUT et le premier servantdrsquoentreacutee ou de sortie avec la directive INOUT On peut assimiler le passage drsquoun paramegravetre parreacutefeacuterence agrave lrsquoutilisation de la directive INOUT

Figure 7-2 Proceacutedures

Pilote

brevet nom nbHVol comp

PL-1 Gilles Laborde 2450 AF PL-2 Freacutedeacuteric DAlmeyda 900 AF PL-3 Florence Peacuterissel 1000 SING PL-4 Thierry Millan 2450 CAST PL-5 Christine Royo 200 AF PL-6 Aureacutelia Ente 2450 SING

EffectifsHeure(comp heures)

(lsquoAFrsquo 300) 2

PlusExperimente(comp nom heures )

(lsquoAFrsquo ) (lsquoAFrsquo lsquo Gilles Labordersquo 2450)

function procedure

WebCREATE FUNCTION bdsoutouEffectifsHeure(pcomp VARCHAR(4)

pheuresVol DECIMAL(72)) RETURNS SMALLINT

RETURN resultat

4055_07_C07 Page 237 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

238 copy Eacuteditions Eyrolles

BEGIN

DECLARE p1 SMALLINT

IF (pcomp IS NULL) THEN

SELECT COUNT() INTO p1 FROM Pilote

WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote)

ELSE

SELECT COUNT() INTO p1 FROM Pilote

WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote WHERE comp=pcomp)

AND comp = pcomp

END IF

IF (p1 = 0) THEN

SELECT (Aucun pilote nest le plus expeacuterimenteacute) AS resultat

ELSEIF p1 gt 1 THEN

SELECT(Plusieurs pilotes sont les plus expeacuterimenteacutes) AS resultat

ELSE

IF (pcomp IS NULL) THEN

SELECT nom nbHVol comp INTO pnomPil pheuresVol pcomp

FROM Pilote WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote)

ELSE

SELECT nom nbHVol INTO pnomPil pheuresVol FROM Pilote

WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote WHERE comp=pcomp)

AND comp = pcomp

END IF

END IF

END

Fonction nrsquointeragissant pas avec la base

La fonction EcritureComplexe renvoie une chaicircne de caractegraveres deacutesignant lrsquoeacutecriture drsquounnombre complexe sous la forme laquo a + bi raquo ou laquo a - bi raquo (EcritureComplexesql) enfonction du signe des deux paramegravetres a et b deacutefinissant la partie reacuteelle et la partie imaginairedu complexe

BEGIN

DECLARE result VARCHAR(80)

IF (imaginaire lt 0) THEN

SET result = CONCAT(Complexe reel--imaginairei)

WebCREATE PROCEDURE bdsoutouPlusExperimente

(INOUT pcomp VARCHAR(4) OUT pnomPil VARCHAR(20) OUT pheuresVol DECIMAL(72))

WebCREATE FUNCTION bdsoutouEcritureComplexe

(reel DECIMAL(72) imaginaire DECIMAL(72))

RETURNS VARCHAR(80)

4055_07_C07 Page 238 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 239

chapitre ndeg 7 Programmation avanceacutee

ELSE

SET result = CONCAT(Complexe reel+imaginairei)

END IF

RETURN result

END

Compilation

Pour compiler ces sous-programmes agrave partir de lrsquointerface de commande il faut ajouter undeacutelimiteur apregraves chaque dernier END comme suit

delimiter $

Sous programme

$

Si un message drsquoerreur apparaicirct il indique la ligne concerneacutee souvent lrsquoerreur peut ecirctre situeacuteejuste avant cette ligne Le mecircme reacutesultat peut ecirctre obtenu par la commande SHOW ERRORS

Une fois que le message laquo Query OK 0 rows affected (hellip sec) raquo apparaicirct le sous-programme est correctement compileacute

Appel drsquoun sous-programme

Le creacuteateur drsquoun sous-programme peut exeacutecuter ce dernier agrave la demande et sans aucune condi-tion preacutealable Pour exeacutecuter un sous-programme agrave partir drsquoun autre accegraves les conditionssuivantes doivent ecirctre respecteacutees

deacutetenir le privilegravege EXECUTE sur la proceacutedure en question ou sur la base qui contient lesous-programme ou au niveau global

mentionner le nom de la base (du scheacutema) contenant le sous-programme agrave lrsquoexeacutecution dece dernier (exemple drsquoappel sous lrsquointerface de commande de la proceacutedure AugmenteCa-pacite de la base bdjean pour lrsquoavion drsquoimmatriculation F-GLFS laquo CALLbdjeanAugmenteCapacite(F-GLFS) raquo)

Deacutecrivons lrsquoappel drsquoun sous-programme sous lrsquointerface de commande dans un sous-programme MySQL et dans une instruction SQL Le chapitre suivant deacutetaillera un tel appel agravepartir drsquoun programme externe (Java ou PHP)

Sous lrsquointerface de commande

En phase de tests il est inteacuteressant de pouvoir deacuteclencher un sous-programme directementdans lrsquointerface de commande La commande CALL permet drsquoappeler une proceacutedure Unefonction est exeacutecuteacutee par son nom dans une instruction SQL

Le tableau suivant deacutecrit lrsquoappel et le reacutesultat des trois sous-programmes La fonction estappeleacutee ici dans un SELECT et dans un INSERT de deux maniegraveres diffeacuterentes

4055_07_C07 Page 239 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

240 copy Eacuteditions Eyrolles

Dans un sous-programme

Invoquons les sous-programmes agrave preacutesent agrave partir drsquoun autre sous-programme Le mecircme prin-cipe peut ecirctre adopteacute pour lrsquoappel dans un deacuteclencheur La proceacutedure srsquoappelle toujours parCALL la fonction par son nom (ici elle est appeleacutee dans lrsquoaffectation drsquoune variable)

Tableau 7-1 Appels dans lrsquointerface de commande

Appel dun sous-programme Reacutesultat

delimiter

+-----------------------------------+| bdsoutouEffectifsHeure(AF300) |+-----------------------------------+| 2 |+-----------------------------------+

delimiter SET vs_compa = AFSET vs_nompil = SET vs_heures =

SELECT vs_compavs_nompilvs_heures+-----------+----------------+------------+| vs_compa | vs_nompil | vs_heures |+-----------+----------------+------------+| AF | Gilles Laborde | 245000 |+-----------+----------------+------------+

delimiter SELECT

+---------------------------------+| bdsoutouEcritureComplexe(2-5) |+---------------------------------+| Complexe 2-5i |+---------------------------------+

CREATE TABLE testTrace (col VARCHAR(80))INSERT INTO testTrace SELECT bdsoutouEcritureComplexe (-2-5)INSERT INTO testTrace VALUES )

SELECT FROM testTrace+------------------+| col |+------------------+| Complexe -2-5i || Complexe 3-7i |+------------------+

WebSELECT bdsoutouEffectifsHeure

(AF300)

CALL bdsoutouPlusExperimente(vs_compa vs_nompilvs_heures)

bdsoutouEcritureComplexe(2-5)

bdsoutouEcritureComplexe

bdsoutouEcritureComplexe(3-7)

4055_07_C07 Page 240 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 241

chapitre ndeg 7 Programmation avanceacutee

Reacutecursiviteacute

La reacutecursiviteacute nrsquoest pour lrsquoinstant pas permise dans MySQL au niveau des sous-programmes

Comme dans tout programme reacutecursif il ne faudrait pas oublier la condition de terminaison Lrsquoexemple suivant deacutecrit la programmation agrave lrsquoaide drsquoune fonction reacutecursive du calcul de lafactorielle drsquoun entier positif La compilation se deacuteroule sans erreur lrsquoappel lui nous ramegraveneagrave lrsquoordre

Tableau 7-2 Appels dans un sous-programme

Codage Appels

CREATE PROCEDURE testsp1()BEGIN DECLARE v_compa VARCHAR(4) DEFAULT AF DECLARE v_heures DECIMAL(72) DEFAULT 300 DECLARE v_nbpil SMALLINT SELECT v_nbpilEND

CALL testsp1()$+---------+| v_nbpil |+---------+| 2 |+---------+

SET vs_compa = NULL$SET vs_nompil = $SET vs_heures = $CREATE PROCEDURE testsp2()BEGIN END

CALL testsp2()$+---------------------------------+| resultat |+---------------------------------+| Plusieurs pilotes sont les plus expeacuterimenteacutes |+---------------------------------+-- Les variables de session sont -- toutes agrave NULL

SET vs_resultat = $CREATE PROCEDURE testsp3()BEGIN SET vs_resultat = END

CALL testsp3()$SELECT vs_resultat AS Reacutesultat$+-----------------+| Reacutesultat |+-----------------+| Complexe 7-2i |+-----------------+

Web

SET v_nbpil = bdsoutouEffectifsHeure(v_compav_heures)

CALL bdsoutouPlusExperimente(vs_compavs_nompilvs_heures)

bdsoutouEcritureComplexe(7-2)

4055_07_C07 Page 241 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

242 copy Eacuteditions Eyrolles

Sous-programmes imbriqueacutes

Il nrsquoest pas possible de creacuteer un sous-programme (nested subprogram) dans un autre sous-programme

Cela nrsquoest valable que pour les blocs drsquoinstructions qui peuvent eacuteventuellement en incluredrsquoautres (voir chapitre 6)

Le tableau suivant deacutecrit la deacuteclaration invalide du sous-programme Mouchard dans laproceacutedure imbriquee Ce sous-programme inseacutererait une ligne dans une table pour tracerlrsquoappel de la proceacutedure en fonction de lrsquoutilisateur et du moment de lrsquoexeacutecution

Tableau 7-3 Reacutecursiviteacute

Code MYSQL Commentaires

delimiter $CREATE FUNCTION factorielle(n INT) RETURNS INTBEGIN IF THEN RETURN (1) ELSE RETURN (n factorielle(n - 1)) END IFEND$

Condition de terminaison

Appel reacutecursif

SELECT AS Factorielle de 10$ERROR 1424 (HY000) Recursive stored routines are not allowed

Appel de la fonction

Web

n = 1

factorielle(10)

Tableau 7-4 Sous-programme imbriqueacute

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouimbriquee (INOUT p1 VARCHAR(2)) BEGIN

Deacuteclaration du sous-programme

CREATE PROCEDURE bdsoutouMouchard() BEGIN INSERT INTO testTrace VALUES (CONCAT(USER() a lanceacute imbriquee le SYSDATE())) END

Deacuteclaration du sous-programme imbriqueacute

SET p1 = OK Deacutebut du sous-programme CALL bdsoutouMouchard()END$

Appel du sous-programme imbriqueacute

Web

4055_07_C07 Page 242 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 243

chapitre ndeg 7 Programmation avanceacutee

La compilation renvoie un message drsquoerreur tregraves clair

ERROR 1303 (2F003) Cant create a PROCEDURE from within another

stored routine

La solution est de creacuteer les deux proceacutedures agrave part ou drsquoinclure un bloc BEGINhellip END dans laproceacutedure de plus haut niveau

Modification drsquoun sous-programme

La modification drsquoun sous-programme srsquoexeacutecute par la commande ALTER Pour pouvoirchanger un sous-programme si vous nrsquoecirctes pas son creacuteateur vous devez deacutetenir le privilegravegeALTER ROUTINE sur la base de donneacutees (ou au niveau global) Plusieurs caracteacuteristiquespeuvent ecirctre corrigeacutees en une seule instruction (mais ni le code ni les paramegravetres) La syntaxegeacuteneacuterale est la suivante

ALTER PROCEDURE | FUNCTION [nomBase]nomSousProg

[ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

| SQL SECURITY DEFINER | INVOKER

| COMMENT commentaire

]

Lrsquoinstruction suivante commente le sous-programme Mouchard preacutesent dans la basebdsoutou en indiquant qursquoil interagit avec la base en eacutecriture et qursquoil srsquoexeacutecutera avec lesprivilegraveges de lrsquoaccegraves utilisateur qui lrsquoa creacuteeacute

ALTER PROCEDURE bdsoutouMouchard

MODIFIES SQL DATA

SQL SECURITY DEFINER

COMMENT Traces de qui lance quoi

Destruction drsquoun sous-programme

Pour supprimer un sous-programme si vous nrsquoecirctes pas son creacuteateur le privilegravege ALTERROUTINE est requis sur la base de donneacutees (ou au niveau global) La syntaxe de suppressiondrsquoun sous-programme est la suivante

DROP PROCEDURE | FUNCTION [IF EXISTS] [nomBase]nomSousProg

IF EXISTS eacutevite un message de warning si le sous-programme nrsquoexiste pas

Les instructions suivantes suppriment la proceacutedure catalogueacutee Mouchard de la base bdsou-tou

delimiter

DROP PROCEDURE bdsoutouMouchard

4055_07_C07 Page 243 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

244 copy Eacuteditions Eyrolles

Restrictions

Les restrictions que nous mentionnons ici srsquoappliquent eacutegalement aux deacuteclencheurs (eacutetudieacutesen fin de ce chapitre) Bien qursquoil existe des restrictions qui srsquoappliquent seulement aux fonc-tions et aux deacuteclencheurs elles peuvent srsquoappliquer agrave une proceacutedure si cette derniegravere est appe-leacutee dans le code de la fonction ou du deacuteclencheur

bull Les instructions suivantes ne peuvent ecirctre preacutesentes dans un sous-programme CHECKTABLES LOCK TABLES UNLOCK TABLES LOAD DATA LOAD TABLE et OPTIMIZE TABLE

bull Il nrsquoest pas possible de programmer des instructions SQL en dynamique (PREPARE EXE-CUTE DEALLOCATE PREPARE) dans un deacuteclencheur (possible dans une fonction ou uneproceacutedure)

bull Il nrsquoy a pas encore drsquooutil de deacutebogage pour les sous-programmes

bull Les instructions CALL ne peuvent ecirctre preacutepareacutees agrave lrsquoavance (CALL variable)

bull MySQL ne prend pas encore en charge la notion de paquetage (package) qui est un moduleregroupant plusieurs objets (variables exceptions curseurs fonctions ou proceacutedures) four-nissant un ensemble de services (un peu comme une classe dans lrsquoapproche objet)

Curseurs

Les curseurs sont tregraves utiliseacutes pour ne pas dire qursquoils sont omnipreacutesents dans toute applicationimportante Le concept analogue au niveau de JDBC est programmeacute agrave lrsquoaide de la classeResultset et sous ASP de Microsoft agrave lrsquoaide de la classe RecordSet (appeleacutee DataSetavec Net)

MySQL nrsquoest compatible qursquoavec des curseurs en lecture seulement non navigables nonmodifiables et non dynamiques

Geacuteneacuteraliteacutes

Un curseur est une zone meacutemoire qui est geacuteneacutereacutee cocircteacute serveur (mise en cache) et qui permet detraiter individuellement chaque ligne renvoyeacutee par un SELECT Un sous-programme peuttravailler avec plusieurs curseurs en mecircme temps Un curseur durant son existence (delrsquoouverture agrave la fermeture) contient en permanence lrsquoadresse de la ligne courante

La figure suivante illustre la manipulation de base drsquoun curseur Le curseur est deacutecrit apregraves lesvariables Il est ouvert dans le code du programme il srsquoeacutevalue alors et va se charger enextrayant les donneacutees de la base Le programme peut parcourir tout le curseur en reacutecupeacuterantles lignes une par une dans une variable locale Le curseur est ensuite fermeacuteLes curseurs doivent ecirctre deacuteclareacutes apregraves les variables et avant les exceptions

4055_07_C07 Page 244 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 245

chapitre ndeg 7 Programmation avanceacutee

Il nrsquoexiste pour lrsquoinstant qursquoune seule maniegravere de parcourir un curseur du premier au dernierenregistrement

Instructions

Les instructions disponibles pour travailler avec des curseurs sont deacutefinies dans le tableausuivant

Figure 7-3 Principes drsquoun curseur

CREATE PROCEDURE nomSousProgramme [( )]

BEGIN

DECLARE v2 DECLARE v3

DECLARE CURSOR curs1 FOR SELECT brevetnbhVol comp

FROM Pilote WHERE comp = lsquoAFrsquo

OPEN curs1

FETCH curs1 INTO v1v2v3

END

$

curs1

PL -1 2450 AF PL -2 900 AF PL -5 200 AF

v1 v2 v3

PL -1 2450 AF

Curseur

DECLARE v1

Tableau 7-5 Instructions pour les curseurs

Instructions Commentaires et exemples

CURSOR FOR requecircte Deacuteclaration du curseur DECLARE curs1 CURSOR FOR SELECT brevetnbHVolcomp FROM bdsoutouPilote WHERE comp = AF

OPEN nomCurseur Ouverture du curseur (chargement des lignes) Aucune exception nrsquoestleveacutee si la requecircte ne ramegravene aucune ligne OPEN curs1

FETCH nomCurseur INTO listeVariables

Positionnement sur la ligne suivante et chargement de lrsquoenregistrementcourant dans une ou plusieurs variables FETCH curs1 INTO var1var2var3

CLOSE nomCurseur Ferme le curseur Lrsquoexception laquo ERROR 1326 (24000) Cursor isnot open raquo se deacuteclenche si des accegraves au curseur sont opeacutereacutes apregravessa fermeture CLOSE curs1

4055_07_C07 Page 245 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

246 copy Eacuteditions Eyrolles

Parcours drsquoun curseur

Vous pouvez choisir drsquoutiliser une structure reacutepeacutetitive tant que ou reacutepeacuteter Le tableau suivantpreacutesente le parcours drsquoun curseur agrave lrsquoaide de ces deux techniques Ici il srsquoagit de faire lasomme des heures de vol des pilotes de la compagnie de code AF

Notez lrsquoutilisation obligatoire drsquoune exception (handler dans le vocable de MySQL) qui forcele programme agrave continuer si on arrive en fin du curseur (au-delagrave du dernier enregistrement)tout en positionnant la variable curs1 agrave vrai (1) Je dis laquo obligatoire raquo car MySQL nepropose pas pour lrsquoheure de fonctions sur les curseurs (FOUND NOT_FOUND IS_CLOSEDetc) Nous eacutetudierons plus en deacutetail les exceptions dans la prochaine section

Personnellement je preacutefegravere la programmation avec un tant que Lrsquoappel de cette proceacutedure(avec lrsquoune ou lrsquoautre des techniques) sur la table de la figure 7-2 produira le reacutesultat suivant

+---------------------------------------+

| Total heures pour les pilotes de AF |

+---------------------------------------+

| 355000 |

+---------------------------------------+

Tableau 7-6 Parcours drsquoun curseur

Tant que Reacutepeacuteter

DECLARE fincurs1 BOOLEAN DEFAULT 0DECLARE v_nbHv DECIMAL(72)DECLARE v_tot DECIMAL(82) DEFAULT 0

DECLARE CONTINUE HANDLER FOR NOT FOUND SET fincurs1 = 1

REPEAT IF NOT fincurs1 THEN SET v_tot = v_tot+v_nbHv END IF UNTIL fincurs1 END REPEAT

WHILE (NOT fincurs1) DO SET v_tot = v_tot+v_nbHv END WHILE

SELECT v_tot AS Total heures pour les pilotes de AF

Web

DECLARE curs1 CURSOR FORSELECT nbHVol FROM bdsoutouPilote WHERE comp = AF

OPEN curs1

FETCH curs1 INTO v_nbHv FETCH curs1 INTO v_nbHv

FETCH curs1 INTO v_nbHv

CLOSE curs1

4055_07_C07 Page 246 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 247

chapitre ndeg 7 Programmation avanceacutee

Accegraves concurrents (FOR UPDATE)

Si vous voulez verrouiller les lignes drsquoune table interrogeacutee par un curseur dans le but de mettreagrave jour la table sans qursquoun autre utilisateur ne la modifie en mecircme temps il faut utiliser laclause FOR UPDATE Elle srsquoemploie lors de la deacuteclaration du curseur et verrouille les lignesconcerneacutees degraves lrsquoouverture du curseur Les verrous sont libeacutereacutes agrave la fin de la transaction

Il est souvent inteacuteressant de pouvoir modifier facilement la ligne courante drsquoun curseur(UPDATE ou DELETE) agrave reacutepercuter au niveau de la table Il est conseilleacute drsquoutiliser un curseurFOR UPDATE pour verrouiller les lignes agrave actualiser

Le tableau suivant deacutecrit un bloc qui se sert du curseur FOR UPDATE pour

augmenter le nombre drsquoheures de 100 pour les pilotes de la compagnie de code AF

diminuer ce nombre de 100 pour les pilotes de la compagnie de code SING

supprimer les pilotes des autres compagnies

Tableau 7-7 Curseur avec verrouillage explicite

Code MySQL Commentaires

BEGIN DECLARE fincurs BOOLEAN DEFAULT 0 DECLARE v_brevet VARCHAR(6) DECLARE v_nbHv DECIMAL(72) DECLARE v_comp VARCHAR(4) DECLARE CONTINUE HANDLER FOR NOT FOUND SET fincurs = 1SET AUTOCOMMIT = 0OPEN cursFETCH curs INTO v_brevetv_nbHvv_compWHILE (NOT fincurs) DO IF (v_comp=AF) THEN UPDATE bdsoutouPilote SET nbHVol = nbHVol + 100 WHERE brevet = v_brevet ELSEIF (v_comp=SING) THEN UPDATE bdsoutouPilote SET nbHVol = nbHVol - 100 WHERE brevet = v_brevet ELSE DELETE FROM bdsoutouPilote WHERE brevet = v_brevet END IF FETCH curs INTO v_brevetv_nbHvv_comp END WHILECLOSE cursCOMMIT

Deacuteclaration du curseur avec verrou

Chargement et parcours du curseur

Mise agrave jour de la table Pilote par lrsquointermeacutediaire du curseur

Validation de la transaction

Web

DECLARE curs CURSOR FORSELECT brevetnbHVolcompFROM bdsoutouPilote FOR UPDATE

4055_07_C07 Page 247 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

248 copy Eacuteditions Eyrolles

Restrictions

bull Une validation (COMMIT) avant la fermeture drsquoun curseur FOR UPDATE aura des effets debord facirccheux

bull Il nrsquoest pas possible de deacuteclarer un curseur FOR UPDATE en utilisant dans la requecircte lesdirectives DISTINCT ou GROUP BY un opeacuterateur ensembliste ou une fonction drsquoagreacutegat

bull Il nrsquoexiste pas encore de directive WHERE CURRENT OF pour modifier lrsquoenregistrement cou-rant drsquoun curseur avec verrou

bull Un curseur comme un tableau ne peut pas ecirctre passeacute en paramegravetre drsquoun sous-programmeni en entreacutee (IN) ni en sortie (OUT)

Exceptions

Afin drsquoeacuteviter qursquoun programme ne srsquoarrecircte degraves la premiegravere erreur suite agrave une instruction SQL(SELECT ne retournant aucune ligne INSERT ou UPDATE drsquoune valeur incorrecte DELETEdrsquoun enregistrement laquo pegravere raquo ayant des enregistrements laquo fils raquo associeacutes etc) il est indispen-sable de preacutevoir les cas potentiels drsquoerreurs et drsquoassocier agrave chacun de ces cas la programmationdrsquoune exception (handler dans le vocabulaire de MySQL)

Dans le langage des informaticiens on dit qursquoon garde la main pendant lrsquoexeacutecution duprogramme Le meacutecanisme des exceptions (handling errors) est largement utiliseacute par tous lesdeacuteveloppeurs car il est preacutepondeacuterant dans la mise en œuvre des transactions Les exceptionspeuvent se parameacutetrer dans un sous-programme (fonction ou proceacutedure catalogueacutee) ou undeacuteclencheur

Geacuteneacuteraliteacutes

Une exception MySQL correspond agrave une condition drsquoerreur et peut ecirctre associeacutee agrave un identifi-cateur (exception nommeacutee) Une exception est deacutetecteacutee (aussi dite laquo leveacutee raquo) si elle est preacutevuedans un handler au cours de lrsquoexeacutecution drsquoun bloc (entre BEGIN et END) Une fois leveacutee ellefait continuer (ou sortir du bloc) le programme apregraves avoir reacutealiseacute une ou plusieurs instructionsque le programmeur aura explicitement speacutecifieacutees

La figure suivante illustre les deux meacutecanismes qui peuvent ecirctre mis en œuvre pour geacuterer uneexception (seuls CONTINUE et EXIT sont actuellement pris en charge par MySQL) Suppo-sons que lrsquoextraction ne ramegravene aucune ligne on peut programmer la sortie du bloc courant oucontinuer dans le bloc Supposons que lrsquoinsertion deacuteclenche une erreur on peut eacutegalementdeacutecider de sortir ou de poursuivre le traitement

4055_07_C07 Page 248 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 249

chapitre ndeg 7 Programmation avanceacutee

Si aucune erreur ne se produit le traitement se termine ou retourne agrave son appelant srsquoil srsquoagitdrsquoun sous-programme lanceacute drsquoun programme principal La syntaxe geacuteneacuterale drsquoune exceptionest la suivante Les exceptions doivent ecirctre deacuteclareacutees de preacutefeacuterence apregraves les variables et avantles curseurs

DECLARE CONTINUE | EXIT | UNDO

HANDLER FOR

SQLSTATE [VALUE] lsquovaleur_sqlstatersquo | nomException | SQLWARNING

| NOT FOUND | SQLEXCEPTION | code_erreur_mysql

instructions MySQL

[ SQLSTATE ]

La directive CONTINUE (appeleacutee handler) force agrave poursuivre lrsquoexeacutecution de programmelorsqursquoil se passe un eacuteveacutenement preacutevu dans la clause FOR

Le handler EXIT fait sortir lrsquoexeacutecution du bloc courant (entre BEGIN et END)

Le handler UNDO nrsquoest pas encore reconnu Agrave son nom on se doute de son utiliteacute agrave savoirdeacutefaire les instructions SQL qui auront eacuteteacute exeacutecuteacutees (sans avoir eacuteteacute valideacutees par un COMMIT)avant que lrsquoexception ne se deacuteclenche

SQLSTATE permet de couvrir toutes les erreurs drsquoun eacutetat donneacute

nomException srsquoapplique agrave la gestion des exceptions nommeacutees (eacutetudieacutees plus loin)

SQLWARNING permet de couvrir toutes les erreurs drsquoeacutetat SQLSTATE deacutebutant par 01

NOT FOUND permet de couvrir toutes les erreurs drsquoeacutetat SQLSTATE deacutebutant par 02

Figure 7-4 Principe geacuteneacuteral des exceptions

BEGIN

DECLARE CONTINUE | EXIT | UNDO

HANDLER FOR

SQLSTATE v | SQLEXCEPTION | NOT FOUND | erreurMySQL hellip

BEGIN

SELECT INTO FROM

INSERT

END

END

NOT FOUND

EXIT

CONTINUE

CONTINUE

EXITSQLEXCEPTION

4055_07_C07 Page 249 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

250 copy Eacuteditions Eyrolles

SQLEXCEPTION gegravere toutes les erreurs qui ne sont ni geacutereacutees par SQLWARNING ni par NOTFOUND

instructions MySQL une ou plusieurs instructions du langage de MySQL (blocappel possibles par CALL drsquoune fonction ou drsquoune proceacutedure catalogueacutee)

Il est possible de grouper plusieurs deacuteclarations drsquoexceptions ainsi que de preacutevoir plusieursconditions pour une mecircme exception En plus de pouvoir tester des erreurs pour tel ou tel eacutetat(SQLSTATE) nous verrons que lrsquoon peut reacutecupeacuterer une erreur de code donneacute (paramegravetrecode_erreur_mysql) Par exemple ERROR 1046 deacutesigne la non seacutelection drsquoune base dedonneacutees (1046 devra ecirctre eacutecrit en lieu et place de code_erreur_mysql)

Restrictions

Il nrsquoest pas encore possible de deacuterouter volontairement lrsquoexeacutecution drsquoun sous-programme aveccertaines conditions par lrsquointermeacutediaire drsquoune instruction speacutecifique comme RAISE ou RESI-GNAL Lrsquoexception serait ainsi manuellement deacuteclencheacutee et pourrait ecirctre deacutefinie par le program-meur (par exemple la condition PILOTE_TROP_JEUNE si lrsquoacircge drsquoun pilote est infeacuterieur agrave20 ans)

Il nrsquoest pas non plus permis de deacuteclarer ses propres exceptions (par exemple pour pouvoirdeacuterouter le sous-programme si lrsquoacircge drsquoun pilote est infeacuterieur agrave une valeur donneacutee)

Eacutetudions agrave preacutesent les diffeacuterents types drsquoexceptions en programmant des proceacutedures simplesinterrogeant la table Pilote illustreacutee agrave la figure 7-2

Exceptions avec EXITExaminons la clause EXIT de lrsquoinstruction DECLARE HANDLER agrave travers un exemple

Gestion de NOT FOUND

Le tableau suivant deacutecrit une proceacutedure qui gegravere une erreur aucun pilote nrsquoest associeacute agrave lacompagnie de code passeacute en paramegravetre (NOT FOUND) La proceacutedure ne se termine pas correc-tement si plusieurs lignes sont retourneacutees (erreur Result consisted of more thanone row)

4055_07_C07 Page 250 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 251

chapitre ndeg 7 Programmation avanceacutee

La trace drsquoune exeacutecution correcte de cette proceacutedure (si la requecircte retourne une seule ligne laproceacutedure ne passe pas dans le si) est la suivante

CALL bdsoutouprocException1(CAST)$

+--------------------------------------------------------+

| Resultat procException1 |

+--------------------------------------------------------+

| Le seul pilote de la compagnie CAST est Sonia Dietrich |

+--------------------------------------------------------+

Une autre exeacutecution correcte de cette proceacutedure (qui se deacuteroute hors du bloc du fait de NOTFOUND) est la suivante

CALL bdsoutouprocException1(RIEN)$

+-----------------------------------------------+

| Resultat procException1 |

+-----------------------------------------------+

| Il ny a pas de pilote pour la compagnie RIEN |

+-----------------------------------------------+

Tableau 7-8 Exception NOT FOUND traiteacutee avec EXIT

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 END IFEND

Deacuteclaration de la proceacutedure et des variables

Bloc qui deacuteclare lrsquoexception

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Affichage du reacutesultat

Fin du blocGestion de lrsquoerreur

Fin de la proceacutedure

Web

BEGIN SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END

DECLARE EXIT HANDLER FOR NOT FOUNDSET flagNOTFOUND =1

4055_07_C07 Page 251 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

252 copy Eacuteditions Eyrolles

Gestion drsquoune erreur particuliegravere

Le tableau suivant deacutecrit une ameacutelioration de la preacuteceacutedente proceacutedure par le fait de geacutererlrsquoerreur particuliegravere permettant de savoir si la requecircte renvoie plusieurs lignes (ERROR 1172(42000) Result consisted of more than one row) La proceacutedure se terminemaintenant correctement si la requecircte retourne une seule ligne ou plusieurs (message person-naliseacute en sortie de bloc)

La trace drsquoune exeacutecution correcte de cette proceacutedure (qui se deacuteroute hors du bloc du fait deplusieurs lignes retourneacutees) est la suivante

Tableau 7-9 Exceptions 1172 et NOT FOUND traiteacutees avec EXIT

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagPlusDun BOOLEAN DEFAULT 0 DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 END IF IF flagPlusDun THEN SELECT CONCAT(Il y a plusieurs pilotes pour la compagnie p_comp) AS Resultat procException1 END IFEND

Deacuteclaration de la proceacutedure et des variables

Bloc qui deacuteclare les deux exceptions

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Affichage du reacutesultat

Fin du bloc

Gestion des erreurs

Fin de la proceacutedure

Web

BEGIN DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND =1

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END

DECLARE EXIT HANDLER FOR 1172SET flagPlusDun =1

4055_07_C07 Page 252 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 253

chapitre ndeg 7 Programmation avanceacutee

CALL bdsoutouprocException1(AF)$

+-----------------------------------------------+

| Resultat procException1 |

+-----------------------------------------------+

| Il y a plusieurs pilotes pour la compagnie AF |

+-----------------------------------------------+

Appel drsquoune proceacutedure dans lrsquoexception

Le tableau suivant deacutecrit lrsquoappel drsquoune proceacutedure dans le cas de lrsquoerreur NOT FOUND La proceacute-dure principale exeacutecute le sousndashprogramme puis sort du bloc principal et se termine correctement

La trace drsquoune exeacutecution correcte de cette proceacutedure (qui se deacuteroute vers le sous-programmeappeleacute du fait de NOT FOUND) est la suivante

+-----------------------------------------------+

| Resultat procpasTrouve |

+-----------------------------------------------+

| Il ny a pas de pilote pour la compagnie RIEN |

+-----------------------------------------------+

Il est aiseacute de transposer ce raisonnement agrave plusieurs exceptions appelant diffeacuterents sous-programmes

Tableau 7-10 Exception NOT FOUND traiteacutee avec EXIT et CALL

Code MySQL Commentaires

CREATE PROCEDURE bdsoutoupasTrouve (IN p_comp VARCHAR(4)) BEGIN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procpasTrouveEND

Codage du sous-programme appeleacute lors de lrsquoexception

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE var1 VARCHAR(20)

Proceacutedure qui deacuteclare lrsquoexception

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp = p_comp SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1

Requecircte pouvant deacuteclencher lrsquoexception preacutevueAffichage du reacutesultat

END Fin de la proceacutedure principale

Web

DECLARE EXIT HANDLER FOR NOT FOUNDCALL bdsoutoupasTrouve(p_comp)

4055_07_C07 Page 253 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

254 copy Eacuteditions Eyrolles

Exceptions avec CONTINUEEacutetudions agrave preacutesent la clause CONTINUE de lrsquoinstruction DECLARE HANDLER

Gestion de NOT FOUND

Le tableau suivant deacutecrit la mecircme proceacutedure geacuterant lrsquoerreur NOT FOUND La proceacutedure setermine correctement si la requecircte retourne une seule ligne mais pas lorsqursquoelle en renvoieplusieurs (erreur Result consisted of more than one row)

Gestion drsquoune erreur particuliegravere

Le tableau suivant deacutecrit la mecircme proceacutedure qui gegravere en plus lrsquoerreur Result consistedof more than one row La proceacutedure se termine correctement si la requecircte retourne uneseule ou plusieurs lignes

Tableau 7-11 Exception NOT FOUND traiteacutee avec CONTINUE

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

Deacuteclaration de la proceacutedure et des variables

Bloc qui deacuteclare lrsquoexception

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 ELSE SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END IF

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Test de gestion de lrsquoerreur

Affichage du reacutesultat

END Fin de la proceacutedure

Web

DECLARE CONTINUE HANDLER FOR NOT FOUNDSET flagNOTFOUND =1

4055_07_C07 Page 254 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 255

chapitre ndeg 7 Programmation avanceacutee

Gestion des autres erreurs (SQLEXCEPTION)

Si une erreur non preacutevue en tant qursquoexception (dans les clauses DECLARE HANDLER) seproduisait le programme se terminerait anormalement en renvoyant lrsquoerreur en question Ladirective SQLEXCEPTION couvre toutes les erreurs qui ne sont administreacutees ni par SQLWAR-NING ni par NOT FOUND

Dans notre exemple (seacutelection drsquoune colonne drsquoune table) seule une erreur laquo interne raquo pour-rait eacuteventuellement se produire (base de donneacutees ou table inexistante colonne de la tableinexistante ou drsquoun type diffeacuterent de VARCHAR(4) ou autre erreur systegraveme)

MySQL ne permet pas pour lrsquoinstant de reacutecupeacuterer dynamiquement au sein drsquoun sous-pro-gramme le code et le message de lrsquoerreur associeacutee agrave une exception leveacutee suite agrave une instruc-tion SQL et qui nrsquoa pas eacuteteacute preacutevue dans un handler

Tableau 7-12 Exceptions 1172 et NOT FOUND traiteacutees avec CONTINUE

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE flagPlusDun BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

Deacuteclaration de la proceacutedure et des variables

DECLARE CONTINUE HANDLER FOR NOT FOUND SET flagNOTFOUND =1

Bloc qui deacuteclare les deux exceptions

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 ELSEIF flagPlusDun THEN SELECT CONCAT(Il y a plusieurs pilotes pour la compagnie p_comp) AS Resultat procException1 ELSE SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END IF

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Test de gestion des erreurs

Affichage du reacutesultat

END Fin de la proceacutedure

Web

DECLARE CONTINUE HANDLER FOR 1172SET flagPlusDun =1

4055_07_C07 Page 255 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

256 copy Eacuteditions Eyrolles

En drsquoautres termes il faudra soit

interrompre brusquement votre proceacutedure avec diffeacuterents cas drsquoerreurs pour lister lescodes erreur geacuteneacutereacutes en sortie

vous contenter de geacuterer globalement les autres exceptions tout en ne sachant pas de quel-les erreurs il srsquoagit

Le tableau suivant deacutecrit la preacuteceacutedente proceacutedure qui controcircle en plus toutes les autres erreursnon preacutevues en appelant le sous-programme autreErreur()

Tableau 7-13 Exceptions toutes traiteacutees avec EXIT et SQLEXCEPTION

Code MySQL Commentaires

CREATE PROCEDURE bdsoutoutropdeLignes (IN p_comp VARCHAR(4))BEGIN SELECT CONCAT(Il y a plusieurs pilotes pour la compagnie p_comp) AS Resultat tropdeLignesEND

Codage des sous-programmesappeleacutes lors des exceptions

CREATE PROCEDURE bdsoutoupasTrouve (IN p_comp VARCHAR(4)) BEGIN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat pasTrouveEND

CREATE PROCEDURE bdsoutouautreErreur()BEGIN SELECT Erreur mais laquelle AS Resultat autreErreur 3 casEND

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE var1 VARCHAR(20) DECLARE EXIT HANDLER FOR 1172 CALL bdsoutoutropdeLignes(p_comp) DECLARE EXIT HANDLER FOR NOT FOUND CALL bdsoutoupasTrouve(p_comp) SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp = p_comp SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1

Proceacutedure principale qui deacuteclareles deux exceptions et toutes lesautres

Requecircte pouvant deacuteclencherlrsquoexception preacutevueAffichage du reacutesultat

END Fin de la proceacutedure

Web

DECLARE EXIT HANDLER FOR SQLEXCEPTIONCALL bdsoutouautreErreur()

4055_07_C07 Page 256 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 257

chapitre ndeg 7 Programmation avanceacutee

La trace drsquoune exeacutecution de cette proceacutedure (quelle que soit la valeur du paramegravetre passeacute enentreacutee) suite agrave la suppression de la table Pilote dans la base bdsoutou est la suivante

CALL bdsoutouprocException1(AF)$

+-----------------------+

| Resultat autreErreur |

+-----------------------+

| Erreur mais laquelle |

+-----------------------+

Mecircme erreur sur diffeacuterentes instructions

Plusieurs cas de figure sont possibles suivant qursquoon deacutesire maicirctriser une exception ou terminertoutes les exceptions avant la fin du sous-programme

Gestion drsquoune seule exception

Le tableau suivant deacutecrit une proceacutedure qui gegravere deux fois lrsquoerreur non trouveacutee (NOT FOUND)sur deux requecirctes distinctes La premiegravere requecircte extrait le nom du pilote de code passeacute en para-megravetre La deuxiegraveme donne le nom du pilote ayant un nombre drsquoheures de vol eacutegal agrave celui passeacuteen paramegravetre Le sous-programme se termine correctement si les deux requecirctes ne retournentqursquoun seul enregistrement Les autres erreurs potentielles ne sont pas prises en compte

Le principe est drsquoutiliser une variable indiquant quelle est la requecircte qui a fait sortir du blocpar lrsquoexception leveacutee

Exeacutecutons cette proceacutedure avec diffeacuterents paramegravetres on obtient

CALL bdsoutouprocException2(PL-1 1000)$

+------------------------------------------------------+

| CONCAT(Le pilote de code p_brevet est v_nom) |

+------------------------------------------------------+

| Le pilote de code PL-1 est Gilles Laborde |

+------------------------------------------------------+

+----------------------------------------------------------------+

| CONCAT(Le pilote ayant p_heures heures de vol est v_nom) |

+----------------------------------------------------------------+

| Le pilote ayant 1000 heures de vol est Florence Peacuterissel |

+----------------------------------------------------------------+

CALL bdsoutouprocException2(PL-0 2450)$

+-----------------------------------------------+

| CONCAT(Pas de pilote de brevet p_brevet) |

+-----------------------------------------------+

| Pas de pilote de brevet PL-0 |

+-----------------------------------------------+

4055_07_C07 Page 257 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

258 copy Eacuteditions Eyrolles

Dans cette proceacutedure une erreur sur la premiegravere requecircte interrompt le programme (apregraves avoirtraiteacute lrsquoexception) et de ce fait la deuxiegraveme requecircte nrsquoest pas eacutevalueacutee Pour cela il est inteacuteres-sant drsquoutiliser des blocs imbriqueacutes pour poursuivre le traitement apregraves avoir traiteacute une ouplusieurs exceptions

Gestion de plusieurs exceptions

Le tableau suivant deacutecrit une proceacutedure qui traite toutes les mecircmes exceptions en seacutequenceCe meacutecanisme permet de continuer lrsquoexeacutecution apregraves que MySQL a leveacute une exception Danscette proceacutedure les deux requecirctes sont eacutevalueacutees indeacutependamment du reacutesultat retourneacute parchacune drsquoelles

Tableau 7-14 Une exception NOT FOUND traiteacutee pour deux instructions

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException2 (IN p_brevet VARCHAR(6)IN p_heures DECIMAL(72)) BEGIN DECLARE v_nom VARCHAR(20) DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE v_requete TINYINT

IF flagNOTFOUND THEN IF v_requete = 1 THEN SELECT CONCAT(Pas de pilote de brevet p_brevet) ELSEIF v_requete = 2 THEN SELECT CONCAT(Pas de pilote ayant ce nombre dheures de vol p_heures) END IF END IFEND

Bloc avec les requecirctes deacuteclenchant potentiellement une exception preacutevue

Traitement pour savoir quelle requecircte a provoqueacute lrsquoexception

Web

BEGIN

SET v_requete = 1 SELECT nom INTO v_nom FROM bdsoutouPilote WHERE brevet = p_brevet SELECT CONCAT(Le pilote de code p_brevet est v_nom) SET v_requete = 2 SELECT nom INTO v_nom FROM bdsoutouPilote WHERE nbHVol = p_heures SELECT CONCAT(Le pilote ayant p_heures heures de vol est v_nom) END

DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND =1

4055_07_C07 Page 258 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 259

chapitre ndeg 7 Programmation avanceacutee

Lrsquoexeacutecution suivante de cette proceacutedure deacuteclenche les deux exceptions (ce qui nrsquoeacutetait pas lecas dans la proceacutedure preacuteceacutedente)

CALL bdsoutouprocException3(PL-0 500)$

+-----------------------------------------------+

| CONCAT(Pas de pilote de brevet p_brevet) |

+-----------------------------------------------+

| Pas de pilote de brevet PL-0 |

+-----------------------------------------------+

+-----------------------------------------------------------------+

| CONCAT(Pas de pilote ayant ce nombre dheures de vol p_heures) |

+-----------------------------------------------------------------+

| Pas de pilote ayant ce nombre dheures de vol 500 |

+-----------------------------------------------------------------+

Il resterait agrave programmer lrsquoexception ERROR 1172 (Result consisted of morethan one row) pour geacuterer au niveau de la seconde requecircte lrsquoextraction de plusieurs pilotes

Tableau 7-15 Exceptions NOT FOUND toutes traiteacutees

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException3 (IN p_brevet VARCHAR(6)IN p_heures DECIMAL(72))BEGIN DECLARE v_nom VARCHAR(20) DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 SELECT nom INTO v_nom FROM bdsoutouPilote WHERE brevet = p_brevet IF flagNOTFOUND THEN SELECT CONCAT(Pas de pilote de brevet p_brevet) SET flagNOTFOUND = 0 ELSE SELECT CONCAT(Le pilote de code p_brevet est v_nom) END IF

Gestion de lrsquoexception de la premiegravere requecircte

SELECT nm INTO v_nom FROM bdsoutouPilote WHERE nbHVol = p_heures IF flagNOTFOUND THEN SELECT CONCAT(Pas de pilote ayant ce nombre d heures de vol p_heures) ELSE SELECT CONCAT(Le pilote ayant p_heures heures de vol est v_nom) END IFEND

Gestion de lrsquoexception de la deuxiegraveme requecircte

Web

DECLARE CONTINUE HANDLER FOR NOT FOUNDSET flagNOTFOUND = 1

4055_07_C07 Page 259 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

260 copy Eacuteditions Eyrolles

ayant un mecircme nombre drsquoheures de vol Deux solutions srsquooffrent agrave vous dans un sous-blocavec EXIT ou dans le mecircme bloc avec un CONTINUE et une variable pour tester lrsquoeacuteventuelleredirection

Afin de deacuteclarer drsquoautres exceptions il faut consulter la liste des erreurs dans la documentationofficielle (Appendix B Error Codes and Messages) de maniegravere agrave connaicirctre le numeacutero drsquoerreurMySQL (paramegravetre code_erreur_mysql dans la syntaxe DECLARE HANDLER)

Vous pouvez aussi eacutecrire un bloc qui programme volontairement lrsquoerreur pour voir sous lrsquointer-face de commande le numeacutero que MySQL renvoie

Exceptions nommeacutees

Pour intercepter une erreur MySQL et lui attribuer au passage un identificateur il faut utiliserla clause DECLARE CONDITION La syntaxe est la suivante

Deacuteclaration

DECLARE nomException CONDITION FOR

SQLSTATE [VALUE] lsquovaleur_sqlstatersquo | code_erreur_mysql

Il est ainsi possible de regrouper plusieurs types drsquoerreurs (avec SQLSTATE ou cibler une erreuren particulier en indiquant le code erreur de MySQL) Une fois lrsquoexception nommeacutee il est possi-ble de lrsquoutiliser dans la deacuteclaration de lrsquoeacuteveacutenement associeacute via la directive DECLARE HANDLER

Deacuteclenchement

Consideacuterons les deux tables suivantes La colonne comp de la table Pilote est une cleacute eacutetran-gegravere vers la table Compagnie Programmons une proceacutedure qui supprime une compagnie decode passeacute en paramegravetre

Le tableau suivant deacutecrit la proceacutedure procExceptionNommee qui intercepte une erreurreacutefeacuterentielle (SQLSTATE agrave 23 000) Il srsquoagit de controcircler le programme si la compagnie agravedeacutetruire est encore rattacheacutee agrave un enregistrement reacutefeacuterenceacute dans la table Pilote

Figure 7-5 Deux tables

Compagnie

comp ville nomComp

AF Paris Air FranceSING Singapour Singapore AL

CAST Blagnac Castanet AL EJET Dublin Easy Jet

Pilote

brevet nom nbHVol comp

PL-1 Gilles Laborde 2450 AF PL-2 Freacutedeacuteric DAlmeyda 900 AF PL-3 Florence Peacuterissel 1000 SING PL-4 Thierry Millan 2450 CAST PL-5 Christine Royo 200 AF PL-6 Aureacutelia Ente 2450 SINGagrave deacutetruire

4055_07_C07 Page 260 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 261

chapitre ndeg 7 Programmation avanceacutee

Les traces de lrsquoexeacutecution de cette proceacutedure sont les suivantes Notez que si on appelle cetteproceacutedure en passant en paramegravetre une compagnie inexistante le sous-programme se terminenormalement sans passer dans la section drsquoerreur

CALL bdsoutouprocExceptionNommee(AF)$

+-----------------------------------------------------+

| Resultat procExceptionNommee |

+-----------------------------------------------------+

| Deacutesoleacute il reste encore un pilote agrave la compagnie AF |

+-----------------------------------------------------+

CALL bdsoutouprocExceptionNommee(EJET)$

+------------------------------+

| Resultat procExceptionNommee |

+------------------------------+

| Compagnie EJET deacutetruite |

+------------------------------+

Tableau 7-16 Programmation drsquoune exception nommeacutee

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocExceptionNommee (IN p_comp VARCHAR(4))BEGIN DECLARE flagerr BOOLEAN DEFAULT 0

Deacuteclaration de lrsquoexception nommeacutee

Corps du traitement (valida-tion)

BEGIN DECLARE EXIT HANDLER FOR SET flagerr =1 SET AUTOCOMMIT=0 DELETE FROM Compagnie WHERE comp = p_comp SELECT CONCAT(Compagnie p_comp deacutetruite) AS Resultat procExceptionNommee END IF flagerr THEN ROLLBACK SELECT CONCAT(Deacutesoleacute il reste encore un pilote agrave la compagnie p_comp) AS Resultat procExceptionNommee ELSE COMMIT END IFEND

Gestion de lrsquoexception

Web

DECLARE erreur_ilResteUnPilote CONDITIONFOR SQLSTATE 23000

erreur_ilResteUnPilote

4055_07_C07 Page 261 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

262 copy Eacuteditions Eyrolles

Deacuteclencheurs

Concernant MySQL les deacuteclencheurs nrsquoexistent que depuis la version 5 Comme nous leverrons ils sont limitatifs en termes de fonctionnaliteacutes et relativement instables (P Gulutzancitait en parlant de la version becircta dans son livre blanc toujours preacutesent (au moment de lrsquoimpres-sion de ce livre) en page drsquoaccueil du site de MySQL MySQL 50 Triggers laquo Triggers are verynew There are bugs hellip Do not try triggers with a database that has important data in ithellip raquo)

Bien que beaucoup drsquoameacuteliorations aient eacuteteacute apporteacutees les deacuteclencheurs qui modifient lestables ne sont pas encore agrave mon sens tout agrave fait fiables Prudence donc avec vos donneacuteesToutes les limitations que nous allons deacutetailler seront sans doute reacutesolues au fur et agrave mesuredes prochaines versions majeures du serveur Songez qursquoavant la version 5010 lesdeacuteclencheurs ne pouvaient mecircme pas acceacuteder agrave la base

Geacuteneacuteraliteacutes

Drsquoun point de vue geacuteneacuteral et sans parler de MySQL la plupart des deacuteclencheurs (triggers)peuvent ecirctre vus comme des sous-programmes reacutesidents associeacutes agrave un eacuteveacutenement particulier(insertion modification drsquoune ou de plusieurs colonnes suppression) sur une table (ou unevue) Une table (ou vue) peut laquo heacuteberger raquo plusieurs deacuteclencheurs ou aucun Pour certainsSGBD il existe drsquoautres types de deacuteclencheurs que ceux associeacutes agrave une table (ou vue) afin dereacutepondre agrave des eacuteveacutenements qui ne concernent pas les donneacutees (exemple connexion drsquounutilisateur particulier suppression drsquoune table deacutemarrage ou arrecirct du serveur deacuteconnexiondrsquoun utilisateur etc)

Agrave la diffeacuterence des sous-programmes lrsquoexeacutecution drsquoun deacuteclencheur nrsquoest pas explicite (parCALL par exemple) crsquoest lrsquoeacuteveacutenement de mise agrave jour de la table qui lance automatiquement lecode programmeacute dans le deacuteclencheur On dit que le deacuteclencheur laquo se deacuteclenche raquo (lrsquoanglais letraduit mieux fired trigger)

Agrave quoi sert un deacuteclencheur

En theacuteorie un deacuteclencheur permet de

Programmer toutes les regravegles de gestion qui nrsquoont pas pu ecirctre mises en place par descontraintes au niveau des tables Par exemple la condition une compagnie ne fait volerun pilote que srsquoil a totaliseacute plus de 60 heures de vol dans les 2 derniers mois sur le typedrsquoappareil du vol en question ne pourra pas ecirctre programmeacutee par une contrainte et neacuteces-sitera lrsquoutilisation drsquoun deacuteclencheur

Deacuteporter des contraintes au niveau du serveur et alleacuteger ainsi la programmation client Renforcer des aspects de seacutecuriteacute et drsquoaudit Programmer lrsquointeacutegriteacute reacutefeacuterentielle et la reacuteplication dans des architectures distribueacutees

avec lrsquoutilisation de liens de bases de donneacutees

4055_07_C07 Page 262 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 263

chapitre ndeg 7 Programmation avanceacutee

En theacuteorie les eacuteveacutenements deacuteclencheurs peuvent ecirctre

une instruction INSERT UPDATE ou DELETE sur une table (ou vue) On parle de deacuteclen-cheurs LMD

une instruction CREATE ALTER ou DROP sur un objet (table vue index etc) On parlede deacuteclencheurs LDD

le deacutemarrage ou lrsquoarrecirct de la base (startup ou shutdown) une erreur speacutecifique (not foundduplicate key etc) une connexion ou une deacuteconnexion drsquoun utilisateur On parle dedeacuteclencheurs drsquoinstances

En pratique dans MySQL seuls les eacuteveacutenements de la premiegravere cateacutegorie sont pris en compte

Meacutecanisme geacuteneacuteral

Auparavant consideacutereacutes au niveau table les deacuteclencheurs sont deacutesormais attacheacutes agrave plus justetitre au niveau database En conseacutequence le nom drsquoun deacuteclencheur doit ecirctre unique pourchaque base de donneacutees En revanche diffeacuterentes bases peuvent heacuteberger un deacuteclencheur demecircme nom

La figure suivante illustre les quatre eacutetapes agrave suivre pour mettre complegravetement en œuvre undeacuteclencheur (de la creacuteation agrave son test) Il faut drsquoabord le coder (comme un sous-programme)puis le compiler (il est pour lrsquoinstant stockeacute indeacutependamment de la table mais il devrait y ecirctreinclus dans les prochaines versions) Par la suite au cours du temps chaque eacuteveacutenement (quicaracteacuterise le deacuteclencheur) aura pour conseacutequence son exeacutecution

Syntaxe

Pour pouvoir creacuteer un deacuteclencheur vous devez disposer du privilegravege SUPER (le privilegravegeCREATE TRIGGER est agrave venir) Un deacuteclencheur est composeacute de deux parties la descriptionde lrsquoeacuteveacutenement traqueacute et celle de lrsquoaction agrave reacutealiser lorsque lrsquoeacuteveacutenement se produit La syntaxede creacuteation drsquoun deacuteclencheur est la suivante

Figure 7-6 Meacutecanisme des deacuteclencheurs

1 Eacutecriture

CREATE TRIGGER trig1 BEFORE | AFTER nature de lrsquoeacuteveacutenement e1

ON Tab1Bloc drsquoinstructions

2

Compilation

3 Eacuteveacutenement e1sur Tab1

4 Actions codeacutees dans trig1

Tab1trig1

4055_07_C07 Page 263 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

264 copy Eacuteditions Eyrolles

CREATE TRIGGER nomDeacuteclencheur

BEFORE | AFTER DELETE | INSERT | UPDATE

ON nomTable

FOR EACH ROW

instruction |

[etiquette] BEGIN

instructions

END [etiquette]

Les options de cette commande sont les suivantes

BEFORE | AFTER preacutecise la chronologie entre lrsquoaction agrave reacutealiser par le deacuteclencheur LMD etla reacutealisation de lrsquoeacuteveacutenement (BEFORE INSERT exeacutecutera le deacuteclencheur avant de reacutealiserlrsquoinsertion)

DELETE | INSERT | UPDATE preacutecise la nature de lrsquoeacuteveacutenement pour les deacuteclencheurs LMD

ndash Pour DELETE le deacuteclencheur examine les eacuteveacutenements DELETE et REPLACE

ndash Pour INSERT le deacuteclencheur prend en compte les eacuteveacutenements suivants INSERTCREATE SELECT LOAD DATA et REPLACE

ndash Pour UPDATE le deacuteclencheur considegravere seulement lrsquoeacuteveacutenement UPDATE

ON nomTable speacutecifie la table associeacutee au deacuteclencheur LMD

FOR EACH ROW diffeacuterencie les deacuteclencheurs LMD au niveau ligne (le niveau eacutetat nrsquoestpas encorepris en charge)

instruction ou instructions compose le corps du code du deacuteclencheur

Il nrsquoest pas possible de deacutefinir deux deacuteclencheurs distincts sur le mecircme eacuteveacutenement drsquoune tabledonneacutee En revanche il est possible drsquoavoir deux deacuteclencheurs distincts sur la mecircme actiondans une table donneacutee (un deacuteclencheur pour BEFORE UPDATE et un autre pour AFTER UPDATEpar exemple)

Attention agrave ne pas creacuteer de deacuteclencheurs recursifs (exemple drsquoun deacuteclencheur qui exeacutecute uneinstruction lanccedilant elle-mecircme le deacuteclencheur ou deux deacuteclencheurs srsquoappelant en cascadejusqursquoagrave lrsquooccupation de toute la meacutemoire reacuteserveacutee)

Eacutetudions agrave preacutesent plus preacuteciseacutement les caracteacuteristiques du seul type de deacuteclencheur qursquoil estactuellement possible de programmer

Deacuteclencheurs LMD (de lignes)

Pour ce type de deacuteclencheur lrsquoeacuteveacutenement agrave deacuteterminer est une mise agrave jour particuliegravere de labase (ajout modification ou suppression dans une table ou une vue)

4055_07_C07 Page 264 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 265

chapitre ndeg 7 Programmation avanceacutee

Lrsquoexeacutecution est pour lrsquoheure deacutependante du nombre de lignes toucheacutees par lrsquoeacuteveacutenementSeuls les deacuteclencheurs de lignes (row trigger) sont permis car la directive FOR EACH ROWest obligatoire Ils sont pratiques quand on deacutesire utiliser autant de fois le deacuteclencheur qursquoil ya de lignes concerneacutees par une mise agrave jour

Si on deacutesirait exeacutecuter une seule fois le deacuteclencheur quel que soit le nombre de lignesconcerneacutees il faudrait employer un deacuteclencheur drsquoeacutetat (statement trigger) qui nrsquoest pas encorereconnu Pour ce faire il faudrait ne pas indiquer la directive FOR EACH ROW ou preacuteciser FOREACH STATEMENT agrave la place (agrave confirmer avec une prochaine version incluant cetteextension)

Dans lrsquoexemple drsquoune table t1 ayant cinq enregistrements si on programme un deacuteclencheur deniveau ligne avec lrsquoeacuteveacutenement AFTER DELETE et qursquoon lance DELETE FROM t1 ledeacuteclencheur effectuera cinq fois ses instructions (une fois apregraves chaque suppression) Letableau suivant explique ce meacutecanisme

Seuls les deacuteclencheurs de lignes peuvent acceacuteder aux anciennes et aux nouvelles valeurs descolonnes de la ligne affecteacutee par la mise agrave jour preacutevue par lrsquoeacuteveacutenement Les identificateurs OLDet NEW sont programmeacutes pour cela Ce sont des extensions de MySQL agrave la norme SQL(MySQL suit ainsi Oracle dans ce domaine qui propose OLD et NEW)

Un deacuteclencheur de type AFTER ne se lance sur une table t que si le deacuteclencheur de typeBEFORE de la table t (srsquoil existe) et que lrsquoinstruction associeacutee agrave lrsquoeacuteveacutenement se sont correcte-ment deacuterouleacutes

Quand utiliser la directive OLD

Chaque enregistrement qui tente drsquoecirctre supprimeacute drsquoune table qui inclut un deacuteclencheur detype DELETE FOR EACH ROW est deacutesigneacute par OLD au niveau du code du deacuteclencheurLrsquoaccegraves aux colonnes de ce pseudo-enregistrement dans le corps du deacuteclencheur se fait par lanotation pointeacutee

Consideacuterons lrsquoexemple suivant et programmons la regravegle de gestion tout pilote qui perd unequalification doit voir son compteur automatiquement deacutecreacutementer Programmons le deacuteclen-cheur TrigDelQualif qui surveille les suppressions de la table Qualifications et dimi-nue de un la colonne nbQualif pour le pilote concerneacute par la suppression de sa qualification

Tableau 7-17 Exeacutecution drsquoun deacuteclencheur LMD

Nature delrsquoeacuteveacutenement

Eacutetat (statement trigger)sans FOR EACH ROW

Ligne (row trigger)avec FOR EACH ROW

BEFORE Exeacutecution une fois avant la mise agrave jour Exeacutecution avant chaque ligne mise agrave jour

AFTER Exeacutecution une fois apregraves la mise agrave jour Exeacutecution apregraves chaque ligne mise agrave jour

4055_07_C07 Page 265 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

266 copy Eacuteditions Eyrolles

Lrsquoeacuteveacutenement deacuteclencheur est ici AFTER DELETE car il faudra srsquoassurer que la suppressionnrsquoest pas entraveacutee par drsquoeacuteventuelles contraintes reacutefeacuterentielles On utilise un deacuteclencheur FOREACH ROW car srsquoil se produit une suppression de toute la table (DELETE FROM Qualifi-cations) on exeacutecutera autant de fois le deacuteclencheur qursquoil y a de lignes deacutetruites

Chaque enregistrement qui va ecirctre supprimeacute de la table Qualifications est deacutesigneacute parOLD au niveau du code du deacuteclencheur Lrsquoaccegraves aux colonnes de ce pseudo-enregistrementdans le corps du deacuteclencheur se fait par la notation pointeacutee

Le code minimal de ce deacuteclencheur (on ne prend pas en compte le fait qursquoil nrsquoexiste pas depilote de ce code brevet) est deacutecrit dans le tableau suivant

En consideacuterant les donneacutees initiales des tables le test de ce deacuteclencheur sous lrsquointerface decommande est le suivant Par ailleurs la table Qualifications ne contient plus que troisenregistrements

Figure 7-7 Principe du deacuteclencheur TrigDelQualif

BREVET TYPA EXPIRE

------ ---- --------

PL - 1 A340 220605

PL - 1 A330 050205

PL - 1 A320 160104

PL - 2 A320 180104

PL - 3 A330 220106

TypeAvion

TYPA NOMTYPE

--- - --------------------------

A320 Bireacuteacteur Airbus 320

A330 Bireacuteacteur Airbus 330

A340 Quadrireacuteacteur Airbus 340

Pilote

BREVET NOM NBHVOL COMP NBQUALIF------ -------------------- ---------- ---- ----------

DeacuteclencheurTrigDelQualif

1

2

- 13

OLD

DELETE

PL-1 P Caboche 450 AF 3

PL-2 G Lebur 3400 AF 1

PL-3 X Leclercq 900 SING 1

Qualifications

A380 Big-Quadrireacuteacteur 380

Tableau 7-18 Deacuteclencheur apregraves suppression

Code MySQL Commentaires

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

BEGIN UPDATE Pilote SET nbQualif = nbQualif - 1 WHERE brevet = END

Corps du deacuteclencheurMise agrave jour du pilote concerneacute par la suppression

WebCREATE TRIGGER TriDelQualifAFTER DELETE ON QualificationsFOR EACH ROW

OLDbrevet

4055_07_C07 Page 266 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 267

chapitre ndeg 7 Programmation avanceacutee

Quand utiliser la directive NEW

Chaque enregistrement qui tente drsquoecirctre ajouteacute dans la table Qualifications est deacutesigneacutepar NEW au niveau du code du deacuteclencheur Lrsquoaccegraves aux colonnes de ce pseudo-enregistre-ment dans le corps du deacuteclencheur se fait par la notation pointeacutee

Consideacuterons le mecircme exemple et eacutecrivons la regravegle de gestion tout pilote qui gagne une quali-fication doit voir son compteur automatiquement increacutementer Programmons le deacuteclencheurTrigInsQualif qui surveille les insertions sur la table Qualifications et augmente deun la colonne nbQualif pour le pilote concerneacute

Lrsquoeacuteveacutenement deacuteclencheur est ici AFTER INSERT car il faudra srsquoassurer avant de fairelrsquoinsertion que le code du pilote et celui de lrsquoavion sont corrects (existant dans les tableslaquo pegravere raquo) On utilise un deacuteclencheur FOR EACH ROW car on deacutesire qursquoil srsquoexeacutecute autant defois qursquoil y a de lignes concerneacutees par lrsquoeacuteveacutenement deacuteclencheur

Le code minimal de ce deacuteclencheur (on ne prend en compte aucune erreur potentielle) estdeacutecrit dans le tableau suivant

Tableau 7-19 Test du deacuteclencheur AFTER DELETE

Eacuteveacutenement deacuteclencheur Reacutesultat

DELETE FROM Qualifications WHERE typa = A320

SELECT FROM Pilote+--------+-------------+---------+-------+----------+| brevet | nom | nbHVol | compa | nbQualif |+--------+-------------+---------+-------+----------+| PL-1 | P Caboche | 45000 | AF | || PL-2 | G Lebur | 340000 | AF | || PL-3 | X Leclercq | 90000 | SING | 1 |+--------+-------------+---------+-------+----------+

Figure 7-8 Principe du deacuteclencheur TrigInsQualif

20

Qualifications BREVET TYPA EXPIRE------ ---- --------PL-1 A340 220605PL-1 A330 050205PL-1 A320 160104PL-2 A320 180104PL-3 A330 220106

TypeAvionTYPA NOMTYPE---- --------------------------A320 Bireacuteacteur Airbus 320A330 Bireacuteacteur Airbus 330A340 Quadrireacuteacteur Airbus 340A380 Big -Quadrireacuteacteur 380

PiloteBREVET NOM NBHVOL COMP NBQUALIF------ -------------------- ---------- ---- ----------PL-1 P Caboche 450 AF 3PL-2 G Lebur 3400 AF 1PL-3 X Leclercq 900 SING 1

Deacuteclencheur

TrigInsQualif

PL-2 A380 200606

INSERT1

2

+13

NEW

4055_07_C07 Page 267 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

268 copy Eacuteditions Eyrolles

En consideacuterant les donneacutees initiales des tables le test de ce deacuteclencheur (reacutealiseacute le20 deacutecembre 2005) sous lrsquointerface de commande est le suivant

Quand utiliser agrave la fois les directives NEW et OLD

Seuls les deacuteclencheurs de type UPDATE FOR EACH ROW permettent de manipuler agrave la fois lesdirectives NEW et OLD En effet la mise agrave jour drsquoune ligne dans une table fait intervenir unenouvelle donneacutee qui en remplace une ancienne Lrsquoaccegraves aux anciennes valeurs se fera par lanotation pointeacutee du pseudo-enregistrement OLD Lrsquoaccegraves aux nouvelles valeurs se fera par NEW

La figure suivante illustre ce meacutecanisme dans le cas de la modification de la colonne brevet dudernier enregistrement de la table Qualifications Le deacuteclencheur doit programmer deuxmises agrave jour dans la table Pilote

Tableau 7-20 Deacuteclencheur apregraves insertion

Deacuteclencheur Commentaires

BEGIN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = END

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheurMise agrave jour du pilote concerneacute par la qualification

CREATE TRIGGER TrigInsQualifAFTER INSERT ON QualificationsFOR EACH ROW

NEWbrevet

Tableau 7-21 Test du deacuteclencheur AFTER INSERT

Eacuteveacutenement deacuteclencheur Reacutesultat

INSERT INTO Qualifications VALUES(PL-2 A380 SYSDATE())

SELECT FROM Qualifications $+--------+------+------------+| brevet | typa | expire |+--------+------+------------+| PL-1 | A340 | 2005-06-22 || PL-1 | A330 | 2005-02-05 || PL-1 | A320 | 2004-01-16 || PL-2 | A320 | 2004-01-18 || PL-3 | A330 | 2006-01-22 || |+--------+------+------------+SELECT FROM Pilote$+--------+-------------+---------+-------+----------+| brevet | nom | nbHVol | compa | nbQualif |+--------+-------------+---------+-------+----------+| PL-1 | P Caboche | 45000 | AF | 3 || PL-2 | G Lebur | 340000 | AF | 2 || PL-3 | X Leclercq | 90000 | SING | 1 |+--------+-------------+---------+-------+----------+

Web

PL-2 | A380 | 2005-12-20

4055_07_C07 Page 268 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 269

chapitre ndeg 7 Programmation avanceacutee

Lrsquoeacuteveacutenement deacuteclencheur est ici AFTER UPDATE car il faudra srsquoassurer que la suppressionnrsquoest pas entraveacutee par drsquoeacuteventuelles contraintes reacutefeacuterentielles Le code minimal de ce deacuteclen-cheur est deacutecrit dans le tableau suivant

En consideacuterant les donneacutees preacutesenteacutees agrave la figure preacuteceacutedente le test de ce deacuteclencheur est lesuivant

Figure 7-9 Principe du deacuteclencheur TrigUpdQualif

Qualifications BREVET TYPA EXPIRE------ ---- --------PL-1 A340 220605PL-1 A330 050205PL-1 A320 160104PL-2 A320 180104PL-3 A330 220106

PiloteBREVET NOM NBHVOL COMP NBQUALIF------ -------------------- ---------- ---- ----------PL-1 P Caboche 450 AF 3PL-2 G Lebur 3400 AF 1PL-3 X Leclercq 900 SING 1

DeacuteclencheurTrigUpdQualif

PL-2

UPDATE

1

2

+13

NEW

OLD

-1

Tableau 7-22 Deacuteclencheur apregraves modification

Deacuteclencheur Commentaires

BEGIN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = UPDATE Pilote SET nbQualif = nbQualif - 1 WHERE brevet = END

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheur

Mise agrave jour des pilotes concerneacutes par la modification de la qualification

WebCREATE TRIGGER TrigUpdQualifAFTER UPDATE ON QualificationsFOR EACH ROW

NEWbrevet

OLDbrevet

4055_07_C07 Page 269 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

270 copy Eacuteditions Eyrolles

Bilan de NEW et OLD

Le tableau suivant reacutesume les valeurs contenues dans les pseudo-enregistrements OLD et NEWpour les deacuteclencheurs FOR EACH ROW Retenez que seuls les deacuteclencheurs UPDATE peuventmanipuler agrave bon escient les deux types de directives

MySQL preacutevient clairement agrave la compilation que vous utilisez une variable OLD dans undeacuteclencheur INSERT ndash ou NEW dans un deacuteclencheur DELETE ndash par deux messages de mecircmecode mais de libelleacutes diffeacuterents suivant les cas

ERROR 1363 (HY000) There is no NEW row in on DELETE trigger

ERROR 1363 (HY000) There is no OLD row in on INSERT trigger

Une colonne preacutefixeacutee de OLD est en lecture seule dans le corps drsquoun deacuteclencheur

Une colonne preacutefixeacutee de NEW ne peut ecirctre accessible qursquoagrave lrsquoaide du privilegravege SELECT associeacute

Tableau 7-23 Test du deacuteclencheur AFTER UPDATE

Eacuteveacutenement deacuteclencheur Reacutesultat

UPDATE Qualifications SET brevet = PL-2 WHERE brevet = PL-3 AND typa = A330$

SELECT FROM Pilote$+--------+-------------+---------+-------+----------+| brevet | nom | nbHVol | compa | nbQualif |+--------+-------------+---------+-------+----------+| PL-1 | P Caboche | 45000 | AF | || PL-2 | G Lebur | 340000 | AF | || PL-3 | X Leclercq | 90000 | SING | 0 |+--------+-------------+---------+-------+----------+

SELECT FROM Qualifications$+--------+------+------------+| brevet | typa | expire |+--------+------+------------+| PL-1 | A340 | 2005-06-22 || PL-1 | A330 | 2005-02-05 || PL-1 | A320 | 2004-01-16 || PL-2 | A320 | 2004-01-18 || | A330 | 2006-01-22 |+--------+------+------------+

32

PL-2

Tableau 7-24 Valeurs de OLD et NEW

Nature de lrsquoeacuteveacutenement OLDcolonne NEWcolonne

INSERT Impossible Nouvelle valeur

UPDATE Ancienne valeur Nouvelle valeur

DELETE Ancienne valeur Impossible

4055_07_C07 Page 270 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 271

chapitre ndeg 7 Programmation avanceacutee

Appel de sous-programmes

Un deacuteclencheur peut appeler directement par CALL (ou dans son corps) un sous-programmeMySQL

bull Un deacuteclencheur ne peut pas lancer une proceacutedure catalogueacutee retournant des donneacutees auclient (traces avec SELECT) ou utilisant du SQL dynamique (eacutetudieacute plus loin) En revanche lesproceacutedures employeacutees peuvent renvoyer des reacutesultats via leurs paramegravetres de sortie (OUT)

bull Les proceacutedures appeleacutees ne peuvent constituer aucune transaction (oubliez donc de pou-voir faire START TRANSACTION COMMIT et ROLLBACK)

Le tableau suivant deacutecrit lrsquoutilisation drsquoun sous-programme (procTrigg) dans un deacuteclen-cheur (espionAjoutPilote) qui srsquoexeacutecutera avant chaque ajout drsquoun nouveau pilote Lesous-programme ajoute simplement une ligne dans la table Trace

CREATE PROCEDURE bdsoutouprocTrigg(IN param DATETIME)

BEGIN

INSERT INTO Trace VALUES

(CONCAT(Insertion pilote appel de bdsoutouprocTrigg le param))

END

La trace drsquoexeacutecution en consideacuterant les donneacutees initiales des tables est la suivante

mysqlgt (INSERT INTO Pilote VALUES (PL-4 C Soutou 100 AF0)$

Query OK 1 row affected (004 sec)

mysqlgt SELECT FROM Pilote$

+--------+-------------+---------+-------+----------+

| brevet | nom | nbHVol | compa | nbQualif |

+--------+-------------+---------+-------+----------+

| PL-1 | P Caboche | 45000 | AF | 3 |

| PL-2 | G Lebur | 340000 | AF | 1 |

| PL-3 | X Leclercq | 90000 | SING | 1 |

| |

+--------+-------------+---------+-------+----------+

Tableau 7-25 Appel drsquoun sous-programme dans un deacuteclencheur

Deacuteclencheur Commentaire

CREATE TRIGGER bdsoutouespionAjoutPilote BEFORE INSERT ON Pilote FOR EACH ROWBEGIN END

Appel dans le corps du deacuteclencheur drsquoune proceacutedure MySQL en passant un paramegravetre drsquoentreacutee

Web

CALL bdsoutouprocTrigg(SYSDATE())

PL-4 | C Soutou | 10000 | AF | 0

4055_07_C07 Page 271 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

272 copy Eacuteditions Eyrolles

mysqlgt SELECT FROM Trace$

+-----------------------------------------------------------------+

| col |

+-----------------------------------------------------------------+

| |

+-----------------------------------------------------------------+

Dictionnaire des donneacutees

Eacutetudieacutee au chapitre 5 la base INFORMATION_SCHEMA inclut la vue TRIGGERS qui renseigneles caracteacuteristiques des deacuteclencheurs qui eacutetaient auparavant consideacutereacutes au niveau table Ilssont deacutesormais reconnus agrave juste titre au niveau database Il faut deacutetenir le privilegravege SUPERpour acceacuteder agrave cette vue

La requecircte suivante interroge cette vue et permet de retrouver les noms et les caracteacuteristiquesrelatives aux eacuteveacutenements deacuteclencheurs des trois triggers de la base de donneacutees bdsoutou

SELECT TRIGGER_NAMEEVENT_OBJECT_TABLE Table

EVENT_MANIPULATION Evenement ACTION_TIMING

EVENT_OBJECT_SCHEMA Base

FROM INFORMATION_SCHEMATRIGGERS

WHERE TRIGGER_SCHEMA=bdsoutou

+---------------+----------------+-----------+---------------+----------+

| TRIGGER_NAME | Table | Evenement | ACTION_TIMING | Base |

+---------------+----------------+-----------+---------------+----------+

| TrigInsQualif | Qualifications | INSERT | AFTER | bdsoutou |

| TrigUpdQualif | Qualifications | UPDATE | AFTER | bdsoutou |

| TriDelQualif | Qualifications | DELETE | AFTER | bdsoutou |

+---------------+----------------+-----------+---------------+----------+

Notez que MySQL utilise

la colonne TRIGGER_NAME pour deacutesigner le nom du deacuteclencheur drsquoune database

la colonne TRIGGER_SCHEMA pour deacutesigner le nom de la base de donneacutees agrave laquelle ilappartient

les colonnes EVENT_OBJECT_TABLE et EVENT_OBJECT_SCHEMA pour deacutesignerrespectivement le nom de la table qui accueille ce deacuteclencheur ainsi que la base de donneacuteesqui la contient (elle peut ecirctre diffeacuterente de celle du deacuteclencheur ici nous raisonnons sur lamecircme)

la colonne EVENT_MANIPULATION pour deacutesigner lrsquoeacuteveacutenement deacuteclencheur

la colonne ACTION_TIMING pour preacuteciser la chronologie de lrsquoeacuteveacutenement deacuteclencheur

La requecircte suivante interroge cette mecircme vue pour extraire le code du deacuteclencheur de typeafter update heacutebergeacute par la table Qualifications dans la base de donneacutees bdsoutou

Insertion pilote appel de bdsoutouprocTrigg le 2005-12-20 082720

4055_07_C07 Page 272 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 273

chapitre ndeg 7 Programmation avanceacutee

SELECT ACTION_STATEMENT FROM INFORMATION_SCHEMATRIGGERS WHERE TRIGGER_SCHEMA=bdsoutou AND EVENT_OBJECT_TABLE=Qualifications AND EVENT_MANIPULATION=UPDATE AND ACTION_TIMING=AFTER+-----------------------------------------------------------------------------+| ACTION_STATEMENT |+-----------------------------------------------------------------------------+|BEGIN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = NEWbrevet UPDATE Pilote SET nbQualif = nbQualif - 1 WHERE brevet = OLDbrevet END |+-----------------------------------------------------------------------------+

Remarquons que MySQL utilise la colonne ACTION_STATEMENT pour contenir le corps dudeacuteclencheur (visible aussi par SHOW TRIGGERS)

La colonne ACTION_ORIENTATION est pour lrsquoinstant toujours eacutevalueacutee agrave ROW (deacuteclencheurdrsquoeacutetat pas encore opeacuterationnel)

Les colonnes ACTION_REFERENCE_OLD_ROW et ACTION_REFERENCE_NEW_ROW contiennentpour lrsquoinstant toujours respectivement OLD et NEW (il nrsquoest pas encore possible de renommerces identificateurs)

Dans le but drsquoecirctre davantage en phase avec la norme dans les prochaines versions les colon-nes suivantes contiennent pour lrsquoheure toujours la valeur NULL TRIGGER_CATALOG EVENT_OBJECT_CATALOG ACTION_CONDITION ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE et CREATED Les deux premiegraveres colonnes sont relatives agrave la notionde catalogue la suivante a la possibiliteacute de conditionner un deacuteclencheur (clause WHEN drsquoOra-cle) la derniegravere contiendrait le moment de creacuteation du deacuteclencheur

Programmation drsquoune contrainte de veacuterification

Nous avons vu que les contraintes de veacuterification (CHECK) ne sont pas encore prises encharge Nous avons eacutetudieacute au chapitre 5 la possibiliteacute drsquoen programmer agrave lrsquoaide de vues Icinous allons creacuteer un deacuteclencheur srsquoen chargeant Attention il nrsquoest pas toujours possibledrsquoutiliser un deacuteclencheur pour valider une contrainte de veacuterification

Consideacuterons lrsquoexemple du chapitre 5 (Figure 5-10 Vue simulant la contrainte CHECK) quideacutecrit la table Pilote et la contrainte veacuterifiant qursquoun pilote

ne peut ecirctre commandant de bord qursquoagrave la condition qursquoil ait entre 1 000 et 4 000 heures devol

ne peut ecirctre copilote qursquoagrave la condition qursquoil ait entre 100 et 1 000 heures de vol

ne peut ecirctre instructeur qursquoagrave partir de 3 000 heures de vol

Le tableau suivant deacutecrit le code du deacuteclencheur Ici on choisit de forcer la valeur de lacolonne grade pour conserver la coheacuterence avec les conditions initiales

4055_07_C07 Page 273 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

274 copy Eacuteditions Eyrolles

Si aucune condition nrsquoest veacuterifieacutee lrsquoajout se reacutealise sans aucun changement Le test de cedeacuteclencheur est le suivant On remarque que les quatre premiers INSERT sont inchangeacutes alorsque les deux derniers sont modifieacutes (mais pas annuleacutes )

Tableau 7-26 Deacuteclencheur simulant un CHECK

Deacuteclencheur Commentaires

BEGIN IF ( = CDB AND ( lt1000)) THEN SET = COPI END IF IF (NEWgrade = CDB AND ( gt4000)) THEN SET = INST END IF IF (NEWgrade = COPI AND ( gt1000)) THEN SET = CDB END IF IF ( = INST AND ( lt3000)) OR ( lt100) THEN SET = NULL END IFEND

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheur

Test des conditions et mise agrave jour eacuteventuelle de la nouvelle valeur agrave inseacuterer au niveau de la colonne grade

WebCREATE TRIGGER TrigInsGradeBEFORE INSERT ON Pilote FOR EACH ROW

NEWgrade NEWnbHVolNEWgrade

NEWnbHVolNEWgrade

NEWnbHVolNEWgrade

NEWgrade NEWnbHVolNEWnbHVol

NEWgrade

Tableau 7-27 Test du deacuteclencheur BEFORE INSERT

Insertions valides Insertions non valides

INSERT INTO Pilote VALUES (PL-1Daniel Vielle1000CDB)INSERT INTO Pilote VALUES (PL-2Benoit Treihlou450COPI)INSERT INTO Pilote VALUES (PL-3Pierre Filoux9000INST)INSERT INTO Pilote VALUES (PL-4Philippe Minier1000COPI)

INSERT INTO Pilote VALUES (PL-5Trop jeune )

INSERT INTO Pilote VALUES (PL-6Inexperimente )

SELECT FROM Pilote+--------+-----------------+---------+-------+| brevet | nom | nbHVol | grade |+--------+-----------------+---------+-------+| PL-1 | Daniel Vielle | 100000 | CDB || PL-2 | Benoit Treihlou | 45000 | COPI || PL-3 | Pierre Filoux | 900000 | INST || PL-4 | Philippe Minier | 100000 | COPI || PL-5 | Trop jeune | || PL-6 | Inexperimente | |+--------+-----------------+---------+-------+

100CDB

2999INST

10000 | COPI299900 | NULL

4055_07_C07 Page 274 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 275

chapitre ndeg 7 Programmation avanceacutee

Invalidation dans le deacuteclencheur

Une fonctionnaliteacute importante des deacuteclencheurs consiste agrave pouvoir invalider lrsquoeacuteveacutenement quia deacuteclencheacute lrsquoaction En drsquoautres termes crsquoest pouvoir faire dire au deacuteclencheur non agrave uneinsertion une modification ou agrave une suppression Ces cas concernent les deacuteclencheurs lignesde type BEFORE puisqursquoil faudra veacuterifier des conditions dans le corps du deacuteclencheur avanteacuteventuellement drsquoaccepter lrsquoeacuteveacutenement

Dans un deacuteclencheur de type BEFORE

Il est possible de modifier une colonne preacutefixeacutee de NEW agrave la condition de deacutetenir le privi-legravege UPDATE associeacute Cela signifie que lrsquoon peut changer un enregistrement avant delrsquoinseacuterer

La valeur drsquoune colonne AUTO_INCREMENT preacutefixeacutee par NEW est 0 (et ne suit pas laseacutequence existante) La valeur actualiseacutee de la seacutequence ne sera effective que lors delrsquoinsertion

Dans tout deacuteclencheur (de type BEFORE ou AFTER) une erreur lors de lrsquoexeacutecution et toutes lesinstructions du bloc sont invalideacutees

Principe

Sans parler de MySQL lrsquoinvalidation dans un deacuteclencheur se traduit en geacuteneacuteral par le deacuteclen-chement drsquoune exception (qui fait avorter lrsquoinstruction LMD) et par le retour drsquoun messagedrsquoerreur personnaliseacute

Les proceacutedures et deacuteclencheurs MySQL ne permettent pour lrsquoinstant ni de provoquer uneexception systegraveme ni de retourner un code SQL personnaliseacute

Il nrsquoest pas non plus possible drsquoutiliser ROLLBACK dans un deacuteclencheur (ERROR 1422(HY000) Explicit or implicit commit is not allowed in stored functionor trigger)

Une seule solution qui nrsquoest pas du tout satisfaisante comme nous allons le voir consisteraitagrave provoquer artificiellement une erreur (mais pas une erreur systegraveme par exemple acceacuteder agraveune table inexistante) Il faut une erreur seacutemantiquement correcte qui pose problegraveme agravelrsquoexeacutecution (NULL dans une cleacute primaire)

Si vous programmez une erreur systegraveme (SELECT drsquoune table inexistante) elle sera releveacuteedans tous les cas drsquoexeacutecution du deacuteclencheur

Lrsquoinconveacutenient majeur de cette astuce est que le message drsquoerreur ne sera jamais explicite caril ne sera pas en rapport avec la contrainte qui nrsquoest pas satisfaite dans le deacuteclencheur

4055_07_C07 Page 275 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

276 copy Eacuteditions Eyrolles

Exemple

Consideacuterons agrave nouveau lrsquoexemple preacuteceacutedent et programmons la contrainte que tout pilote nepeut ecirctre qualifieacute sur plus de trois types drsquoappareils Ici il srsquoagit drsquoassurer la coheacuterence entrela valeur de la colonne nbQualif de la table Pilote et les enregistrements de la tableQualifications

Lrsquoeacuteveacutenement deacuteclencheur est ici BEFORE INSERT car il faudra srsquoassurer de la conditionavant drsquoautoriser Le code minimal de ce deacuteclencheur est deacutecrit dans le tableau suivant ensupposant qursquoon dispose drsquoune table de travail CREATE TABLE Trace(colVARCHAR(80) PRIMARY KEY)

En consideacuterant les donneacutees initiales le test de ce deacuteclencheur est le suivant On remarque quele premier INSERT est bien eacuteviteacute (le pilote PL-1 a deacutejagrave trois qualifications) Bizarrementlrsquoajout du message dans la table Trace nrsquoest pas effectueacute car le deacuteclencheur invalide tout sontraitement en cas drsquoerreur La seconde insertion en revanche est bien effectueacutee (le pilote PL-3 nrsquoa qursquoune seule qualification)

Tableau 7-28 Deacuteclencheur avant insertion

Deacuteclencheur Commentaires

CREATE TRIGGER TrigInsQualif ON Qualifications FOR EACH ROWBEGINDECLARE v_compteur TINYINT(1)DECLARE v_nom VARCHAR(30) SELECT nbQualif nom INTO v_compteur v_nom FROM Pilote WHERE brevet = NEWbrevet IF v_compteur lt 3 THEN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = NEWbrevet ELSE

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheur

Test de la condition

Mise agrave jour du pilote concerneacute par lrsquoajout de la qualification

INSERT INTO TRACE VALUES (CONCAT(Le pilote v_nom a deacutejagrave 3 qualifications)) END IFEND

Instruction jamais reacutealiseacutee

Erreur volontaire

WebBEFORE INSERT

INSERT INTO TRACE VALUES (NULL)

4055_07_C07 Page 276 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 277

chapitre ndeg 7 Programmation avanceacutee

Citons le travail de Roland Bouman un Hollandais qui a eacutecrit une fonction (UDF user-definedfunction) en C qui se comporte comme une fonction native (built-in) simulant le RAISE_APPLICATION_ERROR Cette fonction permet de retourner un message personnaliseacute agrave partirdu corps drsquoun deacuteclencheur (httprpboumanblogspotcom200511using-udf-to-raise-errors-from-insidehtml)

Tables mutantes

Alors qursquoil nrsquoest pas en geacuteneacuteral possible de manipuler la table sur laquelle se porte le deacuteclen-cheur dans le corps du deacuteclencheur lui-mecircme Oracle parle de mutating tables et MySQLpermet drsquoacceacuteder agrave la table en lecture Si on tente drsquoy parvenir en mise agrave jour (INSERTUPDATE ou DELETE) lrsquoerreur est laquo ERROR 1442 (HY000) Cant update tablexxx in stored functiontrigger because it is already used bystatement which invoked this stored functiontrigger raquo

Lrsquoexemple suivant deacutecrit la programmation drsquoun deacuteclencheur qui compte les lignes drsquounetable apregraves chaque nouvelle insertion

Tableau 7-29 Test du deacuteclencheur BEFORE INSERT

Eacuteveacutenement deacuteclencheur Reacutesultat

--ajout incorrectINSERT INTO Qualifications VALUES ( A380SYSDATE())$

ERROR 1048 (23000) Column col cannot be null-- ne fait pas lINSERT dans Qualifications -- ni dans Trace

-- ajout correctINSERT INTO Qualifications VALUES ( A380SYSDATE())$

Query OK 1 row affected (009 sec)-- fait lINSERT dans Qualifications et met agrave jour-- la table Pilote (colonne nbQualif)

PL-1

PL-3

Tableau 7-30 Deacuteclencheur (table mutante)

Deacuteclencheur Trace

SET vs_nombre=0$

CREATE TRIGGER TrigMutant AFTER INSERT ON Trace FOR EACH ROWBEGIN

SELECT COUNT() INTO vs_nombre FROM TraceEND$

SELECT vs_nombre$+------------+| vs_nombre |+------------+| 0 |+------------+INSERT INTO Trace VALUES (Test TrigMutant)$SELECT vs_nombre$+------------+| vs_nombre |+------------+| 1 |+------------+

Web

4055_07_C07 Page 277 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

278 copy Eacuteditions Eyrolles

Restrictions

Pour en finir avec les deacuteclencheurs je vais terminer la laquo litanie raquohellip

bull Pas de deacuteclencheur sur une table temporaire ou une vue ou sur un eacuteveacutenement systegraveme(connexion arrecirct de la base etc)

bull Pas de possibiliteacute de combiner plusieurs eacuteveacutenements par 2 ou par 3 (INSERT OR UPDATEINSERT OR DELETE etc)

bull Les deacuteclencheurs eacutetat (statement trigger) ne sont pas encore reconnus

bull Il nrsquoest pas possible de deacutesactiver un deacuteclencheur sans le deacutetruire

bull Les deacuteclencheurs ne peuvent ecirctre eacutecrits qursquoavec le langage proceacutedural de MySQL (qui sertaussi aux proceacutedures et aux fonctions catalogueacutees)

bull Un deacuteclencheur ne peut constituer aucune transaction ainsi les instructions suivantes sontinterdites COMMIT ROLLBACK SAVEPOINT START TRANSACTION et SET CONSTRAINT

bull Les deacuteclencheurs ne sont pas activeacutes par des actions en cascade reacutesultant drsquoopeacuterations surdes cleacutes primaires ou eacutetrangegraveres (CASCADE voir le chapitre 2)

Suppression drsquoun deacuteclencheur

Pour pouvoir supprimer un deacuteclencheur vous devez disposer du privilegravege SUPER (le privilegravegeDROP TRIGGER est agrave venir) La syntaxe de lrsquoinstruction DROP TRIGGER est la suivante

DROP TRIGGER [nomBase]nomDeacuteclencheur

Si le nom de la base est omis MySQL cherchera agrave deacutetruire le deacuteclencheur dans la base dedonneacutees en cours drsquoutilisation

Le fait de deacutetruire une table a pour conseacutequence drsquoeffacer aussi tous les deacuteclencheurs qui luisont associeacutes

Le fait de deacutetruire une base supprime toutes les tables Par conseacutequent les deacuteclencheurs pas-sent ainsi tous laquo agrave la casserole raquo

SQL dynamique

MySQL parle de server-side prepared statements (eacutetats preacutepareacutes) pour eacutevoquer le fait depouvoir programmer en SQL dynamique En plus des directives SQL (LMD LID) il estpossible de construire automatiquement certaines instructions SQL du LDD

4055_07_C07 Page 278 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 279

chapitre ndeg 7 Programmation avanceacutee

Il est bien sucircr possible de construire des instructions SQL agrave partir drsquoun programme C (MySQLC API client library) Java (MySQL ConnectorJ) Net (MySQL ConnectorNET) ou PHP parune API eacutecrite en C (mysqli extension)

Par exemple on pourra creacuteer une table dont le nom passera en paramegravetre et qui aura unnombre variable de colonnes Il sera aussi permis de construire automatiquement une requecircteSQL en fonction des choix drsquoun utilisateur En plus des ordres simples on pourra eacutegalementparameacutetrer une suite drsquoinstructions dans un bloc MySQL

Une instruction SQL dynamique est stockeacutee en tant que chaicircne de caractegraveres qui sera eacutevalueacuteeagrave lrsquoexeacutecution et non agrave la compilation (en opposition aux instructions SQL statiques quipeuplent la majoriteacute des sous-programmes)

Seules les instructions suivantes peuvent ecirctre construites dynamiquement (dans un preparedstatement) CREATE TABLE DELETE DO INSERT REPLACE SELECT SET UPDATE et la plu-part des commandes SHOW

Les eacutetats preacutepareacutes ne peuvent ecirctre utiliseacutes dans un deacuteclencheur (seuls les sous-programmespeuvent en beacuteneacuteficier pour lrsquoheure)

Lrsquoinstruction

DO expression1 [expression2]

exeacutecute lrsquoexpression (ou les expressions) sans retourner aucun reacutesultat On peut lrsquoassimiler agraveun raccourci de SELECT expression1 mais sans renvoi de reacutesultat Elle peut ecirctreutile pour des fonctions agrave effet de bord (comme la relacircche de verrou RELEASE_LOCK())

Syntaxe

La construction dynamique drsquoinstructions SQL (prepared statements) est baseacutee sur les troisdirectives suivantes

PREPARE nomEtat FROM eacutetatPreacutepareacute

EXECUTE nomEtat [USING var1 [ var2] ]

DEALLOCATE | DROP PREPARE nomEtat

Lrsquoinstruction PREPARE associe un nom (insensible agrave la casse) agrave une instruction dynamique

eacutetatPreacutepareacute est soit une chaicircne soit une variable de session contenant le texte delrsquoinstruction SQL construite (instruction simple pas drsquoinstructions multiples) Dans cettechaicircne le caractegravere laquo raquo (appeleacute placeholder) permet de se substituer agrave un paramegravetre

Lrsquoinstruction EXECUTE lance lrsquoordre parameacutetreacute avec eacuteventuellement la clause USING quireliera les paramegravetres aux variables de session

Pour en terminer avec un ordre preacutepareacute utilisez DEALLOCATE PREPARE qui supprime lecontenu de lrsquoordre (une fin de session deacutesalloue tous les ordres ouverts)

4055_07_C07 Page 279 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

280 copy Eacuteditions Eyrolles

Exemples

Consideacuterons la table Avion contenant deux enregistrements

CREATE TABLE Avion

(immat VARCHAR(6) typeAv CHAR(8) nbHVol DECIMAL(72) comp VARCHAR(4))

INSERT INTO Avion VALUES (F-GLFS A320 1000 AF)

INSERT INTO Avion VALUES (F-WOWW A380 1500 AF)

Instruction DELETE

Le tableau suivant deacutecrit la construction dynamique de lrsquoordre de suppression des avions dontle nombre drsquoheures de vol est supeacuterieur agrave un paramegravetre speacutecifieacute par une variable de session (icieacutevalueacutee agrave 1 000)

Lrsquoappel (CALL bdsoutousousProg()) de cette proceacutedure aura pour conseacutequence dedeacutetruire lrsquoavion immatriculeacute F-WOWW

Instruction SELECT

Le tableau suivant deacutecrit la construction dynamique de lrsquoextraction des avions dont le nombredrsquoheures de vol est eacutegal agrave un paramegravetre speacutecifieacute par une variable de session (ici eacutevalueacutee agrave1 000) La requecircte est elle-mecircme stockeacutee dans une variable de session

Lrsquoappel de cette proceacutedure aura pour conseacutequence drsquoextraire lrsquoavion immatriculeacute F-GLFS

Tableau 7-31 Utilisation de DELETE

Code MySQL Commentaires

SET vs_nbhVol = 1000 $ Deacuteclaration de la variable de session

CREATE PROCEDURE bdsoutousousProg()BEGIN END

Preacuteparation de lrsquoordreExeacutecution

Web

PREPARE etat FROMDELETE FROM Avion WHERE nbHVol gt

EXECUTE etat USING vs_nbhVolDEALLOCATE PREPARE etat

Tableau 7-32 Utilisation de SELECT

Code MySQL Commentaires

SET vs_chaine = SET vs_nbhVol = 1000$

Deacuteclaration des variables de session

CREATE PROCEDURE bdsoutousousProg()BEGIN END

Preacuteparation de lrsquoordreExeacutecution

WebSELECT FROM Avion WHERE nbHVol=$

PREPARE etat FROM vs_chaineEXECUTE etat USING vs_nbhVolDEALLOCATE PREPARE etat

4055_07_C07 Page 280 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 281

chapitre ndeg 7 Programmation avanceacutee

Instruction UPDATE

Le tableau suivant deacutecrit la construction dynamique de lrsquoinstruction de modification (augmen-tation du nombre drsquoheures de vol drsquoun pourcentage passeacute en premier paramegravetre) drsquoun aviondont lrsquoimmatriculation passe en deuxiegraveme paramegravetre Notez qursquoil nrsquoest pas besoin de doublerle guillemet dans la speacutecification du deuxiegraveme placeholder paramegravetre immat (bien qursquoilsrsquoagisse drsquoune chaicircne de caractegraveres)

Lrsquoappel de cette proceacutedure aura pour conseacutequence drsquoaumenter de 10 le nombre drsquoheures devol de lrsquoavion immatriculeacute F-GLFS

Si lrsquoimmatriculation avait eacuteteacute une constante il aurait fallu doubler le guillemet dans lrsquoaffectationde la variable de session

SET vs_chaine =UPDATE Avion SET nbHVol=nbHVol WHERE immat=F-GLFS$

Restrictions

Les placeholders (points drsquointerrogation) des eacutetats preacutepareacutes ne peuvent pas remplacer desnoms de tables de vues drsquoindex de colonnes etc dans une instruction de sorte agrave construireun ordre dynamiquement Ils ne peuvent que remplacer des donneacutes

bull dans la clause WHERE pour des SELECT UPDATE (dans la clause SET aussi) ou DELETE

bull dans la clause VALUES pour un INSERT

Utilisations

Le tableau suivant reacutesume quelques cas permis et les cas non valides associeacutes Nrsquooubliez pas dedoubler chaque guillemet pour affecter une telle chaicircne de caractegraveres dans une variable de session

Tableau 7-33 Utilisation de UPDATE

Code MySQL Commentaires

SET vs_chaine = SET vs_immat = F-GLFS$SET vs_pourcent = 11$

Deacuteclaration des variables de session

CREATE PROCEDURE bdsoutousousProg()BEGIN END

Preacuteparation de lrsquoordreExeacutecution

WebUPDATE Avion SET nbHVol=nbHVol

WHERE immat=$

PREPARE etat FROM vs_chaineEXECUTE etat USING vs_pourcentvs_immatDROP PREPARE etat

4055_07_C07 Page 281 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

282 copy Eacuteditions Eyrolles

Afin de pallier cette limitation il faut construire lrsquoinstruction dynamique agrave lrsquoaide de la fonc-tion CONCAT en incluant eacuteventuellement des placeholders aux endroits permis

Exemple sans placeholder

La proceacutedure catalogueacutee suivante creacutee dynamiquement dans la base bdsoutou une table denom passeacute en premier paramegravetre Le nom de la seconde colonne de la table (ici de type INT)est passeacute en second paramegravetre de la proceacutedure

Lrsquoappel suivant de cette proceacutedure aura pour effet de creacuteer la table Helico La commandeDESCRIBE confirme la structure de la nouvelle table

CALL bdsoutousousProg(Helicoturbine)$

Query OK 0 rows affected (021 sec)

DESCRIBE bdsoutouHelico $

Tableau 7-34 Utilisation des placeholders

Possibles Impossibles

SELECT FROM table WHERE col = SELECT FROM table WHERE

SELECT FROM WHERE

SELECT FROM table WHERE gt 1000

INSERT INTO table VALUES () INSERT INTO VALUES(F-FRTY)

UPDATE table SET col= WHERE col = UPDATE table SET = WHERE col =

UPDATE SET

DELETE FROM table WHERE col = DELETE FROM table WHERE =

DELETE FROM

Tableau 7-35 Creacuteation dynamique drsquoune table

Code MySQL Commentaires

CREATE PROCEDURE bdsoutousousProg (IN v_param1 VARCHAR(10) IN v_param2 VARCHAR(10))BEGIN SET vs_chaine = CONCAT ( PREPARE etat FROM vs_chaine EXECUTE etat DEALLOCATE PREPARE etatEND

Construction de la chaicircne

lsquoCREATE TABLE IF NOT EXISTS bdsoutou (immat CHAR(4) INT)rsquo

Creacuteation de la table

Web

CREATE TABLE IF NOT EXISTSbdsoutouv_param1 (immat CHAR(4) v_param2 INT))

v_param1

v_param2

4055_07_C07 Page 282 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 283

chapitre ndeg 7 Programmation avanceacutee

+---------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+---------+---------+------+-----+---------+-------+

| immat | char(4) | YES | | NULL | |

| turbine | int(11) | YES | | NULL | |

+---------+---------+------+-----+---------+-------+

2 rows in set (039 sec)

Exemple avec placeholder

La proceacutedure catalogueacutee suivante creacutee dynamiquement la requecircte drsquoextraction du type et dunombre drsquoheures de vol (colonnes de noms passeacutes en premier et en deuxiegraveme paramegravetres) dela table de nom passeacute en troisiegraveme paramegravetre en fonction drsquoune condition sur une colonne (denom passeacute en quatriegraveme paramegravetre) Cette condition fait intervenir un paramegravetre (placeholder)valant ici F-GLFS

Lrsquoappel de cette proceacutedure avec les paramegravetres suivants aura pour effet drsquoextraire les valeursdes deux colonnes du premier enregistrement de la table Avion preacutesenteacutee au deacutebut de cettesection

CALL bdsoutousousProg(typeAvnbHVolAvionimmat)$

+--------+---------+

| typeAv | nbHVol |

+--------+---------+

| A320 | 100000 |

+--------+---------+

1 row in set (001 sec)

Query OK 0 rows affected (001 sec)

Tableau 7-36 Creacuteation dynamique drsquoune requecircte avec placeholder

Code MySQL Commentaires

CREATE PROCEDURE bdsoutousousProg(IN v_param1 CHAR(6) IN v_param2 CHAR(6) IN v_param3 CHAR(5) IN v_param4 CHAR(5))BEGIN SET vs_immat = F-GLFS SET vs_chaine = CONCAT( PREPARE etat FROM vs_chaine EXECUTE etat USING vs_immat DEALLOCATE PREPARE etatEND

Avec lrsquoappel suivant construction de la chaicircne lsquoSELECT typeAvnbHVol FROM bdsoutouAvion WHERE immat=rsquo

Exeacutecution de la requecircte parameacutetreacutee

Web

SELECT v_param1v_param2 FROM bdsoutouv_param3 WHERE v_param4 = )

4055_07_C07 Page 283 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

284 copy Eacuteditions Eyrolles

Exercices

Lrsquoobjectif de ces exercices est drsquoeacutecrire des sous-programmes MySQL manipulant des curseurset geacuterant des exceptions sur la base de donneacutees Parc informatique

71 Curseur

On deacutesire connaicirctre pour chaque logiciel installeacute le temps (nombre de jours entier deacutecimal) passeacuteentre lrsquoachat et lrsquoinstallation Ce calcul devra renseigner la colonne delai de la table Installerpour lrsquoinstant nulle

Utiliser une table testTrace(message VARCHAR(80) (et lrsquoafficher en fin de sous-programme)pour stocker

bull les incoheacuterences (date drsquoinstallation anteacuterieure agrave la date drsquoachat date drsquoinstallation ou date drsquoachatinconnue)

bull le nombre entier de jours seacuteparant lrsquoachat de lrsquoinstallation (utiliser DATEDIFF)

bull une chaicircne simulant un format TIME eacutetendu qui repreacutesente le nombre de jours deacutecimal seacuteparantlrsquoachat de lrsquoinstallation (par exemple si le nombre de jours deacutecimal vaut laquo 145 raquo il faudra cons-truire la chaicircne laquo 14 j 120000 raquo)

Eacutecrire la proceacutedure calculTemps pour programmer ce processus Un exemple de tabletestTrace agrave produire en sortie

+------------------------------------------------------------------+

| message |

+------------------------------------------------------------------+

| Logiciel Oracle 6 sur Poste 2 attente 2924 jour(s) |

| En format TIME eacutetendu 2924 j 000000 |

| Logiciel Oracle 8 sur Poste 2 attente 1463 jour(s) |

| hellip |

| Logiciel I I S installeacute sur Poste 7 11 jour(s) avant lachat |

| Date dachat inconnue pour le logiciel SQLNet sur Poste 2 |

| Logiciel Oracle 6 sur Poste 8 attente 3876 jour(s) |

| En format TIME eacutetendu 3876 j 105917 |

| hellip |

+------------------------------------------------------------------+

72 Transaction

Eacutecrire la proceacutedure installLogSeg permettant drsquoeffectuer une installation groupeacutee sur tous lespostes drsquoun mecircme segment drsquoun nouveau logiciel La transaction doit enregistrer dans un premiertemps le nouveau logiciel puis les diffeacuterentes installations sur tous les postes du segment de mecircmetype que celui du logiciel acheteacute Lrsquoinstallation se fera agrave la date du jour Penser agrave mettre agrave jour lacolonne delai comme programmeacute preacuteceacutedemment

4055_07_C07 Page 284 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 285

chapitre ndeg 7 Programmation avanceacutee

Ne pas encore tenir compte des eacuteventuelles exceptions et tracer chaque insertion dans la tabletestTrace Utiliser les paramegravetres ci-dessous pour tester votre proceacutedure Lrsquoeacutetat de sortie doit ecirctrele suivant Veacuterifier aussi la preacutesence des deux nouveaux enregistrements dans la table InstallerNe programmer le COMMIT qursquoune fois la proceacutedure bien testeacutee

CALL installLogSeg(13012080 log99 Blaster 2005-09-05

99 PCWS 9999)$

+---------------------------------------+

| message |

+---------------------------------------+

| Blaster stockeacute dans la table Logiciel |

| Installation sur Poste 4 dans Salle 2 |

| Installation sur Poste 5 dans Salle 2 |

+---------------------------------------+

73 Exceptions

Modifier la proceacutedure installLogSeg afin de prendre en compte quelques-unes des exceptionspotentielles

bull numeacutero de segment inconnu (erreur NOT FOUND)

bull numeacutero de logiciel deacutejagrave preacutesent (ERROR 1062 Duplicate entry)

bull type du logiciel inconnu (ERROR 1452 Cannot add or update a child row)

bull date drsquoachat posteacuterieure agrave celle du jour (se servir du mecircme calcul que pour la colonne delai delrsquoexercice preacuteceacutedent)

bull aucune installation reacutealiseacutee car pas de poste de travail de ce type (erreur utilisateur pas_install_possible)

Veacuterifier chacun de ces cas avec le jeu de tests suivant

--test segmentCALL installLogSeg( log99Blaster 2005-09-05 99 PCWS 9999)$--test logiciel deacutejagrave preacutesentCALL installLogSeg(13012080 Blaster 2005-09-05 99 PCWS 9999)$--test type du logicielCALL installLogSeg(13012080 log98Mozilla 2005-11-04 1 1000)$--date drsquoachat plus grande que celle du jour CALL installLogSeg(13012080 log98Mozilla 1 PCWS 1000)$--aucune installCALL installLogSeg( log55Eudora 2005-12-06 5

540)$--bonne installationCALL installLogSeg(13012080 log77Blog Up 2005-12-05 13 PCWS 90)$

toto

log1

toto

2010-11-04

13012081PCWS

4055_07_C07 Page 285 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

286 copy Eacuteditions Eyrolles

74 Deacuteclencheurs

Mises agrave jour de colonnes

Eacutecrire les deacuteclencheurs Trig_AD_Installer et Trig_AI_Installer sur la table Installerpermettant de faire la mise agrave jour automatique des colonnes nbLog de la table Poste et nbIns-tall de la table Logiciel Preacutevoir les cas de deacutesinstallation drsquoun logiciel (AFTER DELETE) sur unposte et drsquoinstallation (AFTER INSERT) drsquoun logiciel sur un autre

Eacutecrire les deacuteclencheurs Trig_AI_Poste et Trig_AD_Poste sur la table Poste permettantdrsquoactualiser la colonne nbPoste de la table Salle agrave chaque ajout ou suppression drsquoun nouveauposte

Eacutecrire le deacuteclencheur Trig_AU_Salle sur la table Salle qui met agrave jour automatiquement lacolonne nbPoste de la table Segment apregraves la modification de la colonne nbPoste

Ces deux derniers deacuteclencheurs vont srsquoenchaicircner lrsquoajout ou la suppression drsquoun poste entraicircneralrsquoactualisation de la colonne nbPoste de la table Salle qui conduira agrave la mise agrave jour de la colonnenbPoste de la table Segment Ajouter un poste pour veacuterifier le rafraicircchissement des deux tables(Salle et Segment) Supprimer ce poste puis veacuterifier agrave nouveau la coheacuterence des deux tables

Programmation de contraintes

Eacutecrire le deacuteclencheur Trig_BI_Installer sur la table Installer permettant de controcircler avantchaque nouvelle installation que le type du logiciel correspond au type du poste et que la datedrsquoinstallation est soit nulle soit posteacuterieure agrave la date drsquoachat

4055_07_C07 Page 286 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie III

Langages et outils

4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

289

Chapitre 8

Utilisation avec Java

MySQL offre sur son site diffeacuterents pilotes pour rendre compatibles des applications avecune base de donneacutees sur diffeacuterents systegravemes

ConnectorODBC

(

Open DataBase Connectivity

) pour Windows Linux Mac OS X etUnix

ConnectorJ

pour toute plate-forme Java en utilisant JDBC (

Java DataBaseConnectivity

)

ConnectorNet

pour toute plate-forme Net

ConnectorMXJ composant qui encapsule le moteur MySQL dans une application J2EE

Ce chapitre explique lrsquoutilisation de lrsquoAPI JDBC 30 pour manipuler une base MySQL via unprogramme Java

JDBC avec ConnectorJ

Lrsquointerface JDBC initialement programmeacutee par Sun appeleacutee aussi laquo passerelle raquo ou laquo API raquoest composeacutee drsquoun ensemble de classes permettant le dialogue entre une application Java etune source de donneacutees compatible SQL (tables relationnelles en geacuteneacuteral mais aussi donneacuteesissues drsquoun fichier texte ou drsquoun classeur Excel par exemple) LrsquoAPI JDBC 30 que MySQLfournit gratuitement est appeleacutee

ConnectorJ

Lrsquointerface JDBC est conforme au niveau drsquoentreacutee de la norme SQL2 (

entry

level

) et prend encharge la programmation

multithread

La communication est reacutealiseacutee en mode client-serveurdeacuteconnecteacute et srsquoeffectue en plusieurs eacutetapes

connexion agrave la base de donneacutees

eacutemissions drsquoinstructions SQL et exploitation des reacutesultats provenant de la base dedonneacutees

deacuteconnexion de la base

Le spectre de JDBC est large car lrsquoapplicatif Java peut ecirctre une classe ou une

applet

cocircteacuteclient une

servlet

un EJB (

Enterprise Java Beans

) ou une proceacutedure catalogueacutee cocircteacute serveur

4055_08_C08 Page 289 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

290

copy Eacuteditions Eyrolles

Classification des pilotes (drivers)

Un pilote (

driver

) JDBC est une couche logicielle chargeacutee drsquoassurer la liaison entre lrsquoapplicationJava (cliente) et le SGBD (serveur) La classification des pilotes JDBC distingue quatre types

Les pilotes de type 1 (

JDBC-ODBC Bridge

) utilisent la couche logicielle de Microsoftappeleacutee ODBC Le client est dit laquo eacutepais raquo puisque le pilote JDBC convertit les appels Javaen appels ODBC avant de les exeacutecuter Cette approche convient bien pour des sources dedonneacutees Windows ou si lrsquointerface cliente est eacutecrite dans un langage natif de Microsoft

Les pilotes de type 2 (

Native-API Partly-Java Driver

) utilisent un pilote fourni par le cons-tructeur de la base de donneacutees (natif) Le pilote nrsquoeacutetant pas deacuteveloppeacute en Java le client estaussi dit laquo eacutepais raquo pour cette approche En effet les commandes JDBC sont toutes conver-ties en appels natifs du SGBD consideacutereacute Cette approche convient pour les applications quimanipulent des sources de donneacutees uniques (tout Oracle ou IBM etc)

Les pilotes de type 3 (

Net Protocol All-Java Driver

) utilisent un pilote geacuteneacuterique natif eacutecriten Java Le client est plus laquo leacuteger raquo car les appels JDBC sont transformeacutes par un protocoleindeacutependant du SGBD Cette approche convient pour des sources de donneacutees heacuteteacuterogegravenes

Les pilotes de type 4 (

Native Protocol All-Java Driver

) sont eacutecrits en Java Le client estleacuteger car il ne neacutecessite aucune couche logicielle suppleacutementaire Les appels JDBC sonttraduits en

sockets

exploiteacutes par le SGBD Cette approche est la plus simple mais pasforceacutement la plus puissante elle convient pour tous les types drsquoarchitectures

La figure suivante scheacutematise le principe mis en œuvre au travers des quatre types de pilotes JDBC

Le choix du pilote nrsquoa pas drsquoinfluence majeure sur la programmation Seules les phases dechargement du pilote et de connexion aux bases sont speacutecifiques les autres instructions sontindeacutependantes du pilote En drsquoautres termes si vous avez une application deacutejagrave eacutecrite et que

Figure 8-1

Types de pilotes JDBC

BD

Java

JDB C

ODBC

ODBC

BD

Java

JDB C

Driver BD

Driver BD

Java

Driver

Java

100

Driver Geacuteneacuterique

Driver

IBM

BD

Driver

IBM

DriverOracle

Java

Driver

100 Java

BD

type 1 type 2 type 3 type 4

TCP IP

4055_08_C08 Page 290 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

291

chapitre ndeg 8 Utilisation avec Java

vous deacutecidez de changer le type du pilote ndash soit que la source de donneacutees migre de MySQL agraveAccess agrave Oracle ou agrave SQL Server par exemple soit que vous optiez pour un autre pilote enconservant votre source de donneacutees ndash seules quelques instructions devront ecirctre reacuteeacutecrites

Avec MySQL vous pouvez travailler avec lrsquoAPI de Sun mais vous nrsquoavez pas trop le choixpour le type du pilote (

ConnectorJ

est un pilote JDBC de type 4)

Le paquetage

javasql

La version 30 de JDBC est composeacutee de classes et drsquointerfaces situeacutees dans le paquetage

javasql

du JDK MySQL propose eacutegalement une API proprieacutetaire (qui redeacutefinit et eacutetendcelle de Sun) Le tableau suivant reacutesume la composition de ce paquetage

Structure drsquoun programme

La structure drsquoun programme Java utilisant JDBC comprend successivement les phases

drsquoimportation de paquetages

de chargement drsquoun pilote

de creacuteation drsquoune ou de plusieurs connexions

de creacuteation drsquoun ou de plusieurs eacutetats

drsquoeacutemission drsquoinstructions SQL sur ces eacutetats

de fermeture des objets creacuteeacutes

Le code suivant (

JDBCTestjava

) deacutecrit la syntaxe du plus simple programme JDBC Nousinscrivons toutes les phases dans un mecircme bloc (le

main

) mais elles peuvent se trouver dansdiffeacuterents blocs ou meacutethodes de diverses classes

Tableau 8-1 LrsquoAPI JDBC 30 standard

Classeinterface Description

javasqlDriverjavasqlConnection

Pilotes JDBC pour les connexions aux sources de donneacutees SQL

javasqlStatementjavasqlPreparedStatementjavasqlCallableStatement

Construction drsquoordres SQL

javasqlResultSet

Gestion des reacutesultats des requecirctes SQL

javasqlDriverManager

Gestion des pilotes de connexion

javasqlSQLException

Gestion des erreurs SQL

javasqlDatabaseMetaDatajavasqlResultSetetaData

Gestion des meacuteta-informations (description de la base de donneacutees des tableshellip)

javasqlSavePoint

Gestion des transactions et des sous-transactions

4055_08_C08 Page 291 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

292

copy Eacuteditions Eyrolles

Le dernier bloc permet de reacutecupeacuterer les erreurs renvoyeacutees par le SGBD Nous deacutetaillerons enfin de section le traitement des exceptions

Test de votre configuration

Lrsquoenvironnement JDBC sous MySQL neacutecessite la configuration drsquoun certain nombre de variables

La variable

PATH

doit contenir le chemin de la machine virtuelle Java pour compiler etexeacutecuter des classes Le JDK est en geacuteneacuteral installeacute dans

Cj2sdk1XXX

les fichiers

javac

et

java

se trouvent dans le sous-reacutepertoire

bin

La variable

CLASSPATH

doit inclure le paquetage JDBC (fichier

jar

) pour MySQL (teacuteleacute-chargeable sur le site de MySQL) Pour ma part jrsquoai deacutezippeacute le fichier

mysql-connec-tor-java-3112zip

dans le reacutepertoire

Ctemp

Tableau 8-2 Programme de test de connexion JDBC

Code Java Commentaires

import javasql

Importation du paquetage

public class JDBCTestpublic static void main(String[] args) throws SQLException Exception

Classe ayant une meacutethode

main

try Systemoutprintln (Initialisation de la connexion) ClassforName (commysqljdbcDriver)newInstance() catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement+extoString()) try Connection cx = DriverManagergetConnection (jdbcmysqllocalhostbdsoutou user=soutouamppassword=iut)

Chargement du pilote JDBC MySQL

Creacuteation drsquoune connexion

Statement etat = cxcreateStatement () ResultSet rset = etatexecuteQuery (SELECT SYSDATE()) while (rsetnext ()) Systemoutprintln(Nous sommes le + rsetgetString (1)) Systemoutprintln(JDBC correctement configureacute)

Creacuteation drsquoun eacutetat de connexionExtraction de la date courante

Affichage du reacutesultat

catch(SQLException ex) Systemerrprintln(Erreur +ex)

Gestion des erreurs

Web

4055_08_C08 Page 292 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

293

chapitre ndeg 8 Utilisation avec Java

Vous pouvez tester votre environnement en utilisant le fichier

JDBCTest

java

Si vous utili-sez lrsquooutil

JCreator

configurez la variable

CLASSPATH

de la maniegravere suivante

Confi-gure

Options

JDK Profiles

clic sur la version du JDK puis

Edit

onglet

Classes

faire

Add Archive

et choisir le fichier

jar

(pour mon cas

mysql-connector-java-3112-binjar

)

Cet exemple deacutecrit le code neacutecessaire agrave la connexion agrave votre base (il faudra modifier le nom dela base le nom et le mot de passe de lrsquoutilisateur) et doit renvoyer les messages suivants

Initialisation de la connexion

Nous sommes le

date et heure courante

JDBC correctement configureacute

Connexion agrave une base

La connexion agrave une base de donneacutees est rendue possible par lrsquoutilisation de la classe

Driver-Manager

et de lrsquointerface

Connection

Deux eacutetapes sont neacutecessaires pour qursquoun programme Java puisse se connecter agrave une base dedonneacutees

bull Le chargement du pilote par appel de la meacutethode

javalangClassforName

bull Lrsquoeacutetablissement de la connexion en creacuteant un objet (ici cx) de lrsquointerface Connection parlrsquoinstruction suivante cx = DriverManagergetConnection(chaicircneConnexion)

Pour MySQL nous verrons que le paramegravetre chaicircneConnexion repreacutesente une variabledont une syntaxe simplifieacutee est de type

jdbcmysql[host][port][database][user][=nomUtil][amppassword][=motPasse]

Cette chaicircne permettra de deacutesigner la base et drsquoidentifier lrsquoutilisateur

Figure 8-2 Interface JCreator

4055_08_C08 Page 293 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

294 copy Eacuteditions Eyrolles

Base Access

Eacutetudions pour information lrsquoeacutetablissement de la connexion drsquoun pilote de type 1 pour semettre en rapport avec une base Access via une source de donneacutees ODBC La figure suivanteillustre les parties du panneau de configuration Windows qui permettent de deacutesigner une baseAccess Dans notre exemple la source (BaseGTRMDB) est situeacutee dans un reacutepertoire souslrsquouniteacute de disque D et deacutesigneacutee par le DSN (Data Source Name) sourcebaseGTR

Le code suivant (TestJDBCODBCjava) charge un pilote de type 1 puis se connecte agrave lasource ODBC preacuteciteacutee (inutile de preacuteciser le nom et le mot de passe de lrsquoutilisateur du faitdrsquoune base Access) Le DSN est noteacute en gras dans le script

Figure 8-3 Source de donneacutees ODBC

Tableau 8-3 Programme JDBC

Code Java Commentaires

import javasql Importationclass TestJDBCODBC public static void main (String args []) throws SQLException try catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement) try

Classe ayant une meacutethode mainChargement drsquoun pilote JDBCODBC

Connexion agrave la base Access

catch(SQLException ex) hellip Gestion des erreurs

Web

ClassforName(sunjdbcodbcJdbcOdbcDriver)

Connection conn = DriverManagergetConnection(jdbcodbcsourcebaseGTR)

4055_08_C08 Page 294 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 295

chapitre ndeg 8 Utilisation avec Java

Base MySQL

Seules les phases de chargement de pilote et de creacuteation de la connexion changent Afin detransfeacuterer un pilote MySQL il faut utiliser lrsquointerface DriverManager impleacutementeacutee parlrsquoappel de la meacutethode ClassforName() Sous ConnectorJ le nom de la classe agrave chargerest commysqljdbcDriver La connexion srsquoeffectue par la meacutethode getConnection

Interface ConnectionLe tableau ci-apregraves preacutesente les principales meacutethodes disponibles de lrsquointerface Connec-tion Nous deacutetaillerons lrsquoinvocation de certaines de ces meacutethodes agrave lrsquoaide des exemples dessections suivantes

Tableau 8-4 Chargement du pilote MySQL

Code Java Commentaires

try catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement+extoString())

Chargement du pilote MySQL

try

Deacuteclaration drsquoune con-nexion

catch(SQLException ex) Systemerrprintln(Erreur +ex)

Gestion des erreurs

ClassforName(commysqljdbcDriver)newInstance()

Connection cx = DriverManagergetConnection(jdbcmysqllocalhostbdsoutou

user=soutouamppassword=iut)

Tableau 8-5 Meacutethodes de lrsquointerface Connection

Meacutethode Description

createStatement() Creacuteation drsquoun objet destineacute agrave recevoir un ordre SQL statiquenon parameacutetreacute

prepareStatement(String) Preacutecompile un ordre SQL acceptant des paramegravetres et pouvantecirctre exeacutecuteacute plusieurs fois

prepareCall(String) Appel drsquoune proceacutedure catalogueacutee (certains pilotes attendentexecute ou ne reconnaissent pas prepareCall)

void setAutoCommit(boolean) Positionne ou non le commit automatique

void commit() Valide la transaction

void rollback() Invalide la transaction

void close() Ferme la connexion

4055_08_C08 Page 295 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

296 copy Eacuteditions Eyrolles

Eacutetats drsquoune connexion

Une fois la connexion eacutetablie il est neacutecessaire de deacutefinir des eacutetats qui permettront lrsquoencapsu-lation drsquoinstructions SQL dans du code Java Un eacutetat permet de faire passer plusieurs instruc-tions SQL sur le reacuteseau On peut affecter agrave un eacutetat une ou plusieurs instruction SQL Si ondeacutesire exeacutecuter plusieurs fois la mecircme instruction il est inteacuteressant de reacuteserver lrsquoutilisationdrsquoun eacutetat agrave cet effet

Interfaces disponibles

Diffeacuterentes interfaces sont preacutevues agrave cet effet

Statement pour les ordres SQL statiques Ces eacutetats sont construits par la meacutethodecreateStatement appliqueacutee agrave la connexion

PreparedStatement pour les ordres SQL parameacutetreacutes Ces eacutetats sont construits par lameacutethode prepareStatement appliqueacutee agrave la connexion

CallableStatement pour les proceacutedures ou fonctions catalogueacutees Ces eacutetats sont cons-truits par la meacutethode prepareCall appliqueacutee agrave la connexion

Srsquoil ne doit plus ecirctre utiliseacute dans la suite du code Java chaque objet de type StatementPreparedStatement ou CallableStatement devra ecirctre fermeacute agrave lrsquoaide de la meacutethodeclose

Meacutethodes geacuteneacuteriques pour les paramegravetres

Une fois qursquoun eacutetat est creacuteeacute il est possible de lui passer des paramegravetres par des meacutethodes geacuteneacute-riques (eacutetudieacutees plus en deacutetail par la suite)

setxxx ougrave XXX deacutesigne le type de la variable (exemple setString ou setInt) dusens Java vers MySQL (setter methods) Il srsquoagit ici de parameacutetrer un ordre SQL(instruction ou appel drsquoun sous-programme)

Figure 8-4 Connexion et eacutetats

Connection Statement

Statement

PreparedstatementBaseMySQL

Java

JDBC

SELECT INSERThellip

Donneacutees (INT VARCHAR )

4055_08_C08 Page 296 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 297

chapitre ndeg 8 Utilisation avec Java

getxxx (exemple getString ou getInt) du sens MySQL vers Java Il srsquoagit icidrsquoextraire des donneacutees de la base dans des variables hocirctes Java via un curseur Java (gettermethods)

updatexxx (exemple updateString ou upadateInt) du sens Java vers MySQL Ilsrsquoagit ici de mettre agrave jour des donneacutees de la base via un curseur Java (updater methods)Ces meacutethodes sont disponibles seulement depuis la version 2 de JDBC (SDK 12)

Eacutetats simples (interface Statement)

Nous deacutecrivons ici lrsquoutilisation drsquoun eacutetat simple (interface Statement) Nous eacutetudierons parla suite les instructions parameacutetreacutees (interface PreparedStatement) et appels de sous-programmes (interface CallableStatement) Le tableau suivant deacutecrit les principalesmeacutethodes de lrsquointerface Statement

Le code suivant (Etatsjava) preacutesente quelques exemples drsquoutilisation de ces meacutethodes surun eacutetat (objet etatSimple) Nous supposons qursquoun pilote JDBC est chargeacute et que laconnexion cx a eacuteteacute creacuteeacutee Nous verrons en fin de chapitre comment traiter proprement lesexceptions

Tableau 8-6 Meacutethodes de lrsquointerface Statement

Meacutethode Description

ResultSet execute-Query(String)

Exeacutecute une requecircte et retourne un ensemble de lignes (objetResultSet)

int executeUpdate(String) Exeacutecute une instruction SQL et retourne le nombre de lignestraiteacutees (INSERT UPDATE ou DELETE) ou 0 pour les instruc-tions ne renvoyant aucun reacutesultat (LDD)

boolean execute(String) Exeacutecute une instruction SQL et renvoie true si crsquoest une ins-truction SELECT false sinon (instructions LMD ou plusieursreacutesultats ResultSet)

Connection getConnection() Retourne lrsquoobjet de la connexion

void setMaxRows(int) Positionne la limite du nombre drsquoenregistrements agrave extraire partoute requecircte issue de cet eacutetat

int getUpdateCount() Nombre de lignes traiteacutees par lrsquoinstruction SQL (-1 si crsquoest unerequecircte ou si lrsquoinstruction nrsquoaffecte aucune ligne)

void close() Ferme lrsquoeacutetat

4055_08_C08 Page 297 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

298 copy Eacuteditions Eyrolles

Meacutethodes agrave utiliser

Le tableau suivant indique la meacutethode preacutefeacuterentielle agrave utiliser sur lrsquoeacutetat courant (objet State-ment) en fonction de lrsquoinstruction SQL agrave eacutemettre

Correspondances de types

Les eacutechanges de donneacutees entre variables Java et colonnes des tables Oracle impliquent depreacutevoir des conversions de types Drsquoune maniegravere geacuteneacuterale tout type de donneacutee MySQL peutecirctre convertit en un type javalangString Les types numeacuteriques trouvent aussi unecorrespondance dans les types numeacuteriques Java (attention toutefois aux arrondis deacutepassementde capaciteacute ou perte de preacutecision)

Tableau 8-7 Eacutetats simples

Code Java Commentaires

Statement etatSimple = cxcreateStatement() Creacuteation de lrsquoeacutetat (CREATE TABLE IF NOT EXISTSCompagnie(comp VARCHAR(4) nomComp VARCHAR(30)CONSTRAINT pk_Compagnie PRIMARY KEY(comp)))

Ordre LDD

(CREATE TABLE IF NOT EXISTS Avion (immat VARCHAR(6)typeAvionVARCHAR(15) cap SMALLINT compa VARCHAR(4) CONSTRAINT pk_Avion PRIMARY KEY(immat) CONSTRAINT fk_Avion_comp_Compagnie FOREIGN KEY(compa) REFERENCESCompagnie(comp)))

Ordre LDD (autre eacutecri-ture) j contient 0 (aucune ligne nrsquoest con-cerneacutee)

(INSERT INTOCompagnie VALUES (AFAir France))

Ordre LMD k contient 1 (une ligne est concerneacutee)

(INSERT INTO Avion VALUES (F-WTSSConcorde90AF)) (INSERT INTO Avion VALUES (F-FGFBA320148AF))

Ordres LMD (autres eacutecri-tures)

(10) Pas plus de 10 lignes retourneacutees par les pro-chaines extractions

ResultSet curseurJava = (SELECT FROM Avion)

Chargement drsquoun curseur Java

etatSimpleexecute(DELETE FROM Avion) int l = ()

Ordre LMD l contient 2 (avions supprimeacutes)

WebetatSimpleexecute

int j = etatSimpleexecuteUpdate

int k = etatSimpleexecuteUpdate

etatSimpleexecute

etatSimpleexecute

etatSimplesetMaxRows

etatSimpleexecuteQuery

etatSimplegetUpdateCount

Tableau 8-8 Meacutethodes Java pour les ordres SQL

Instruction SQL Meacutethode Type de retour

CREATE ALTER DROP executeUpdate int

INSERT UPDATE DELETE executeUpdate int

SELECT executeQuery ResultSet

4055_08_C08 Page 298 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 299

chapitre ndeg 8 Utilisation avec Java

Les tableaux suivants preacutesentent les principales correspondances existantes

La meacutethode getObject()de lrsquointerface ResultSet (que nous allons eacutetudier plus loin)reacutealise implicitement les conversions suivantes

Tableau 8-9 Conversions possibles entre types

Les types MySQL Peuvent creacuteer les classes Java

CHAR VARCHAR BLOB TEXT ENUM et SET

javalangString javaioInputStream javaioReader javasqlBlob et javasqlClob

FLOAT REAL DOUBLE PRECISION NUMERIC DECIMAL TINYINT SMALLINT MEDIUMINT INTEGER et BIGINT

javalangString javalangShort javalangInteger javalangLong javalangDou-ble et javamathBigDecimal

DATE TIME DATETIME et TIMESTAMP

javalangString javasqlDate et javasqlTimestamp

Tableau 8-10 Correspondances entre types

Types MySQL Types Java

BOOL et BOOLEAN alias de TINYINT(1)

BLOB BINARY(n) BIT(gt1) LONGBLOB MEDIUMBLOB TINYBLOB et VARBINARY(n)

byte[]

BIT(1) et TINYINT javalangBoolean si la configuration tinyInt1isBit est mise agrave true (par deacutefaut) et la taille de la variable = 1 (javalangInteger sinon)

DOUBLE[(np)] javalangDouble

FLOAT[(np)] javalangFloat

SMALLINT[(n)] [UNSIGNED] javalangInteger (sans controcircle du signe)

INT et INTEGER[(n)] [UNSIGNED] javalangInteger (si UNSIGNED javalangLong)

MEDIUMINT[(n)] [UNSIGNED] javalangInteger (si UNSIGNED javalangLong)

BIGINT[(n)] [UNSIGNED] javalangLong (si UNSIGNEDjavamathBigInteger)

TINYTEXT TEXT MEDIUMTEXTLONGTEXT ENUM() et SET()

javalangString

CHAR(M) VARCHAR(M) [BINARY] javalangString (si BINARY byte[])

DECIMAL[(n[p])] javamathBigDecimal

DATE javasqlDate

YEAR[(2|4)] javasqlDate (date initialiseacutee au 1er Janvier 0h)

TIME javasqlTime

DATETIME TIMESTAMP[(n)] javasqlTimestamp

4055_08_C08 Page 299 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

300 copy Eacuteditions Eyrolles

Il est possible de connaicirctre le type de la variable (ou de lrsquoobjet Java) que vous devez utiliserdans votre programme JDBC pour travailler avec une colonne col drsquoune table tab Pour cefaire utiliser la meacutethode Class getClass() appliqueacute agrave lrsquoobjet reacutesultant de lrsquoextraction de lacolonne dans le ResultSet par getObject(col) Une fois cette classe instancieacutee il resteagrave utiliser String getName() pour trouver son nom

Le code suivant (CorresTypesjava) preacutesente la maniegravere drsquoextraire le type Java neacutecessairepour travailler avec la colonne cap de la table Avion (ici SMALLINT)

La trace de ce programme est la suivante

Valeur 148

Classe Java equivalente

Manipulations avec la base

Deacutetaillons agrave preacutesent les diffeacuterents sceacutenarios que lrsquoon peut rencontrer lors drsquoune manipulationde la base de donneacutees par un programme Java Les tableaux suivants reacutepertorient les conseacute-quences les plus freacutequentes Les autres cas (relatifs aux contraintes reacutefeacuterentielles et auxproblegravemes de syntaxe) seront eacutetudieacutes dans la section Traitement des exceptions

Suppression de donneacutees

Tableau 8-11 Deacuteduction du type Java agrave utiliser

Code Java Commentaires

ResultSet curseurJava = etatSimpleexecuteQuery (SELECT cap FROM Avion LIMIT 1)

Extraction dans un curseur de lacapaciteacute du premier avion

while (curseurJavanext ()) Ouverture et lecture du curseur Systemoutprintln(Valeur +curseurJavagetObject(cap)) Systemoutprintln (Classe Java equivalente + )

Extraction de lrsquoobjet Java eacutequiva-lent

Deacuteduction de sa classe

Web

Object obj = curseurJavagetObject(cap)

Class clJava = objgetClass()

clJavagetName()

javalangInteger

Tableau 8-12 Enregistrements preacutesents dans la table

Code Java Reacutesultat

etatexecuteUpdate(DELETE FROM Avion) Fait la suppression et passe en seacutequence

j = etatexecuteUpdate(DELETE FROM Avion) Fait la suppression affecte agrave j le nombredrsquoenregistrements supprimeacutes et passe enseacutequence

4055_08_C08 Page 300 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 301

chapitre ndeg 8 Utilisation avec Java

Ajout drsquoenregistrements

Modification drsquoenregistrements

Extraction de donneacutees

Eacutetudions ici la gestion des reacutesultats drsquoune instruction SELECT

Le reacutesultat drsquoune requecircte est placeacute dans un objet de lrsquointerface ResultSet qui srsquoapparente agraveun curseur Java

Le tableau suivant preacutesente les principales meacutethodes disponibles de lrsquointerface ResultSetLes meacutethodes relatives aux curseurs navigables seront eacutetudieacutees par la suite Le parcours de cecurseur srsquoopegravere par la meacutethode next Initialement (apregraves creacuteation et chargement du curseur)on est positionneacute avant la premiegravere ligne Bien qursquoun objet de lrsquointerface ResultSet soitautomatiquement fermeacute quand son eacutetat est fermeacute ou recreacuteeacute il est preacutefeacuterable de le fermer expli-citement par la meacutethode close srsquoil ne doit pas ecirctre reacuteutiliseacute

Tableau 8-13 Aucun enregistrement dans la table

Code Java Reacutesultat

etatexecuteUpdate(DELETE FROM Avion) Aucune action sur la base et passe enseacutequence

j = etatexecuteUpdate(DELETE FROM Avion) Aucune action sur la base affecte agrave j lavaleur 0 et passe en seacutequence

Tableau 8-14 Diffeacuterentes eacutecritures drsquoun INSERT

Code Java Reacutesultat

etatexecuteUpdate(INSERT INTO Compagnie VALUES (TAFToulouse Air Free))

Fait lrsquoinsertion et passe en seacutequence

int j= etatexecuteUpdate(INSERT INTO Compa-gnie VALUES (TAFToulouse Air Free))

Fait lrsquoinsertion affecte agrave j le nombre 1 etpasse en seacutequence

Tableau 8-15 Diffeacuterentes eacutecritures drsquoun UPDATE

Code Java Reacutesultat

etatexecuteUpdate(UPDATE Compagnie SET nomComp = Air France Compagny WHERE comp = AF)

Fait la modification et passe enseacutequence Si aucun enregistrement nrsquoestconcerneacute aucune exception nrsquoest leveacutee

int j= etatexecuteUpdate(UPDATE Avion SET capacite=capacite12)

Fait la (les) modification(s) affecte agrave j lenombre drsquoenregistrements modifieacutes etpasse en seacutequence (0 si aucun enregis-trement nrsquoest modifieacute)

4055_08_C08 Page 301 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

302 copy Eacuteditions Eyrolles

Distinguons lrsquoinstruction SELECT qui geacutenegravere un curseur statique (objet Resultset utiliseacutesans option particuliegravere) de celle qui produit un curseur navigable ou modifiable (objetResultset employeacute avec des options disponibles depuis la version 2 de JDBC)

Curseurs statiques

Le code suivant (SELECTstatiquejava) extrait les avions de la compagnie Air Francepar lrsquointermeacutediaire du curseur curseurJava Notez lrsquoutilisation des diffeacuterentes meacutethodesget pour reacutecupeacuterer des valeurs issues de colonnes

Tableau 8-16 Meacutethodes principales de lrsquointerface ResulSet

Meacutethode Description

boolean next() Charge lrsquoenregistrement suivant en retournant true renvoiefalse lorsqursquoil nrsquoy a plus drsquoenregistrement suivant

void close() Ferme le curseur

getxxx(int) Reacutecupegravere au niveau de lrsquoenregistrement la valeur de lacolonne numeacuteroteacutee de type xxx Exemple getInt(1) getS-tring(1) getDate(1) etc pour reacutecupeacuterer la valeur de la pre-miegravere colonne

updatexxx(hellip) Modifie au niveau de lrsquoenregistrement la valeur de la colonnenumeacuteroteacutee de type xxx Exemple updateInt(1i)updateString(1nom) etc

ResultSetMetaData getMetaData() Retourne un objet ResultSetMetaData correspondant au curseur

Object getObject(String) Retourne la valeur de la colonne deacutesigneacutee par le paramegravetredans une variable Java de type adeacutequat

Tableau 8-17 Extraction de donneacutees dans un curseur statique

Code Java Commentaires

try hellipStatement etatSimple = cxcreateStatement() Creacuteation de lrsquoeacutetat

= (SELECT immat cap FROM Avion WHERE comp = (SELECT comp FROM Compagnie WHERE nom-Comp=Air France))

Creacuteation et charge-ment du curseur

float moyenneCapaciteacute =0int nbAvions = 0while ( ) Systemoutprint(Immat + Systemoutprintln(Capaciteacute + moyenneCapaciteacute += curseurJavagetInt(2) nbAvions ++ moyenneCapaciteacute = nbAvions Systemoutprintln(Capaciteacute moy +moyenneCapaciteacute)

Parcours du curseur

Extraction de colonnes

Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

ResultSet curseurJavaetatSimpleexecuteQuery

curseurJavanext()curseurJavagetString(1))

curseurJavagetInt(2))

curseurJavaclose()

4055_08_C08 Page 302 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 303

chapitre ndeg 8 Utilisation avec Java

Curseurs navigables

Un curseur ResultSet deacuteclareacute sans option nrsquoest ni navigable ni modifiable Seul un deacuteplace-ment du deacutebut vers la fin (par la meacutethode next) est admis Il est possible de rendre un curseurnavigable en permettant de le parcourir en avant ou en arriegravere et en autorisant lrsquoaccegraves direct agraveun enregistrement drsquoune maniegravere absolue (en partant du deacutebut ou de la fin du curseur) ou rela-tive (en partant de la position courante du curseur) On peut aussi rendre un curseur modifiable(la base pourra ecirctre changeacutee par lrsquointermeacutediaire du curseur)

Degraves lrsquoinstant ougrave on deacuteclare un curseur navigable il faut aussi statuer sur le fait qursquoil soit modi-fiable ou pas (section suivante) La nature du curseur est expliciteacutee agrave lrsquoaide drsquooptions de lameacutethode createStatement

Statement createStatement(int typeCurseur int modifCurseur)

Constantes

Les valeurs permises du premier paramegravetre (typeCurseur) et qui concernent le sens deparcours sont preacutesenteacutees dans le tableau suivant

Un curseur est sensible degraves que des mises agrave jour de la table sont automatiquement reacutepercu-teacutees au niveau du curseur durant la transaction Lorsqursquoil est deacuteclareacute insensible les modifica-tions de la table ne sont pas renvoyeacutees dans le curseur

Meacutethodes

Les principales meacutethodes que lrsquoon peut appliquer agrave un curseur navigable sont les suivantesLes deux premiegraveres sont aussi des meacutethodes de lrsquointerface Statement qui affectent et preacuteci-sent le sens de parcours pour tous les curseurs de lrsquoeacutetat donneacute

Tableau 8-18 Constantes de navigation drsquoun curseur

Constante Explication

ResultSetTYPE_FORWARD_ONLY Le parcours du curseur srsquoopegravere invariablement du deacutebut agrave la fin (non navigable)

ResultSetTYPE_SCROLL_INSENSITIVE Le curseur est navigable mais pas sensible aux modifica-tions

ResultSetTYPE_SCROLL_SENSITIVE Le curseur est navigable et sensible aux modifications

4055_08_C08 Page 303 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

304 copy Eacuteditions Eyrolles

ConnectorJ de MySQL ne permet pas encore de changer le sens de parcours drsquoun curseur auniveau de lrsquoeacutetat et au niveau du curseur lui-mecircme (seule la constante ResultSetFETCH_FORWARD est interpreacuteteacutee) Aucune erreur nrsquoa lieu agrave lrsquoexeacutecution si vous modifiez le sens de par-cours drsquoun curseur la direction restera simplement inchangeacutee (en avant toute )

Ainsi pour parcourir un curseur agrave lrsquoenvers il faudra soit utiliser des indices neacutegatifs (dans lesmeacutethodes absolute et relative) soit employer la meacutethode previous en partant de lafin du curseur (afterLast)

Tableau 8-19 Meacutethodes de navigation dans un curseur

Meacutethode Fonction

void setFetchDirection(int) Affecte la direction du parcours ResultSetFETCH_FORWARD (1000)ResultSetFETCH_REVERSE (1001) ouResultSetFETCH_UNKNOWN (1002)

int getFetchDirection() Extrait la direction courante (une des trois valeurs ci-dessus)

boolean isBeforeFirst() Indique si le curseur est positionneacute avant le premier enregistre-ment (false si aucun enregistrement nrsquoexiste)

void beforeFirst() Positionne le curseur avant le premier enregistrement (aucuneffet si le curseur est vide)

boolean isFirst() Indique si le curseur est positionneacute sur le premier enregistrement(false si aucun enregistrement nrsquoexiste)

boolean isLast() Indique si le curseur est positionneacute sur le dernier enregistrement(false si aucun enregistrement nrsquoexiste)

boolean isAfterLast() Indique si le curseur est positionneacute apregraves le dernier enregistre-ment (false si aucun enregistrement nrsquoexiste)

void afterLast() Positionne le curseur apregraves le dernier enregistrement (aucun effetsi le curseur est vide)

boolean first() Positionne le curseur sur le premier enregistrement (false siaucun enregistrement nrsquoexiste)

boolean previous() Positionne le curseur sur lrsquoenregistrement preacuteceacutedent (false siaucun enregistrement ne preacutecegravede)

boolean last() Positionne le curseur sur le dernier enregistrement (false siaucun enregistrement nrsquoexiste)

boolean absolute(int) Positionne le curseur sur le n-iegraveme enregistrement (en partant dudeacutebut si n est positif ou de la fin si n est neacutegatif false si aucunenregistrement nrsquoexiste agrave cet indice)

boolean relative(int) Positionne le curseur sur le n-iegraveme enregistrement en partant dela position courante (en avant si n est positif ou en arriegravere si n estneacutegatif false si aucun enregistrement nrsquoexiste agrave cet indice)

4055_08_C08 Page 304 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 305

chapitre ndeg 8 Utilisation avec Java

Parcours

Le code suivant (SELECTnavigablejava) preacutesente une utilisation du curseur navigablecurseurNaviJava Le deuxiegraveme test renvoie false car apregraves lrsquoouverture le curseurnrsquoest pas positionneacute sur le premier enregistrement et la meacutethode next le place selon le sensdu parcours du curseur

Creacuteez des curseurs non navigables quand vous voulez rapatrier de tregraves gros volumes de don-neacutees (taille du cache limitative cocircteacute client) Fragmentez vos requecirctes quand vous voulez mani-puler des curseurs navigables Les prochaines versions de MySQL et ConnectorJ devraientprendre en charge une gestion cocircteacute serveur des curseurs navigables

Tableau 8-20 Parcours drsquoun curseur navigable

Code Java Commentaires

try hellipStatement etatSimple =createStatement Creacuteation de

lrsquoeacutetat

ResultSet curseurNaviJava = etatSimpleexecuteQuery(SELECT immattypeAvioncap FROM Avion)

Creacuteation et chargement du curseur

if ( ) Systemoutprintln(Curseur positionneacute au deacutebut)

Test renvoyant true

if ( curseurNaviJavaisFirst() ) Systemoutprintln(Curseur positionneacute sur le 1er deacutejagrave)

Test renvoyant false

while( ) if ( ) Systemoutprintln(1er avion ) if ( ) Systemoutprintln(Dernier avion ) Systemoutprint(Immat +curseurNaviJavagetString(1)) Systemoutprintln( type +curseurNaviJavagetString(2))

Parcours du curseur en affi-chant les pre-mier et dernier enregistre-ments

if ( )Systemoutprintln(Curseur positionneacute apregraves la fin)

Test renvoyant true

if ( ) if ( ) Systemoutprinln(Avant dernier avion + curseurNaviJavagetString(1))

Affiche lrsquoavant-dernier enregis-trement

if ( ) Systemoutprintln(First avion + curseurNaviJavagetString(1))

Affiche le pre-mier enregistre-ment

if ( ) Systemoutprintln(Last avion + curseurNaviJavagetString(1))

Affiche le der-nier enregistre-ment

curseurNaviJavaclose() Ferme le cur-seur

catch(SQLException ex) hellip Gestion des erreurs

Web

(ResultSetTYPE_SCROLL_INSENSITIVEResultSetCONCUR_READ_ONLY)

curseurNaviJavaisBeforeFirst()

curseurNaviJavanext()curseurNaviJavaisFirst()

curseurNaviJavaisLast()

curseurNaviJavaisAfterLast()

curseurNaviJavaprevious()curseurNaviJavaprevious()

curseurNaviJavafirst()

curseurNaviJavalast()

4055_08_C08 Page 305 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

306 copy Eacuteditions Eyrolles

Positionnements

Des meacutethodes assurent lrsquoaccegraves direct agrave un curseur navigable Notez que absolute(1) eacutequi-vaut agrave first() de mecircme absolute(-1) eacutequivaut agrave last() Concernant la meacutethoderelative il faut lrsquoutiliser dans un test pour srsquoassurer qursquoelle srsquoapplique agrave un enregistrementexistant (voir lrsquoexemple suivant) Drsquoautre part lrsquoutilisation de relative(0) nrsquoa aucun effetConsideacuterons la table suivante qui est interrogeacutee au niveau des trois premiegraveres colonnes par lecurseur navigable curseurPosJava

Le code suivant (SELECTPositionsjava) preacutesente les meacutethodes qui permettent drsquoacceacutederdirectement agrave des enregistrements de ce curseur

Figure 8-5 Curseur navigable

Avion

immat typeAvion cap comp

F-FGFB Concorde 95 AF F-GKUB A330 240 AERIF-GLFS A320 140 TAT

F-GLKT A340 300 AERI F-GLZV A330 250 AERI F-WTSS Concorde 90 AF

curseurPosJava

absolute(1)

relative (2)

absolute(-1)

Tableau 8-21 Positionnements dans un curseur navigable

Code Java Commentaires

try hellipStatement etatSimple =createStatement

Creacuteation de lrsquoeacutetat avec cur-seurs insensibles et non modi-fiables

ResultSet curseurPosJava = etatSimpleexecuteQuery(SELECT immattypeAvioncap FROM Avion)

Creacuteation et chargement du cur-seur

Curseur sur le premier avion if ( ) Systemoutprintln(relative(2) + curseurPosJavagetString(1)) else Systemoutprintln(Pas de 3egraveme avion)

Accegraves au troisiegraveme avion

if ( ) Systemoutprintln(relative(-2) + curseurPosJavagetString(1)) else Systemoutprintln(Pas retour -2 possible )

Retour au premier avion

Web

(ResultSetTYPE_SCROLL_INSENSITIVEResultSetCONCUR_READ_ONLY)

curseurPosJavaabsolute(1)curseurPosJavarelative(2)

curseurPosJavarelative(-2)

4055_08_C08 Page 306 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 307

chapitre ndeg 8 Utilisation avec Java

Pour deacutefinir un curseur navigable

bull Une requecircte ne doit pas contenir de jointure

bull Eacutecrivez laquo SELECT a FROM table ahellip raquo agrave la place de laquo SELECT FROM tablehellipraquo

Curseurs modifiables

Un curseur modifiable permet de mettre agrave jour la base de donneacutees transformation de colon-nes suppressions et insertions drsquoenregistrements Les valeurs permises du deuxiegraveme paramegrave-tre (modifCurseur) de la meacutethode createStatement deacutefinie agrave la section preacuteceacutedentesont preacutesenteacutees dans le tableau suivant

Le caractegravere modifiable drsquoun curseur est indeacutependant de sa navigabiliteacute Neacuteanmoins il estcourant qursquoun curseur modifiable soit eacutegalement navigable (pour pouvoir se positionner agrave lademande sur un enregistrement avant drsquoeffectuer sa mise agrave jour)

Pour speacutecifier un curseur de nature CONCUR_UPDATABLE

bull Une requecircte ne doit pas contenir de jointure ni de regroupement elle doit seulement extrairedes colonnes (les fonctions monolignes et multilignes sont interdites)

bull Eacutecrivez laquo SELECT a FROM table ahellip raquo agrave la place de laquo SELECT FROM tablehellip raquo

if ( Systemoutprintln(absolute(-2) + curseurPosJavagetString(1)) else Systemoutprintln(Pas davant dernier avion)

Accegraves agrave lrsquoavant-dernier enre-gistrement

while( ) hellip

Parcours du curseur en sensinverse

curseurPosJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

Tableau 8-21 Positionnements dans un curseur navigable (suite)

Code Java Commentaires

curseurPosJavaabsolute(-2)

curseurPosJavaafterLast()curseurPosJavaprevious()

Tableau 8-22 Constantes de modification drsquoun curseur

Constante Explication

ResultSetCONCUR_READ_ONLY Le curseur ne peut ecirctre modifieacute

ResultSetCONCUR_UPDATABLE Le curseur peut ecirctre modifieacute

4055_08_C08 Page 307 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

308 copy Eacuteditions Eyrolles

Il est aussi possible de deacutefinir un curseur par une requecircte de type SELECThellip FOR UPDATELes principales meacutethodes relatives aux curseurs modifiables sont les suivantes

Les opeacuterations de modification et drsquoinsertion (UPDATE et INSERT) agrave travers un curseur se reacutealisenten deux temps mise agrave jour du curseur puis propagation agrave la table de la base de donneacutees Il suffitainsi de ne pas exeacutecuter la deuxiegraveme eacutetape pour ne pas opeacuterer la mise agrave jour de la base

La suppression drsquoenregistrements (DELETE) agrave travers un curseur srsquoopegravere en une seule instruc-tion qui nrsquoest pas forceacutement valideacutee par la suite il faudra programmer explicitement le commitou laisser le paramegravetre drsquoautocommit agrave true (par deacutefaut)

La figure suivante illustre les modifications effectueacutees sur la table Avion par lrsquointermeacutediairedu curseur CurseurModifJava utiliseacute par les trois programmes Java suivants

Tableau 8-23 Meacutethodes de navigation dans un curseur

Meacutethode Fonction

int getResultSetType() Renvoie le caractegravere navigable des curseurs drsquoun eacutetat donneacute (ResultSetTYPE_FORWARD_ONLYhellip)

int getResultSetConcurrency() Renvoie le caractegravere modifiable des curseurs drsquoun eacutetat donneacute (ResultSetCONCUR_READ_ONLY ouResultSetCONCUR_UPDATABLE)

int getType() Renvoie le caractegravere navigable drsquoun curseur donneacute

int getConcurrency() Renvoie le caractegravere modifiable drsquoun curseur donneacute

void deleteRow() Supprime lrsquoenregistrement courant

void updateRow() Modifie la table avec lrsquoenregistrement courant

void cancelRowUpdates() Annule les modifications faites sur lrsquoenregistrement courant

void moveToInsertRow() Deacuteplace le curseur vers un nouvel enregistrement

void insertRow() Insegravere dans la table lrsquoenregistrement courant

void moveToCurrentRow() Retour vers lrsquoenregistrement courant (agrave utiliser eacuteventuellement apregraves moveToInsertRow)

Figure 8-6 Mises agrave jour drsquoun curseur

Avion

immat typeAvion cap comp

F-FGFB Concorde 95 AF F-GKUB A330rarrA380 240rarr350 AERI F-GLFS A320 140 TAT F-GLKT A340 300 AERI F-GLZV A330 250 AERI F-WTSS Concorde 90 AF F-LUTE TB20 4 NULL

curseurModifJavainsertRow()

deleteRow()

updateRow()

4055_08_C08 Page 308 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 309

chapitre ndeg 8 Utilisation avec Java

Suppressions

Le code suivant (ResultDELETEjava) supprime le troisiegraveme enregistrement du curseur etreacutepercute la mise agrave jour au niveau de la table Avion du scheacutema connecteacute Nous deacuteclarons icice curseur laquo navigable raquo

Le code suivant (ResultDELETE2java) supprime le mecircme enregistrement en supposantson indice a priori inconnu Nous deacuteclarons ici ce curseur laquo non navigable raquo Notez lrsquoutilisa-tion de la meacutethode equals pour comparer deux chaicircnes de caractegraveres

Tableau 8-24 Suppression drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

if ( ) cxcommit() else Systemoutprintln(Pas de 3egraveme avion)

Accegraves direct au troi-siegraveme avion suppres-sion de lrsquoenregistre-ment

curseurModifJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_SCROLL_INSENSITIVEResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

curseurModifJavaabsolute(3)curseurModifJavadeleteRow()

Tableau 8-25 Suppression drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la valida-tion automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

while(curseurModifJavanext()) if (curseurModifJavagetString(1)equals(p_immat))

Accegraves agrave lrsquoenregistrementet suppression

curseurModifJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_FORWARD_ONLYResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

String p_immat = F-GLFS

curseurModifJavadeleteRow()

4055_08_C08 Page 309 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

310 copy Eacuteditions Eyrolles

Modifications

La modification de colonnes drsquoun enregistrement au niveau de la base de donneacutees srsquoopegravere endeux eacutetapes mise agrave jour du curseur par les meacutethodes updatexxx (updater methods) puispropagation des mises agrave jour dans la table par la meacutethode updateRow()

Les meacutethodes updatexxx ont chacune deux signatures Par exemple la meacutethode de modifi-cation drsquoune chaicircne de caractegraveres (valable pour les colonnes CHAR et VARCHAR) est disponibleen raisonnant en fonction soit de la position soit du nom de la colonne du curseur

void updateString(int positionColonne String chaicircne)

void updateString(String nomColonne String chaicircne)

Le code suivant (ResultUPDATEjava) change au niveau de la table Avion deux colonnesdu deuxiegraveme enregistrement du curseur Nous deacuteclarons ici ce curseur laquo sensible raquo pourpouvoir eacuteventuellement visualiser la transformation reacutealiseacutee dans le mecircme programme

Insertions

Lrsquoinsertion drsquoun enregistrement au niveau de la base de donneacutees srsquoopegravere en trois eacutetapes preacuteparation agrave lrsquoinsertion dans le curseur par la meacutethode moveToInsertRow mise agrave jour ducurseur par les meacutethodes updatexxx puis propagation des actualisations dans la table par lameacutethode insertRow Lrsquoeacuteventuel retour agrave lrsquoenregistrement courant se programme agrave lrsquoaide dela meacutethode moveToCurrentRow

Le code suivant (ResultINSERTjava) insegravere un nouvel enregistrement au niveau de latable Avion La quatriegraveme colonne de la table nrsquoest pas indiqueacutee dans le curseur elle est

Tableau 8-26 Modifications drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

if (curseurModifJavaabsolute(2))

cxcommit() else Systemoutprintln(Pas de 2egraveme avion)

Accegraves agrave lrsquoenregistrementPremiegravere eacutetape

Deuxiegraveme eacutetape

Validation

curseurModifJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_SCROLL_SENSITIVEResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

curseurModifJavaupdateString(2A380)curseurModifJavaupdateInt(3350)

curseurModifJavaupdateRow()

4055_08_C08 Page 310 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 311

chapitre ndeg 8 Utilisation avec Java

donc passeacutee agrave NULL au niveau de la table en lrsquoabsence de valeur par deacutefaut deacutefinie dans lacolonne

Gestion des seacutequences

Avant la version 30 de lrsquoAPI JDBC de Sun il nrsquoy avait pas de possibiliteacute laquo standard raquodrsquoextraire la valeur courante drsquoune seacutequence (colonne AUTO_INCREMENT) Avec des ancienspilotes JDBC pour MySQL il eacutetait possible drsquoutiliser une meacutethode speacutecifique de lrsquointerfaceStatement ou drsquoexeacutecuter une requecircte du type SELECT LAST_INSERT_ID() apregraves avoirinseacutereacute un enregistrement Le premier meacutecanisme nrsquoassure pas la portabiliteacute le second nrsquoestpas efficace puisqursquoil oblige agrave inseacuterer une ligne au preacutealable (qursquoon peut toutefois annuleravec un rollback)

Agrave preacutesent JDBC 30 offre deux nouveaux meacutecanismes afin drsquoextraire la valeur courante drsquouneseacutequence AUTO_INCREMENT la meacutethode getGeneratedKeys() ou lrsquoexploitation drsquouncurseur modifiable via la meacutethode insertRow()

Dans tous les cas il nrsquoest pas neacutecessaire drsquoinseacuterer reacuteellement un nouvel enregistrement (annu-lation possible par rollback) En revanche lrsquoexeacutecution de lrsquoajout (par INSERT) est obligatoirepour que MySQL eacutevalue une nouvelle valeur de la seacutequence Cette action est irreacuteversible dansle sens ougrave la seacutequence sera increacutementeacutee qursquoon valide ou non lrsquoajout de lrsquoenregistrement

Tableau 8-27 Insertion drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

cxcommit()

Premiegravere eacutetape

Deuxiegraveme eacutetape

Troisiegraveme eacutetape curseurModifJavaclose() Validation

Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_SCROLL_SENSITIVEResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

curseurModifJavamoveToInsertRow()

curseurModifJavaupdateString(1F-LUTE)curseurModifJavaupdateString(2TB20)curseurModifJavaupdateInt(34)

curseurModifJavainsertRow()

4055_08_C08 Page 311 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

312 copy Eacuteditions Eyrolles

Meacutethode getGeneratedKeysLe code suivant (Sequence1java) insegravere un nouvel enregistrement dans la table Affre-ter (deacutecrite au chapitre 2 section Seacutequences) et reacutecupegravere la valeur courante de la seacutequence agravelrsquoaide de la meacutethode getGeneratedKeys()

Curseur modifiable

Le code suivant (Sequence2java) insegravere un nouvel enregistrement dans la table Affre-ter par un curseur modifiable et reacutecupegravere la valeur courante de la seacutequence agrave lrsquoaide de lameacutethode getInt() appliqueacutee agrave la colonne AUTO_INCREMENT

Tableau 8-28 Reacutecupeacuteration drsquoune seacutequence agrave lrsquoaide drsquoun eacutetat

Code Java Commentaires

try hellip Statement etat = cxcreateStatement (javasqlResultSetTYPE_FORWARD_ONLY javasqlResultSetCONCUR_UPDATABLE) cxsetAutoCommit(false)

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

if (curseurnext()) Systemoutprintln(Valeur de la sequence + curseurgetInt(1)) else Systemoutprintln(Pb sequence ) cxrollback()

Insertion avec lrsquooption dereacutecupeacuteration de cleacute geacuteneacute-reacutee

Extraction de la seacutequence

curseurclose() etatclose() cxclose() Invalidation de lrsquoajoutFermeture des objets

catch(SQLException ex) hellip Gestion des erreurs

Web

etatexecute(INSERT INTO bdsoutouAffreter(compimmatdateAffnbPax)VALUES(AFA1NOW()100)StatementRETURN_GENERATED_KEYS)

ResultSet curseur = etatgetGeneratedKeys()

Tableau 8-29 Reacutecupeacuteration drsquoune seacutequence agrave lrsquoaide drsquoun curseur modifiable

Code Java Commentaires

try hellip Statement etat = cxcreateStatement (javasqlResultSetTYPE_FORWARD_ONLY javasqlResultSetCONCUR_UPDATABLE) cxsetAutoCommit(false)

Creacuteation de lrsquoeacutetat et deacutesac-tivation de la validationautomatique

Web

4055_08_C08 Page 312 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 313

chapitre ndeg 8 Utilisation avec Java

Interface ResultSetMetaData

Lrsquointerface ResultSetMetaData est utile pour retrouver dynamiquement des proprieacuteteacutes destables qui sont manipuleacutees par des curseurs ResultSet Cette interface est inteacuteressante pourprogrammer dynamiquement des requecirctes ou drsquoautres instructions SQL Ces fonctions vontextraire de maniegravere transparente des informations par lrsquointermeacutediaire du dictionnaire des donneacutees

Une fois un curseur ResultSet programmeacute il suffit de lui appliquer la meacutethode getMeta-Data() pour disposer drsquoun objet ResultSetMetaData Le tableau suivant preacutesente lesprincipales meacutethodes disponibles de lrsquointerface ResultSetMetaData

ResultSet curseur = etatexecuteQuery( ) curseurmoveToInsertRow() curseurinsertRow() curseurlast() Systemoutprintln(Valeur de la sequence + ) cxrollback()

Insertion via le curseur

Extraction de la seacutequence

curseurclose() etatclose() cxclose() Invalidation de lrsquoajoutFermeture des objets

catch(SQLException ex) hellip Gestion des erreurs

Tableau 8-29 Reacutecupeacuteration drsquoune seacutequence agrave lrsquoaide drsquoun curseur modifiable (suite)

Code Java Commentaires

SELECTnumAffimmatcompdateAff FROM bdsoutouAffreter

curseurgetInt(1)

Tableau 8-30 Meacutethodes principales de lrsquointerface ResultSetMetaData

Meacutethode Description

int getColumnCount() Retourne le nombre de colonnes du curseur

String getColumnName(int) Retourne le nom de la colonne drsquoun indice donneacute du curseur

int getColumnType(int) Retourne le code du type (selon la classification dejavasqlTypes) de la colonne drsquoun indice donneacute du curseur

String getColumnTypeName(int) Retourne le nom du type SQL de la colonne drsquoun indice donneacutedu curseur

int isNullable(int) Indique si la colonne drsquoun indice donneacute du curseur peut ecirctrenulle (constantes retourneacutees ResultSetMetaDatacolumnNoNullsResultSetMetaDatacolumnNullable ouResultSetMetaDatacolumnNullableUnknown)

int getPrecision(int) Nombre de chiffres avant la virgule de la colonne deacutesigneacutee

int getScale(int) Nombre de deacutecimales de la colonne deacutesigneacutee

String getSchemaName(int) Nom du scheacutema proprieacutetaire de la colonne

String getTableName(int) Nom de la table de la colonne

4055_08_C08 Page 313 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

314 copy Eacuteditions Eyrolles

Comme nous lrsquoavons vu au chapitre 5 MySQL ne renseigne pas encore le nom de catalogueAinsi la meacutethode getSchemaName() nrsquoest pas encore reconnue

Le code suivant (ResulSetMetajava) utilise des meacutethodes de lrsquointerface ResultSet-MetaData sur la base de la requecircte extrayant trois colonnes dans la table Avion

Interface DatabaseMetaDataLrsquointerface DatabaseMetaData est utile pour connaicirctre des aspects plus geacuteneacuteraux de labase de donneacutees cible (version eacutediteur prise en charge des transactionshellip) ou des informa-tions sur la structure de la base (structures des tables et vues preacuterogatives)

Plus de quarante meacutethodes sont proposeacutees par lrsquointerface DatabaseMetaData Le tableausuivant en preacutesente quelques-unes Consultez la documentation du JDK pour en savoir plus

Tableau 8-31 Extraction de meacuteta-informations au niveau drsquoun curseur

Code Java Commentaires

try hellip ResultSet curseurJava=etatSimpleexecuteQuery (SELECT immat typeAvion cap FROM Avion)

Creacuteation du curseur

ResultSetMetaData rsmd =

Creacuteation drsquoun objetResultSetMetaData

int nbCol = rsmdgetColumnCount() nbCol contient 3 String nom2emeCol = rsmdgetColumnName(2) nom2emeCol contient typeAvion String type2emeCol = rsmdgetColumnTypeName(2) type2emeCol contient VARCHAR int codeType2emeCol = rsmdgetColumnType(2) codeType2emeCol contient 12

(code pour VARCHAR) if (rsmdisNullable(1) == ResultSetMetaDatacolumnNoNulls) hellip

Test renvoyant vrai (la premiegravere colonne est la cleacute primaire)

int p1 = rsmdgetPrecision(3) Taille de la colonne cap (renvoie 6 pour un SMALLINT)

int t1 = rsmdgetScale(3) Deacutecimales de la colonne cap (renvoie 0 pour un SMALLINT)

curseurJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

Web

curseurJavagetMetaData()

Tableau 8-32 Meacutethodes principales de lrsquointerface ResultSetMetaData

Meacutethode Description

ResultSet getColumns(StringString String String)

Description de toutes les colonnes drsquoune table drsquounscheacutema donneacute

String getDatabaseProductName() Nom de lrsquoeacutediteur de la base de donneacutees utiliseacutee

String getDatabaseProductVersion() Numeacutero de la version de la base utiliseacutee

4055_08_C08 Page 314 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 315

chapitre ndeg 8 Utilisation avec Java

Le code suivant (MetaDatajava) emploie ces meacutethodes pour extraire des informations agravepropos de la base cible et des objets (tables vues seacutequenceshellip) du scheacutema courant

La trace de ce programme est la suivante (dans notre jeu drsquoexemples)

Objets du schema soutoulocalhost

Nom de lobjet Avion Type TABLE

Nom de lobjet Compagnie Type TABLE

Nom base MySQL

Version base 5015-nt

Supporte les SelectForUpdate

Supporte les Transactions

ResultSet getTables(String String String String[])

Description des tables drsquoun scheacutema donneacute

String getUserName() Nom de lrsquoutilisateur connecteacute (scheacutema courant)

boolean supportsSavepoints() Renvoie true si la base reconnaicirct les points de validation

boolean supportsTransactions() Renvoie true si la base reconnaicirct les transactions

Tableau 8-32 Meacutethodes principales de lrsquointerface ResultSetMetaData (suite)

Meacutethode Description

Tableau 8-33 Extraction de meacuteta-informations au niveau drsquoun scheacutema

Code Java Commentaires

try hellip DatabaseMetaData infoBase = cxgetMetaData() Creacuteation drsquoun objet

DatabaseMetaData ResultSet toutesLesTables =

Systemoutprintln(Objets du schema + )

Creacuteation drsquoun objetResultSet contenant lescaracteacuteristiques du scheacutemacourant

while (toutesLesTablesnext()) Systemoutprint(Nom de lobjet + toutesLesTablesgetString(3)) Systemoutprintln( Type + toutesLesTablesgetString(4))

Parcours du curseur en affi-chant quelques caracteacuteristi-ques

Systemoutprintln(Nom base + ())

Affichage du nom de la base

Systemoutprintln(Version base + ())

Affichage de la version de labase

if ( ()) Systemoutprintln(Supporte les Transactions)

Transactions prises en chargeou pas

toutesLesTablesclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

Web

infoBasegetTables(infoBasegetUserName() null null)

infoBasegetUserName()

infoBasegetDatabaseProductName

infoBasegetDatabaseProductVersioninfoBasesupportsTransactions

4055_08_C08 Page 315 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

316 copy Eacuteditions Eyrolles

Instructions parameacutetreacutees (PreparedStatement)

Lrsquointerface PreparedStatement heacuterite de lrsquointerface Statement et la speacutecialise enpermettant de parameacutetrer des objets (eacutetats preacutepareacutes) repreacutesentant des instructions SQLpreacutecompileacutees Ces eacutetats sont creacuteeacutes par la meacutethode prepareStatement de lrsquointerfaceConnection deacutecrite ci-apregraves La chaicircne de caractegraveres contient lrsquoordre SQL dont les paramegrave-tres srsquoil en possegravede doivent ecirctre indiqueacutes par le symbole laquo raquo

PreparedStatement prepareStatement(String)

Une fois creacuteeacutes ces objets peuvent ecirctre aiseacutement reacuteutiliseacutes pour exeacutecuter agrave la demandelrsquoinstruction SQL en modifiant eacuteventuellement les valeurs des paramegravetres drsquoentreacutee agrave lrsquoaidedes meacutethodes setxxx (setter methods) Le tableau suivant deacutecrit les principales meacutethodes delrsquointerface preparedStatement

Deacutecrivons agrave preacutesent un exemple drsquoappel pour chaque meacutethode de compilation drsquoun ordre para-meacutetreacute On suppose la connexion cx creacuteeacutee

Extraction de donneacutees (executeQuery)

Le code suivant (PrepareSELECTjava) illustre lrsquoutilisation de la meacutethode execute-Query pour extraire les enregistrements de la table Avion

Tableau 8-34 Meacutethodes de lrsquointerface PreparedStatement

Meacutethode Description

ResultSet executeQuery() Exeacutecute la requecircte et retourne un curseur ni navigable nimodifiable par deacutefaut

int executeUpdate() Exeacutecute une instruction LMD (INSERT UPDATE ou DELETE) etretourne le nombre de lignes traiteacutees ou 0 pour les instructionsSQL ne retournant aucun reacutesultat (LDD)

boolean execute() Exeacutecute une instruction SQL et renvoie true si crsquoest une instruc-tion SELECT false sinon

void setNull(int int) Affecte la valeur NULL au paramegravetre de numeacutero et de type (classi-fication javasqlTypes) speacutecifieacutes

void close() Ferme lrsquoeacutetat

4055_08_C08 Page 316 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 317

chapitre ndeg 8 Utilisation avec Java

Mises agrave jour (executeUpdate)

Le code suivant (PrepareINSERTjava) illustre lrsquoutilisation de la meacutethode execute-Update pour inseacuterer lrsquoenregistrement (F-NEW A319 178 AF) dans la table Avion compo-seacutee de quatre colonnes de types CHAR(6) VARCHAR(15) SMALLINT et VARCHAR(4)

Instruction LDD (execute)

Le code suivant (PrepareDELETEjava) illustre lrsquoutilisation de la meacutethode execute poursupprimer un avion dont lrsquoimmatriculation passe en paramegravetre

Tableau 8-35 Extraction de donneacutees par un ordre preacutepareacute

Code Java Commentaires

try hellip String ordreSQL = SELECT immat typeAvion cap FROM Avion

Creacuteation drsquoun eacutetat preacutepareacute

ResultSet curseurJava =

while(curseurJavanext()) hellip

Creacuteation du curseur reacutesultant dela compilation de lrsquoeacutetatParcours du curseur

curseurJavaclose() Fermeture du curseur Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

Web

PreparedStatement eacutetatPreacutepareacute =cxprepareStatement(ordreSQL)

eacutetatPreacutepareacuteexecuteQuery()

eacutetatPreacutepareacuteclose()

Tableau 8-36 Insertion drsquoun enregistrement par un ordre preacutepareacute

Code Java Commentaires

try hellip String ordreSQL = INSERT INTO Avion VALUES ( )

Creacuteation drsquoun eacutetat preacutepareacute

Passage des paramegravetres

Systemoutprintln( + avion inseacutereacute)

Exeacutecution de lrsquoinstruction

Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

Web

PreparedStatement eacutetatPreacutepareacute =cxprepareStatement(ordreSQL)

eacutetatPreacutepareacutesetString(1 F-NEW)eacutetatPreacutepareacutesetString(2 A319)eacutetatPreacutepareacutesetInt(3 178)eacutetatPreacutepareacutesetString(4 AF)

eacutetatPreacutepareacuteexecuteUpdate()

eacutetatPreacutepareacuteclose()

4055_08_C08 Page 317 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

318 copy Eacuteditions Eyrolles

Il nrsquoest pas possible de parameacutetrer des instructions SQL du LDD (CREATE ALTERhellip) Pourreacutesoudre ce problegraveme il faut construire dynamiquement la chaicircne (String) qui contient lrsquoins-truction agrave lrsquoaide de lrsquoopeacuterateur de concateacutenation Java (+) Cette chaicircne sera ensuite lrsquouniqueparamegravetre de la meacutethode prepareStatement

Proceacutedures catalogueacutees

Lrsquointerface CallableStatement permet drsquoappeler des sous-programmes (fonctions ouproceacutedures catalogueacutees) en passant drsquoeacuteventuels paramegravetres en entreacutee et en en reacutecupeacuterant ensortie Lrsquointerface CallableStatement speacutecialise lrsquointerface PreparedStatement Lesparamegravetres drsquoentreacutee sont affecteacutes par les meacutethodes setxxx Les paramegravetres de sortie (deacutefinisOUT au niveau du sous-programme) sont extraits agrave lrsquoaide des meacutethodes getxxx Ces eacutetats quipermettent drsquoappeler des sous-programmes sont creacuteeacutes par la meacutethode prepareCall delrsquointerface Connection deacutecrite ci-apregraves

CallableStatement prepareCall(String)

Le tableau suivant deacutecompose le paramegravetre de cette meacutethode (deux eacutecritures sont possibles)Chaque paramegravetre est indiqueacute par un symbole laquo raquo

Tableau 8-37 Insertion drsquoun enregistrement par un ordre preacutepareacute

Code Java Commentairestry hellip cxsetAutoCommit(false) String ordreSQL = DELETE FROM Avion WHERE immat = Creacuteation drsquoun eacutetat preacutepareacute Passage du paramegravetreif ( ) Systemoutprintln(Enregistrement sup-primeacute) cxcommit()

Exeacutecution de lrsquoinstruction

Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

Web

PreparedStatement eacutetatPreacutepareacute =cxprepareStatement(ordreSQL)

eacutetatPreacutepareacutesetString(1 F-NEW )eacutetatPreacutepareacuteexecute()

eacutetatPreacutepareacuteclose()

Tableau 8-38 Paramegravetre de prepareCall

Type du sous-programme Paramegravetre

Fonction = call nomFonction( [ ] )

Proceacutedure call nomProceacutedure( [ ] )

4055_08_C08 Page 318 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 319

chapitre ndeg 8 Utilisation avec Java

Une fois lrsquoeacutetat creacuteeacute il faut reacutepertorier le type des paramegravetres de sortie (meacutethode register-OutParameter) passer les valeurs des paramegravetres drsquoentreacutee appeler le sous-programme etanalyser les reacutesultats Le tableau suivant deacutecrit les principales meacutethodes de lrsquointerfaceCallableStatement

Exemple

Le programme JDBC suivant (CallableProcedurejava) deacutecrit lrsquoappel de la proceacutedureleNomCompagnieEst (ayant deux paramegravetres) Le premier indique lrsquoavion de la compagnierechercheacute le second contient le reacutesultat (nom de la compagnie)

CREATE PROCEDURE bdsoutouleNomCompagnieEst

BEGIN

DECLARE flagNOTFOUND BOOLEAN DEFAULT 0

BEGIN

DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND =1

SELECT nomComp INTO p_nomcomp FROM Compagnie

WHERE comp = (SELECT compa FROM Avion WHERE immat = p_immat)

END

IF flagNOTFOUND THEN

SET p_nomcomp = NULL

END IF

END

Le tableau suivant deacutecrit les eacutetapes neacutecessaires agrave lrsquoappel de cette proceacutedure (qui ne gegravere pas leseacuteventuelles erreurs) pour lrsquoavion drsquoimmatriculation F-GLFS

Tableau 8-39 Meacutethodes de lrsquointerface CallableStatement

Meacutethode Description

ResultSet executeQuery() Idem PreparedStatement

int executeUpdate() Idem PreparedStatement

boolean execute() Idem PreparedStatement

void registerOutParameter(int int)

Transfegravere un paramegravetre de sortie agrave un indice donneacute drsquountype Java (classification javasqlTypes)

boolean wasNull() Deacutetermine si le dernier paramegravetre de sortie extrait est agraveNULL Cette meacutethode doit ecirctre seulement invoqueacuteeapregraves une meacutethode de type getxxx

(IN p_immat CHAR(6)OUT p_nomcomp VARCHAR(25))

4055_08_C08 Page 319 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

320 copy Eacuteditions Eyrolles

La trace de lrsquoappel de cette proceacutedure est la suivante

Compagnie de F-GLFS Transport Air Tour

Pensez sous root agrave donner les privilegraveges neacutecessaires agrave lrsquoutilisateur qui va lancer le sous-pro-gramme via Java (pour mon test jrsquoai ducirc lancer GRANT EXECUTE ON bdsoutou TO sou-toulocalhost et GRANT SELECT ON mysqlproc TO soutoulocalhost) Sivous ne le faites pas JDBC vous rappellera clairement agrave lrsquoordre

Transactions

JDBC supporte le mode transactionnel qui consiste agrave valider tout ou une partie drsquoun ensembledrsquoinstructions Nous avons deacutejagrave deacutecrit agrave la section Interface Connection les meacutethodes quipermettent agrave un programme Java de coder des transactions (setAutoCommit commit etrollback)

Par deacutefaut chaque instruction SQL est valideacutee (on parle drsquoautocommit) Lorsque ce mode estdeacutesactiveacute il faut geacuterer manuellement les transactions avec commit ou rollback

Quand le mode autocommit est deacutesactiveacute

bull La deacuteconnexion drsquoun objet Connection (par la meacutethode close) valide implicitement latransaction (mecircme si commit nrsquoa pas eacuteteacute invoqueacute avant la deacuteconnexion)

bull Chaque instruction du LDD (CREATE ALTER DROP) valide implicitement la transaction

Tableau 8-40 Appel drsquoune proceacutedure (paramegravetre en entreacutee et sortie)

Code Java Commentaires

String CallableStatement eacutetatAppelable =

Creacuteation drsquoun eacutetat appelable

Deacuteclaration du paramegravetre de sortie

Passage du paramegravetre drsquoentreacutee Exeacutecution de la proceacutedure Systemoutprint(Compagnie de F-GLFS + Extraction du reacutesultat

Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

WebordreSQL =

call bdsoutouleNomCompagnieEst()

cxprepareCall(ordreSQL)eacutetatAppelableregisterOutParameter

(2javasqlTypesVARCHAR)eacutetatAppelablesetString(1F-GLFS)eacutetatAppelableexecute()

eacutetatAppelablegetString(2))eacutetatAppelableclose()

4055_08_C08 Page 320 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 321

chapitre ndeg 8 Utilisation avec Java

Points de validation

Depuis la version 30 de JDBC (JDK 14) on peut inclure des points de validation et affinerainsi la programmation des transactions Les interfaces Connection et Savepoint rendentpossible cette programmation

Interface Connection

Le tableau suivant preacutesente les meacutethodes de lrsquointerface Connection qui sont relatives auprincipe des points de validation

Interface Savepoint

Les points de validation sont anonymes (identifieacutes toutefois par un entier) ou nommeacutes Letableau suivant preacutesente les deux seules meacutethodes de lrsquointerface Savepoint

Le code suivant (TransactionJDBCjava) illustre une transaction deacutecoupeacutee en deuxphases par deux points de validation Dans notre exemple nous validons seulement lapremiegravere partie (seul lrsquoavion F-NEW2 sera inseacutereacute dans la table) On suppose la connexion cxcreacuteeacutee

Tableau 8-41 Meacutethodes concernant les points de validation de lrsquointerface Connection

Meacutethode Description

Savepoint setSavepoint() Positionne un point de validation anonyme et retourne unobjet Savepoint

Savepoint setSavepoint(String) Positionne un point de validation nommeacute et retourne unobjet Savepoint

void releaseSavepoint(Savepoint) Supprime le point de validation de la transaction courante

void rollback(Savepoint) Invalide la transaction agrave partir du point de validation

Tableau 8-42 Meacutethodes de lrsquointerface Savepoint

Meacutethode Description

int getSavepointId() Retourne lrsquoidentifiant du point de validation de lrsquoobjet Savepoint

String getSavepointName() Retourne le nom du point de validation de lrsquoobjet Savepoint

4055_08_C08 Page 321 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

322 copy Eacuteditions Eyrolles

Traitement des exceptions

Les exceptions qui ne sont pas traiteacutees dans les sous-programmes appeleacutes ou celles que lessous-programmes ou deacuteclencheurs peuvent retourner doivent ecirctre prises en compte au niveaudu code Java (dans un bloc tryhellip catch) Le bloc drsquoexceptions permet de programmer destraitements en fonction des codes drsquoerreur renvoyeacutes par la base Oracle Plusieurs blocsdrsquoexceptions peuvent ecirctre imbriqueacutes dans un programme JDBC

Afin de geacuterer les erreurs renvoyeacutees par le SGBD JDBC propose la classe SQLExceptionqui heacuterite de la classe Exception Chaque objet (automatiquement creacuteeacute degraves la premiegravereerreur) de cette classe dispose des meacutethodes suivantes

Tableau 8-43 Points de validation

Code Java Commentaires

try hellip cxsetAutoCommit(false) String ordreSQL = INSERT INTO Avion VALUES ( ) PreparedStatement eacutetatPreacutepareacute = cxprepareStatement(ordreSQL)

Deacutesactivation de lrsquoautocommit

Creacuteation drsquoun eacutetat appelableCreacuteation du point de validation P1

eacutetatPreacutepareacutesetString(1 F-NEW2) hellip if ( eacutetatPreacutepareacuteexecute() ) Systemoutprintln(F-NEW2 inseacutereacute)

Passage de paramegravetres et premiegravere insertion

Creacuteation du point de validation P2 eacutetatPreacutepareacutesetString(1 F-NEW3) hellip if ( eacutetatPreacutepareacuteexecute() ) Systemoutprintln(F-NEW3 inseacutereacute)

Passage de paramegravetres et deuxiegraveme insertion

Annulation de la deuxiegraveme partie cxcommit() Validation de la premiegravere partie cxclose() Fermeture de la connexion catch(SQLException ex) hellip Gestion des erreurs

Web

Savepoint p1 = cxsetSavepoint(P1)

Savepoint p2 = cxsetSavepoint(P2)

cxrollback(p2)

Tableau 8-44 Meacutethodes de la classe SQLException

Meacutethode Description

String getMessage() Message deacutecrivant lrsquoerreur

String getSQLState() Code erreur SQL Standard (XOPEN ou SQL99)

int getErrorCode() Code erreur SQL de la base

SQLException getNextException() Chaicircnage agrave lrsquoexception suivante (si une erreur renvoie plu-sieurs messages)

4055_08_C08 Page 322 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 323

chapitre ndeg 8 Utilisation avec Java

Affichage des erreurs

Le code suivant (Exceptions1java) illustre une maniegravere drsquoafficher explicitement toutesles erreurs sans effectuer drsquoautres instructions

Traitement des erreurs

Il est possible drsquoassocier des traitements agrave chaque erreur reacutepertorieacutee avant lrsquoexeacutecution duprogramme On peut appeler des meacutethodes de la classe principale ou coder directement dansle bloc des exceptions

Le code suivant (Exceptions2java) insegravere un enregistrement dans la table Avion en geacuterantun certain nombre drsquoexceptions possibles Le premier bloc des exceptions permet drsquoafficher unmessage personnaliseacute pour chaque type drsquoerreur preacutealablement reacutepertorieacute (duplication de cleacuteprimaire mauvais nombre ou type de colonneshellip) Si lrsquoavion agrave inseacuterer nrsquoest pas rattacheacute agrave unecompagnie existante (contrainte reacutefeacuterentielle) exception 1452-Cannot add or update achild row a foreign key constraint fails) Le dernier bloc drsquoexceptions afficheune erreur qui nrsquoa pas eacuteteacute preacutevue par le programmeur (erreur systegraveme ou de syntaxe danslrsquoinstruction par exemple)

Tableau 8-45 Affichage des erreurs

Code Java Commentaires

import javasqlpublic class Exceptions1 public static void main (String args []) throws SQLException Exception try ClassforName (commysqljdbcDriver)newInstance() catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement+extoString()) try Connection cx = DriverManagergetConnection( cxclose()

Classe principale

Chargement du pilote

Connexion

Instructionshellip

Systemerrprintln(Erreur) while ((ex = null)) Systemerrprintln(Statut + ) Systemerrprintln(Message + ) Systemerrprintln(Code base + ) ex =

Gestion des erreurs

Web

catch(SQLException ex)

exgetSQLState()exgetMessage()exgetErrorCode()

exgetNextException()

4055_08_C08 Page 323 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

324 copy Eacuteditions Eyrolles

Tableau 8-46 Traitement des exceptions

Code Java Commentaires

try Connection cx = DriverManagergetConnection(hellip) String ordreSQL = INSERT INTO bdsoutouAvion VALUES (F-NOUVA310 5600 AF) PreparedStatement eacutetatPreacutepareacute = cxprepareStatement(ordreSQL) Systemoutprintln(eacutetatPreacutepareacuteexecuteUpdate() + avion insere en base) cxclose()

Instructions du main

catch(SQLException ex) if ( ) Systemoutprintln(Avion deacutejagrave existant)

Non unique

else if ( ) Systemoutprintln(Nom de base inconnu)

Mauvais nom de base

else if ( ) Systemoutprintln(Trop ou pas assez de valeurs)

Mauvais nombre de colon-nes

else if ( ) Systemoutprintln(Nom de table inconnue)

Mauvais nom de table

else if (( ) ampamp ( )) Systemoutprintln(Valeur trop longue ou valeur trop importante)

Mauvais type de colonnes

else if ( ) Systemoutprintln(Compagnie inconnue a inserer avec lavion)

Cleacute eacutetrangegravere absente

else Systemerrprintln(Erreur) while ((ex = null)) Systemerrprintln(Statut + exgetSQLState()) Systemerrprintln(Message + exgetMessage()) Systemerrprintln(Code Erreur base + exgetErrorCode()) ex = exgetNextException()

Gestion des autres erreurs

Web

exgetErrorCode() == 1062

exgetErrorCode() == 1044

exgetErrorCode() == 1136

exgetErrorCode() == 1146

exgetSQLState() == 01004exgetErrorCode() == 0

exgetErrorCode() == 1452

4055_08_C08 Page 324 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 325

chapitre ndeg 8 Utilisation avec Java

Exercices

Lrsquoobjectif de ces exercices est de deacutevelopper des meacutethodes de la classe Java ExoJDBC pourextraire et mettre agrave jour des donneacutees des tables du scheacutema Parc informatique

81 Curseur statique

Eacutecrire les meacutethodes

bull ArrayList getSalles() qui retourne sous la forme drsquoune liste les enregistrements de latable Salle

bull main qui se connecte agrave la base appelle la meacutethode getSalles et affiche les reacutesultats (exempledonneacute ci-dessous)

nSalle nomSalle nbPoste indIP

------------------------------------------

s01 Salle 1 3 13012080

s02 Salle 2 2 13012080

hellip

Ajoutez une nouvelle salle dans la table Salle dans lrsquointerface de commande et lancez agrave nouveau leprogramme pour veacuterifier

82 Curseur modifiable

Eacutecrivez la meacutethode void deleteSalle(int) qui supprime de la table Salle lrsquoenregistrement derang passeacute en paramegravetre Vous utiliserez la meacutethode deleteRow appliqueacutee agrave un curseur modifiableAppelez dans le main cette meacutethode pour supprimer lrsquoenregistrement de la table Salle que vousavez ajouteacute en test dans lrsquoexercice preacuteceacutedent Si lrsquoenregistrement est rattacheacute agrave un enregistrement filsne forcez pas la contrainte reacutefeacuterentielle contentez-vous drsquoafficher le message drsquoerreur 1451 renvoyeacutepar MySQL dans le bloc des exceptions

4055_08_C08 Page 325 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

326 copy Eacuteditions Eyrolles

83 Appel drsquoun sous-programme

Compiler dans votre base la proceacutedure catalogueacutee supprimeSalle(IN ns VARCHAR(7)OUTres TINYINT) qui supprime une salle dont le numeacutero est passeacute en premier paramegravetre

CREATE PROCEDURE supprimeSalle(IN ns VARCHAR(7)OUT res TINYINT)

BEGIN

DECLARE ligne VARCHAR(20)

DECLARE EXIT HANDLER FOR NOT FOUND SET res = -1

DECLARE EXIT HANDLER FOR SQLEXCEPTION SET res = -2

SELECT nomSalle INTO ligne FROM Salle WHERE nSalle = ns

DELETE FROM Salle WHERE nsalle = ns

SET res = 0

COMMIT

END

La proceacutedure retourne en second paramegravetre

bull 0 si la suppression srsquoest deacuterouleacutee correctement

bull -1 si le code de la salle est inconnu

bull -2 si la suppression est impossible (contraintes reacutefeacuterentielles)

Eacutecrire la meacutethode Java int deleteSalleSP(String) qui appelle le sous-programme suppri-meSalle Essayer les diffeacuterents cas drsquoerreurs en appelant cette meacutethode drsquoabord avec un numeacutero desalle reacutefeacuterenceacute par un poste de travail et ensuite avec un numeacutero de salle inexistant Penser agrave donneragrave lrsquoutilisateur le privilegravege en exeacutecution sur cette proceacutedure

4055_08_C08 Page 326 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

327

Chapitre 9

Utilisation avec PHP

Ce chapitre deacutetaille les moyens de faire interagir un programme PHP 5 avec une base MySQLPHP propose deux extensions (API) qui sont

mysql

et

msqli

La premiegravere convient agrave desbases MySQL de version anteacuterieure agrave 41 Nous deacutetaillerons donc lrsquoextension

mysqli

quicorrespond toutefois agrave des bases plus anciennes (jusqursquoagrave la version 322) Pour plus de deacutetailsconsultez une documentation en ligne mise agrave jour (httpwwwnexennetdocsphpanno-teerefmysqliphp)

Configuration adopteacutee

Plusieurs configurations sont possibles en fonction de la version de PHP utiliseacutee de la versiondrsquoApache et de celle de MySQL Nous avons opteacute pour faire interagir un programme PHP 5avec une base MySQL 5 sous Apache 13 Je deacutecris ici une proceacutedure minimale sans plusdrsquoexplication Vous trouverez sur le Web de nombreuses ressources agrave ce sujet

Logiciels

Reacutecupeacuterez et installez Apache (wwwapacheorg) Lancez Apacheexe srsquoil nrsquoest pas automati-quement lanceacute apregraves lrsquoinstallation Testez le service dans le navigateur en fonction du nom deserveur que vous avez speacutecifieacute agrave lrsquoinstallation (httpcamparols dans mon cas)

Installez PHP (httpwwwphpnetdownloadsphp) en deacutezippant le fichier teacuteleacutechargeacute dans unreacutepertoire personnel (CPHP dans mon cas)

Fichiers de configuration

Dans le fichier

httpdconf

(situeacute dans

CProgram FilesApache GroupApacheconfhttpdconf

dans mon cas) modifiez ou ajoutez les lignes suivantes (le laquo raquo deacutesigneun commentaire)

modif pour MySQL et PHP ici 9999 par exemple

Port 9999

hellip

4055_09_C09 Page 327 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

328

copy Eacuteditions Eyrolles

Ajout pour PHP

LoadModule php5_module cphpphp5apachedll

hellip

Ajout pour PHP

AddModule mod_php5c

SEtEnv PHPRC Cphp

AddType applicationx-httpd-php php

hellip

DirectoryIndex indexhtml indexphp

hellip

Ajout pour MySQL reacutepertoire contenant les sources php (pas

daccent dans les noms de reacutepertoire)

DocumentRoot DdevPHP-MySQL

Dans le fichier

phpini

(se trouvant dans

CWINDOWS

dans mon cas) ajoutez les lignessuivantes (le laquo raquo deacutesigne un commentaire)

Paths and Directories

extension_dir = CPHPext

Dynamic Extensions

extension=php_mysqlidll

Copiez le fichier

libmysqldll

qui se situe dans le reacutepertoire de PHP (

CPHP

dans moncas) dans le reacutepertoire de Windows (

CWINDOWS

dans mon cas)

Test drsquoApache et de PHP

Eacutecrivez le programme suivant (

indexphp

) et disposez-le dans le reacutepertoire contenant lessources PHP (

DdevPHP-MySQL

dans mon cas)

lthtmlgt ltheadgt lttitlegttest Apache 13 PHP5 lttitlegt ltheadgt

ltbodygt

Test de la configuration Apache 13 - PHP5 - Livre MySQL - C Sou-

tou

ltphp

phpinfo()

gt

ltbodygt lthtmlgt

Pour tester votre serveur arrecircter puis relancer Apache Dans le navigateur saisir lrsquoURL devotre serveur sur le port concerneacute (

httpcamparols9999

dans mon cas) qui doitlancer le programme

indexphp

Vous devez voir lrsquoaffichage preacuteceacutedent suivi de la configu-ration actuelle de PHP (reacutesultat de la fonction systegraveme PHP

phpinfo

)

4055_09_C09 Page 328 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

329

chapitre ndeg 9 Utilisation avec PHP

Test drsquoApache de PHP et de MySQL

Il faut que le serveur MySQL soit deacutemarreacute (veacuterifiez dans

Services

agrave partir du panneau deconfiguration) Eacutecrivez le programme

cx1php

suivant et disposez-le dans le reacutepertoirecontenant les sources PHP Renseignez le nom drsquoutilisateur MySQL le mot de passe et le nomde la base Ici je lance une connexion agrave la base du dictionnaire des donneacutees puis je seacutelectionnepar la suite la base

bdsoutou

ltphpif (($service= )gt0) print Connexion reacuteussie avec ltBgtsoutoultBgt sur information_schema de localhost if (($usebdsoutou = ) gt 0) print ltBRgt La base est deacutesormais ltBgtbdsoutoultBgt else print ltBRgt Seacutelection impossible sur ltBgtbdsoutoultBgt print ltBRgt Fermeture de la connexion else print ltBRgt La connexion est un eacutechec

gt

Tester ce programme dans le navigateur (

httpcamparols9999cx1php

dans moncas) Vous devez obtenir un reacutesultat analogue

API de PHP pour MySQL

Depuis PHP 5 le preacutefixe des fonctions de la derniegravere extension est deacutesormais laquo

msqli_

raquoAvec cette nouvelle API de nouvelles fonctions apparaissent elles concernent principalementles eacutetats preacutepareacutes (

prepared statements

) la possibiliteacute drsquoappeler des proceacutedures catalogueacutees etelles prennent en charge la programmation objet (classes) de PHP Nous nrsquoeacutetudierons pas icice mode de deacuteveloppement en restant dans une programmation proceacutedurale (des compleacutementsseront mis en ligne)

Figure 9-1

Test drsquoune connexion

mysqli_connect(localhostsoutouiutinformation_schema)

mysqli_select_db($servicebdsoutou)

mysqli_close($service)

4055_09_C09 Page 329 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

330

copy Eacuteditions Eyrolles

Connexion

La fonction

mysqli_connect

retourne un identifiant de connexion utiliseacute par la majoriteacutedes appels agrave la base Les fonctions

mysqli_close

mysqli_select_db

et

mysqli_change_user

renvoient

TRUE

en cas de succegraves

FALSE

en cas drsquoerreur Une connexion seferme implicitement en fin de programme mecircme si elle nrsquoa pas eacuteteacute clocirctureacutee explicitement

Interactions avec la base

La majoriteacute des traitements SQL lorsqursquoils incluent des paramegravetres srsquoeffectuent comme suit connexion (

connect

) preacuteparation de lrsquoordre (

parse

) association des paramegravetres agrave lrsquoordre SQL(

bind

) exeacutecution dudit ordre (

execute

) lecture des lignes (pour les

SELECT

fetch

) et libeacutera-tion des ressources (

free

et

close

) apregraves une eacuteventuelle validation de la transaction courante(

commit

ou

rollback

)

Preacuteparation exeacutecution

La fonction

msqli_prepare

preacutepare lrsquoordre SQL puis retourne un identifiant drsquoeacutetat qui peutecirctre utiliseacute notamment par les fonctions

mysqli_stmt_bind_param

et

mysqli_stmt_execute

La fonction

msqli_prepare

retourne

FALSE

dans le cas drsquoune erreur mais nevalide ni seacutemantiquement ni syntaxiquement lrsquoordre SQL Il faudra attendre pour cela sonexeacutecution par

mysqli_stmt_execute

La fonction

mysqli_stmt_execute

exeacutecute un ordre SQL preacutepareacute (renvoie

TRUE

en casde succegraves

FALSE

sinon) Le mode par deacutefaut est

auto

-

commit

Pour la programmation detransactions deacutesactiver ce mode (avec

mysqli_autocommit

) puis valider explicitementpar

mysqli_commit

La fonction

mysqli_stmt_fetch exeacutecute pas agrave pas une requecircte preacutepareacutee (retourne TRUEen cas de succegraves FALSE sinon)

Tableau 9-1 Fonctions de connexion et de deacuteconnexion

Nom de la fonction Paramegravetres

ressource mysqli_connect(stringserveur string utilisateur string motpasse [string nomBase])

Nom du serveur utilisateur mot de passe nom de la base eacuteventuellement Retourne FALSE en cas drsquoerreur

boolean mysqli_close(ressourceconnexion)

Ferme la connexion dont lrsquoidentifiant passe en paramegravetre

boolean mysqli_select_db(ressource connexion string nomBase)

Modifie la seacutelection de la base de la connexion dont lrsquoidentifiant passe en paramegravetre

boolean mysqli_change_user(ressource connexion string utilisateur string motpasse string nomBase)

Modifie lrsquoutilisateur et la base de la connexion dont lrsquoidentifiant passe en paramegravetre

4055_09_C09 Page 330 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 331

chapitre ndeg 9 Utilisation avec PHP

Validation

Les fonctions mysqli_commit et mysqli_rollback permettent de geacuterer des transactionselles retournent TRUE en cas de succegraves FALSE sinon

Le programme suivant (insert1php) insegravere une nouvelle compagnie (en supposantqursquoaucune erreur nrsquoest retourneacutee de la part de la base) Nous eacutetudierons plus loin commentpasser des paramegravetres agrave une instruction (prepared statement) et comment reacutecupeacuterer au niveaude PHP les erreurs renvoyeacutees par MySQL

Tableau 9-2 Fonctions drsquoanalyse et drsquoexeacutecution

Nom de la fonction Paramegravetres

ressource msqli_prepare(ressourceconnexion string ordreSQL)

Le premier paramegravetre deacutesigne lrsquoidentifiant de la connexion Le second contient lrsquoordre SQL agrave ana-lyser (SELECT INSERT UPDATE DELETE CREATEhellip)

boolean mysqli_stmt_execute(ressource ordreSQL)

Le paramegravetre deacutesigne lrsquoidentifiant drsquoeacutetat agrave exeacutecu-ter (renvoyeacute par prepare)

boolean mysqli_stmt_fetch(ressource ordreSQL)

Affecte aux variables de liaison PHP le reacutesultat drsquoune requecircte preacutepareacutee

Tableau 9-3 Fonctions de validation et drsquoannulation

Nom de la fonction Paramegravetres

boolean mysqli_commit(ressourceconnexion)

Valide la transaction de la connexion en paramegravetre

boolean mysqli_rollback(ressource connexion)

Annule la transaction de la connexion en paramegravetre

Tableau 9-4 Insertion drsquoun enregistrement

Code PHP Commentaires

ltphp if ( ($service = mysqli_connect (localhostsoutouiutbdsoutou)) gt 0)

Connexion

mysqli_autocommit($serviceFALSE) $insert1 = INSERT INTO bdsoutouCompagnie VALUES(ALAir Lib)

Deacutebut de la transactionCreacuteation de lrsquoinstruction

$ordre = Preacutepare lrsquoinsertion if ( ($res = ) gt 0) Exeacutecute lrsquoinsertion print ltBRgt Ajout opeacutereacute Validation

Libegravere les ressources Ferme la connexion else print ltBRgt La connexion est un eacutechecgt

Web

mysqli_prepare($service $insert1)mysqli_stmt_execute($ordre)

mysqli_commit($service)mysqli_stmt_free_result($ordre)

mysqli_close($service)

4055_09_C09 Page 331 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

332 copy Eacuteditions Eyrolles

Si vous souhaitez connaicirctre le nombre de lignes affecteacutees par lrsquoordre SQL utilisez laquo mysqli_stmt_affected_rows($ordre) raquo (voir la section Meacutetadonneacutees)

Constantes preacutedeacutefinies

Les constantes suivantes permettent de positionner des indicateurs jouant le rocircle de paramegrave-tres systegraveme (modes drsquoexeacutecution) au sein drsquoinstructions SQL Nous verrons au long de nosexemples lrsquoutilisation de certaines de ces constantes

Extractions

Les fonctions suivantes permettent drsquoextraire des donneacutees via un curseur que la documenta-tion de PHP appelle tableau On rappelle que MySQL retourne les noms de colonnes toujoursen minuscules Cette remarque inteacuteressera les habitueacutes des tableaux agrave accegraves associatifs(exemple $tab[prenom] prenom eacutetant une colonne extraite drsquoune table)

Tableau 9-5 Constantes preacutedeacutefinies

Constante Commentaires

MYSQLI_ASSOC Utiliseacute par mysqli_fetch_array afin drsquoextraire un associative array comme reacutesultat

MYSQLI_NUM Utiliseacute par mysqli_fetch_array afin drsquoextraire un enumerated array comme reacutesultat

MYSQLI_BOTH Utiliseacute par mysqli_fetch_array afin drsquoextraire un array reconnais-sant agrave la fois le mode associatif et le mode numeacuterique en indices

Tableau 9-6 Fonctions drsquoextraction

Nom de la fonction Paramegravetres

ressource mysqli_query(ressource ordreSQL [ressource connexion])

Exeacutecute la requecircte sur la base de donneacutees en coursRetourne un identifiant de reacutesultat ou FALSE en casdrsquoerreur

array mysqli_fetch_array(ressource idresultat [ int param] )

Retourne un tableau qui contient la ligne du curseursuivante ou FALSE en cas drsquoerreur ou en fin de cur-seur Le tableau est accessible de maniegravere associa-tive ou numeacuterique suivant le paramegravetre param quipeut ecirctre une combinaison de bull MYSQLI_BOTH (par deacutefaut identique agraveMYSQLI_ASSOC + MYSQLI_NUM)

bull MYSQLI_ASSOC pour un tableau agrave accegraves associatif(comme mysqli_fetch_assoc)

bull MYSQLI_NUM pour un tableau agrave accegraves numeacuterique(comme mysqli_fetch_row)

4055_09_C09 Page 332 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 333

chapitre ndeg 9 Utilisation avec PHP

Illustrons agrave partir drsquoexemples certaines utilisations de quelques-unes de ces fonctions

Le programme suivant (select1php) utilise mysqli_fetch_array afin drsquoextraire lesavions de la compagnie de code AF On suppose ici et dans les programmes suivants que laconnexion agrave la base est reacutealiseacutee et se nomme $service Le curseur obtenu est nommeacuteligne il prend en compte les valeurs nulles eacuteventuelles

La fonction mysqli_num_fields renvoie le nombre de colonnes de la requecircte et sasignature est deacutetailleacutee agrave la section Meacutetadonneacutees

array mysqli_fetch_assoc(ressource ordreSQL)

Retourne la ligne du curseur suivante dans untableau associatif ou FALSE en cas drsquoerreur ou enfin de curseur

object mysqli_fetch_object(ressource ordreSQL)

Retourne la ligne du curseur suivante dans un objetPHP ou FALSE en cas drsquoerreur ou en fin de curseur

array mysqli_fetch_row(ressource ordreSQL)

Retourne la ligne du curseur suivante dans untableau numeacuterique ou FALSE en cas drsquoerreur ou enfin de curseur

booleanmysqli_stmt_free_result(ressource ordreSQL)

Libegravere les ressources associeacutees aux curseurs occu-peacutes apregraves mysqli_prepare Retourne TRUE encas de succegraves FALSE dans le cas inverse

Tableau 9-6 Fonctions drsquoextraction

Nom de la fonction Paramegravetres

Tableau 9-7 Extraction agrave lrsquoaide de mysqli_fetch_array

Code PHP Commentaires

$requete = SELECT immatcapacitetypeAvion FROM Avion WHERE compa = AF if ( ($resultat= ) gt 0)

Creacuteation de la requecircte

$ncols = print ltH3gtAvions de la compagnie AFltH3gt print ltTABLE BORDER=1gt

Chargement du curseurObtention du nombre de colonnes

while ($ligne = ) print ltTRgt for ( $i=0$i lt $ncols $i++) print ltTDgt $ligne[$i] ltTDgt print ltTRgt print ltTABLEgt

Parcours des colonnes

Affichage des colonnes

Libeacuteration des ressources

else print ltBRgtLa requecircte est un eacutechec mysqli_close($service)

Fermeture de la connexion

Web

mysqli_query($service $requete)mysqli_num_fields($resultat)

mysqli_fetch_array($resultat)

mysqli_free_result($resultat)

4055_09_C09 Page 333 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

334 copy Eacuteditions Eyrolles

La fonction mysqli_num_rows($resultat) aurait retourneacute 4 (nombre de lignesextraites)

La fonction mysqli_free_result joue le mecircme rocircle que mysqli_stmt_free_result mais srsquoapplique aux instructions SELECT

Vous devez obtenir un reacutesultat analogue (en supposant que la compagnie AF dispose dequatre avions dont un est affecteacute drsquoune capaciteacute nulle)

Le programme suivant (select2php) deacutecrit lrsquoutilisation de la fonction mysqli_fetch_assoc pour extraire tous les Airbus Le tableau associatif obtenu est nommeacute row Lrsquoaccegraves agravechaque cellule de ce tableau est reacutealiseacute agrave lrsquoaide du nom des colonnes

Figure 9-2 Exemple avec mysqli_fetch_array

Tableau 9-8 Extraction agrave lrsquoaide de mysqli_fetch_assoc

Code PHP Commentaires

$requete = SELECT immattypeAvioncapacite FROM Avion WHERE typeAvion LIKE A

Creacuteation de la requecircte

if ( ($resultat= )gt0) print ltH3gtListe des AirbusltH3gt print lttable border=1gtn print lttrgtlttdgtImatriculationlttdgt lttdgtTypelttdgtlttdgtcapacitelttdgt $i=0 while ( ) print lttrgtlttdgt$row[immat] lttdgtlttdgt$row[typeAvion] lttdgtlttdgt$row[capacite]lttdgtlttrgt

Exeacutecution de la requecircte

Parcours du curseurAffichage des colonnes

print lttablegtn mysqli_free_result($resultat)

Libeacuteration des ressources

else print ltBRgtLa requecircte est un eacutechec mysqli_close($service)

Fermeture de la connexion

Web

mysqli_query($service $requete)

$row = mysqli_fetch_assoc($resultat)

4055_09_C09 Page 334 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 335

chapitre ndeg 9 Utilisation avec PHP

Le reacutesultat est le suivant (en supposant que la base ne stocke que trois avions de type Airbus)

Instructions parameacutetreacutees

Les fonctions mysqli_stmt_bind_param et mysqli_stmt_bind_result permettentdrsquoassocier agrave des colonnes MySQL des variables PHP et inversement Ces fonctions retournentTRUE en cas de succegraves FALSE sinon

Extractions

Le programme suivant (select3php) utilise la fonction mysqli_stmt_bind_resultafin drsquoextraire lrsquoimmatriculation et le type de tous les avions (au travers de variables PHP quisont deacutefinies apregraves exeacutecution de la requecircte) Notez lrsquoutilisation des fonctions mysqli_stmt_

Figure 9-3 Exemple avec mysqli_fetch_assoc

Tableau 9-9 Fonctions de passage de paramegravetres

Nom de la fonction Paramegravetres

booleanmysqli_stmt_bind_result(ressource ordreSQL mixed ampvariable1 [mixed ampvariable2hellip])

Le premier paramegravetre est lrsquoidentifiant drsquoeacutetatobtenu apregraves prepare Les paramegravetres suivantslistent les variables PHP de reacuteception

booleanmysqli_stmt_bind_param(ressource ordreSQL string types mixedampvariable1 [mixed ampvariable2hellip])

Le premier paramegravetre est lrsquoidentifiant de reacutesultatobtenu apregraves prepare Le deuxiegraveme paramegravetredeacutecrit les types des variables agrave substituer auxcolonnes Les paramegravetres suivants listent lesvariables PHP en entreacutee

string types Description des types des variables (i pournumeacuterique d pour flottant s pour chaicircne decaractegravere et b pour BLOB) Concateacutener autantde ces caractegraveres qursquoil existe de variables

4055_09_C09 Page 335 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

336 copy Eacuteditions Eyrolles

fetch pour parcourir le reacutesultat de la requecircte ligne apregraves ligne et mysqli_stmt_closepour fermer la requecircte preacutepareacutee

Manipulations

Le programme suivant (insert2php) utilise la fonction mysqli_stmt_bind_param enfaisant passer deux paramegravetres (variables PHP) lors de lrsquoinsertion drsquoune nouvelle compagnieOn retrouve la notion de placeholders (symbole laquo raquo deacutesignant une valeur drsquoune colonnedrsquoune table ou drsquoune vue) eacutetudieacutee au chapitre 7 Notez le second paramegravetre de la fonctionmysqli_stmt_bind_param (laquo ss raquo deacutesigne deux types chaicircnes de caractegraveres)

Tableau 9-10 Extraction preacutepareacutee avec la fonction mysqli_stmt_bind_result

Code PHP Commentaires

$requete = SELECT immattypeAvion FROM bdsoutouAvion$ordre = if ( ($res = ) gt 0)

Deacutefinition et exeacutecution de la requecircte preacutepareacutee

if ( ($resbind = ) gt 0) print ltH4gtListe des avionsltH4gt print ltTABLE BORDER=1gt while ( ) print ltTRgt ltTDgt $imltTDgt print ltTDgt $tyltTDgt ltTRgt print ltTABLEgt else print ltBRgtLa liaison est un eacutechec

Affectation des variables PHP

Parcours de la requecircte

else print ltBRgtLa requete est un eacutechecmysqli_stmt_close($ordre)mysqli_close($service)

Fermeture de la requecircte et de la connexion

Webmysqli_prepare($service$requete)

mysqli_stmt_execute($ordre)

mysqli_stmt_bind_result($ordre$im$ty)

mysqli_stmt_fetch($ordre)

Tableau 9-11 Insertion parameacutetreacutee avec la fonction mysqli_stmt_bind_param

Code PHP Commentaires

mysqli_autocommit($serviceFALSE)$codeComp = CAST$nomComp = Castanet Air$insert2 = $ordre =

Affectation des variables PHPDeacutefinition de lrsquoordre parameacute-treacute

if (( if (($res = ) gt 0) print ltBRgtCompagnie $nomComp inseacutereacutee mysqli_commit($service) mysqli_stmt_free_result($ordre)

Association avec les variables PHPExeacutecution de lrsquoordre

Validation else print ltBRgtLinsertion est un eacutechec

Libeacuteration des ressources

else print ltBRgtProblegraveme au bindmysqli_close($service)

Fermeture de la connexion

Web

INSERT INTO Compagnie VALUES()mysqli_prepare($service $insert2)

mysqli_stmt_bind_param($ordre ss $codeComp$nomComp)) gt 0)

mysqli_stmt_execute($ordre)

4055_09_C09 Page 336 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 337

chapitre ndeg 9 Utilisation avec PHP

Pour toute extraction par SELECT modification par UPDATE ou suppression par DELETE leprincipe agrave adopter est le mecircme

Gestion des seacutequences

La fonction mysqli_insert_id($connexion) retourne la valeur courante de laseacutequence apregraves avoir inseacutereacute un enregistrement dans une table contenant une colonne AUTO_INCREMENT

Le programme suivant (insert3php) insegravere un affregravetement (table deacutecrite aux chapitres 2 et8) agrave la date du jour pour la compagnie de code CAST et lrsquoavion immatriculeacute F-GRTC Onreacutecupegravere la derniegravere valeur de la seacutequence apregraves lrsquoinsertion

Traitement des erreurs

Les fonctions mysqli_errno et mysqli_error permettent de geacuterer les erreurs retourneacuteespar MySQL au niveau de la connexion Les fonctions mysqli_stmt_errno et mysqli_stmt_error sont analogues au niveau drsquoune instruction preacutepareacutee

Le programme suivant (erreur1php) utilise plusieurs de ces fonctions Dans cet exemplela suppression ne se deacuteroule pas correctement du fait de lrsquoexistence drsquoenregistrements laquo fils raquodans la table Avion Il est donc possible de deacuterouter le programme en fonction du codedrsquoerreur MySQL renvoyeacute (comme pour les exceptions des proceacutedures catalogueacutees)

Tableau 9-12 Insertion parameacutetreacutee avec la fonction mysqli_insert_id

Code PHP Commentaires

mysqli_autocommit($serviceFALSE)$codeComp = CAST$immatric = F-GRTC$n = 162$insert3 = INSERT INTO bdsoutouAffreter (compimmatdateAffnbPax) VALUES(SYS-DATE())$ordre = mysqli_prepare($service $insert3)

Affectation des variables PHP

if (( ) gt 0) if (($res = mysqli_stmt_execute($ordre)) gt 0) print ltBRgtAffretement inseacutereacutee sequence mysqli_commit($service) mysqli_stmt_free_result($ordre) else print ltBRgtLinsertion est un eacutechec

Deacutefinition de lrsquoordre parameacutetreacuteAssociation avec les variables PHPExeacutecution de lrsquoordreReacutecupeacuteration de la seacutequenceValidation

Libeacuteration des ressources

else print ltBRgtProblegraveme au bind mysqli_close($service)

Fermeture de la connexion

Web

mysqli_stmt_bind_param($ordre ssi $codeComp)$immatric $n)

mysqli_insert_id($service)

4055_09_C09 Page 337 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

338 copy Eacuteditions Eyrolles

Le reacutesultat est le suivant

Tableau 9-13 Fonctions pour la gestion des erreurs MySQL

Nom de la fonction Paramegravetres

int mysqli_errno(ressourceconnexion)

Retourne le code drsquoerreur du dernier appel agrave la base sur laconnexion deacutesigneacutee dans le paramegravetre (0 si aucune erreurnrsquoest survenue lors du dernier eacutechange)

string mysqli_error(ressourceconnexion)

Retourne le libelleacute de lrsquoerreur lors du dernier eacutechange (chaicircnevide si aucune erreur)

int mysqli_stmt_errno (ressource ordreSQL)

Idem mysqli_errno agrave partir de lrsquoidentifiant drsquoeacutetat deacutesigneacutedans le paramegravetre

string mysqli_stmt_error (ressource ordreSQL)

Idem mysqli_error agrave partir de lrsquoidentifiant drsquoeacutetat deacutesigneacutedans le paramegravetre

string mysqli_connect_error() Retourne le message drsquoerreur drsquoune mauvaise connexion

int mysqli_connect_errno() Retourne le code drsquoerreur drsquoune mauvaise connexion

Tableau 9-14 Gestion drsquoerreurs

Code PHP Commentaires

if ( ($service = mysqli_connect(localhost soutou iut bdsoutou)) gt 0) $delete1 = DELETE FROM bdsoutouCompagnie $ordre = mysqli_prepare($service $delete1) print $delete1

Connexion

Preacuteparation de lrsquoordre if ( ($res = mysqli_stmt_execute($ordre)) gt 0) print ltBRgtSuppression de Compagnie

Exeacutecution

else print ltBRgtltBgtMessage ltBgt print ltBRgtltBgtCode ltBgt mysqli_stmt_free_result($ordre) mysqli_close($service)

Affichage de lrsquoerreurLibeacuteration des ressourcesFermeture de laconnexion

else print Lutilisateur na pu se connecter ltBRgt print ltBgtMessage ltBgt

Erreur de connexion

Web

mysqli_stmt_error($ordre)mysqli_stmt_errno($ordre)

mysqli_connect_error()

Figure 9-4 Exception SQL leveacutee agrave lrsquoaide de PHP

4055_09_C09 Page 338 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 339

chapitre ndeg 9 Utilisation avec PHP

Proceacutedures catalogueacutees

Comme dans tout autre langage hocircte PHP permet drsquoinvoquer des proceacutedures catalogueacutees cocircteacuteserveur Supposons que nous disposions de la proceacutedure augmenteCap qui augmente lacapaciteacute (premier paramegravetre) des avions drsquoune compagnie donneacutee (deuxiegraveme paramegravetre)

CREATE PROCEDURE bdsoutouaugmenteCap(IN nbre TINYINT IN compag CHAR(4))

BEGIN

UPDATE Avion SET capacite = capacite + nbre WHERE compa = compag

END

Paramegravetre en entreacutee

Le code suivant (procedureCatphp) appelle cette proceacutedure afin drsquoaugmenter de 50 lacapaciteacute des avions de la compagnie de code AF en utilisant la fonction mysqli_multi_query Notez lrsquoutilisation des simples guillemets pour les paramegravetres en chaicircnes de caractegraveres

Pensez agrave donner lrsquoautorisation agrave lrsquoutilisateur appelant (ici soutou) drsquoexeacutecuter la proceacutedure (jelrsquoai eacutecrite sous root GRANT EXECUTE ON PROCEDURE bdsoutouaugmenteCap TO sou-toulocalhost$)

Paramegravetre en sortie

Afin de travailler avec des paramegravetres en sortie il est neacutecessaire drsquoutiliser des variables desession Une fois ces variables de session initialiseacutees au retour de lrsquoappel du sous-programmeil faudra extraire chaque valeur agrave lrsquoaide drsquoun SELECT dans une requecircte simple

Le code suivant (procedureCat2php) deacutecrit lrsquoappel de la proceacutedure leNomCompa-gnieEst (deacutecrite au chapitre 8 section Proceacutedures catalogueacutees) ayant deux paramegravetres Le

Web

Tableau 9-15 Appel drsquoune proceacutedure catalogueacutee (paramegravetres drsquoentreacutee)

Code PHP Commentaires

if (($service = mysqli_connect(localhost soutou iut bdsoutou)) gt 0)

Connexion

$nb = 50 $comp = AF if ($result = gt 0) print ltBRgtProceacutedure reacutealiseacutee correctement else print ltBRgtLa proceacutedure est un eacutechec mysqli_close($service)

Initialisation des variables PHP drsquoappel

Appel de la proceacutedure

else print ltBRgtLa connexion est un eacutechec

Fermeture de la connexion

Web

mysqli_multi_query($servicecall bdsoutouaugmenteCap($nb$comp))

mysqli_error($service)

4055_09_C09 Page 339 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

340 copy Eacuteditions Eyrolles

premier (en entreacutee) indique lrsquoavion de la compagnie rechercheacute le second (en sortie) contientle nom de la compagnie

Notez lrsquoutilisation de

la fonction mysqli_multi_query pour appeler la proceacutedure catalogueacutee

la variable de session v_retour pour reacutecupeacuterer le paramegravetre en sortie

la fonction mysqli_query pour extraire la valeur de la variable de session (contenue agravelrsquoindice 0 du tableau reacutesultat car il nrsquoy a ici qursquoune valeur retourneacutee dans le SELECT)

Meacutetadonneacutees

Plusieurs fonctions permettent drsquoextraire des informations en provenance du dictionnaire desdonneacutees (meta data) agrave partir drsquoune instruction SQL Par exemple mysqli_stmt_result_metadata retourne un identifiant de reacutesultat permettant drsquoextraire des meacutetadonneacutees agrave partirdrsquoune requecircte preacutepareacutee La fonction mysqli_fetch_field retourne un objet qui contientles meacutetadonneacutees des colonnes concerneacutees par une requecircte

Citons drsquoautres fonctions comme mysqli_fetch_field_direct et mysqli_fetch_fields qui sont similaires agrave mysqli_fetch_field Une fois lrsquoobjet retourneacute par cettefonction il faut extraire certains de ces champs agrave la demande

Tableau 9-16 Appel drsquoune proceacutedure catalogueacutee (paramegravetre de sortie)

Code PHP Commentaires

if ( ($service = mysqli_connect(localhost soutou iut bdsoutou)) gt 0)

Connexion

$immat = F-GAFU if ($result = gt 0) if ($result2 = ) $ligne = if ($ligne[0] == null) print ltBRgtDeacutesoleacute lavion $immat na pas de compagnie else print ltBRgtLa compagnie de lavion $immat est $ligne[0] mysqli_free_result($result2) else print ltBRgtProblegraveme au retour du paramegravetre mysqli_error($service) else print ltBRgtLa proceacutedure est un eacutechec mysqli_error($service)$result

Initialisation de la variable PHP drsquoappelAppel de la proceacutedure

Extraction de la variable de session

Affichage du reacutesultat

Gestion des erreurs

mysqli_close($service)else print ltBRgtLa connexion est un eacutechec

Fermeture de la connexion

Web

mysqli_multi_query$servicecall bdsoutouleNomCompagnieEst

($immatv_retour))mysqli_query($service

SELECT v_retour)mysqli_fetch_array($result2 MYSQLI_NUM)

4055_09_C09 Page 340 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 341

chapitre ndeg 9 Utilisation avec PHP

Tableau 9-17 Fonctions pour les meacutetadonneacutees

Nom de la fonction Paramegravetres

ressourcemysqli_stmt_result_metadata(ressource ordreSQL)

Le paramegravetre est lrsquoidentifiant drsquoeacutetat obtenu apregravesprepare

object mysqli_fetch_field(ressource ordreSQL)

Le paramegravetre est lrsquoidentifiant de reacutesultat obtenuapregraves mysqli_query ou FALSE si aucune infor-mation nrsquoest renvoyeacutee pour lrsquoordre SQL concerneacute

int mysqli_num_fields(ressource ordreSQL)

Retourne le nombre de colonnes concerneacutees parlrsquoordre SQL Le paramegravetre est lrsquoidentifiant de reacutesul-tat obtenu apregraves mysqli_query

Tableau 9-18 Champs de lrsquoobjet retourneacute par mysqli_fetch_field

Nom du champ Signification

name Nom de la colonne

table Nom de la table agrave laquelle la colonne appartient (si elle nrsquoa pas eacuteteacute calculeacutee)

def Valeur par deacutefaut de la colonne

max_length Taille maximale de la colonne pour le jeu de reacutesultats retourneacute par la requecircte

flags Entier repreacutesentant le bit-flags pour la colonne (codage des contraintes)

type Code du type de donneacutees de la colonne

decimals Nombre de deacutecimales de la colonne

Tableau 9-19 Code du type de donneacutees

Type MySQL Code eacutequivalent

DECIMAL 0

TINYINT 1

SMALLINT 2

INT 3

FLOAT 4

DOUBLE 5

TIMESTAMP 7

BIGINT 8

MEDIUMINT 9

DATE 10

TIME 11

DATETIME 12

YEAR 13

TEXT TINYBLOB TINYTEXT BLOB MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT

252

VARBINARY VARCHAR 253

CHAR BINARY ENUM SET 254

4055_09_C09 Page 341 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

342 copy Eacuteditions Eyrolles

Fonction mysqli_fetch_field

Le programme suivant (meta1php) utilise la fonction mysqli_fetch_field afindrsquoextraire la structure complegravete (en termes de colonnes) drsquoune table

Le reacutesultat est le suivant

Quelques explications

La taille vaut 2 pour la colonne compa car seule la compagnie de code AF est repreacutesen-teacutee dans mon jeu drsquoessai

Tableau 9-20 Extraction de la structure drsquoune table

Code PHP Commentaires

if ( ($res = mysqli_query ($service SELECT FROM bdsoutouAvion)) gt 0) $ncols = print ltH4gtStructure de la table Avion ($ncols colonnes)ltH4gt print lttable border=1gt print lttrgtltthgtNomltthgtltthgtTypeltthgtltthgtTailleltthgt ltthgtFlagltthgtlttrgt

Requecircte

Extraction du nombre decolonnes

while ($obj= ) print lttrgtlttdgt lttdgt lttdgt lttdgt lttdgt lttdgt lttdgt lttdgtlttrgt print lttablegtn

Affichage du nom codedu type taille maximaleet contraintes de chaquecolonne extraite

else print ltBRgtLa requete est un eacutechecmysqli_close($service)

Web

mysqli_num_fields($res)

mysqli_fetch_field($res)$obj-gtname$obj-gttype$obj-gtmax_length$obj-gtflags

Figure 9-5 Extraction de la structure drsquoune table

4055_09_C09 Page 342 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 343

chapitre ndeg 9 Utilisation avec PHP

(rootlocalhost) [bdsoutou] mysqlgt select from avion

+--------+-----------+----------+-------+

| immat | typeAvion | capacite | compa |

+--------+-----------+----------+-------+

| F-GAFU | A320 | 160 | AF |

| F-GLFS | A320 | 170 | AF |

| F-WOWW | A380 | NULL | AF |

| F-WTSS | Concorde | 90 | AF |

+--------+-----------+----------+-------+

Le flag vaut 16 387 pour la colonne immat car cette colonne est une cleacute primaire(ajouter 1) et non nulle (ajouter 2) et elle fait partie drsquoune cleacute (ici primaire ajouter16 384) Ci-apregraves un extrait du fichier mysql_confh Le flag vaut 16 392 pour lacolonne compa car elle fait partie drsquoune cleacute (ici eacutetrangegravere ajouter 16 384) et crsquoest une cleacuteeacutetrangegravere (ajouter 8) etc

Field cant be NULL

Field is part of a primary key define UNIQUE_KEY_FLAG 4 Field is part of a unique key

Field is part of a key define BLOB_FLAG 16 Field is a blob define UNSIGNED_FLAG 32 Field is unsigned define ZEROFILL_FLAG 64 Field is zerofill define BINARY_FLAG 128 Field is binary define ENUM_FLAG 256 field is an enum define AUTO_INCREMENT_FLAG 512 field is a autoincrement field define TIMESTAMP_FLAG 1024 Field is a timestamp define SET_FLAG 2048 field is a set define NO_DEFAULT_VALUE_FLAG 4096 Field doesnt have default value

Intern Part of some key define NUM_FLAG 32768 Field is num (for clients)

Fonction mysqli_stmt_result_metadata

Peu de changements par rapport au programme preacuteceacutedent La fonction mysqli_stmt_result_metadata suppose qursquoon travaille avec un eacutetat preacutepareacute Elle sert agrave affecter un iden-tifiant de reacutesultat qui passe en paramegravetre de mysqli_fetch_field comme vu preacuteceacutedem-ment

$requete = SELECT FROM bdsoutouAvion

$ordre = mysqli_prepare($service$requete)

if (($res = ) gt 0)

while ($obj= )

print lttdgt$obj-gtnamelttdgt

define NOT_NULL_FLAG 1

define PRI_KEY_FLAG 2

define MULTIPLE_KEY_FLAG 8

define PART_KEY_FLAG 16384

mysqli_stmt_result_metadata($ordre)

mysqli_fetch_field($res)

4055_09_C09 Page 343 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

344 copy Eacuteditions Eyrolles

Exercices

Lrsquoobjectif de ces exercices est de compleacuteter des progammes PHP pour extraire et mettre agrave jourdes donneacutees de certaines des tables du scheacutema Parc informatique

91 Extraction preacutepareacutee

Eacutecrire le programme exo1suitephp qui devra retrouver le nom du logiciel le numeacutero de poste ladate drsquoinstallation et la date drsquoachat du logiciel pour toutes les installations drsquoune salle donneacutee Ceprogramme sera appeleacute agrave partir du programme exo1debutphp composant un formulaire de saisie

lthtmlgt ltheadgt lttitlegtInstallations dune sallelttitlegt ltheadgt

ltbodygt

ltform method=POSTgtltpgt

ltH4gtRecherche des installations dune salleltH4gtltPgt

Numeacutero de salle ltinput type=text name=ns maxlength=7gtltBRgt

ltinput type=submit value=Cherchergt

ltformgt

ltbodygt lthtmlgt

Vous utiliserez

bull $_POST[lsquonsrsquo] pour reacutecupeacuterer la valeur du numeacutero de salle saisi dans le formulaire

bull mysqli_prepare mysqli_stmt_execute et mysqli_stmt_bind_result pour preacutepa-rer exeacutecuter et lier des variables PHP en sortie

bull Un affichage simple de type laquo Aucune installation dans la salle si la salle ne contient aucun postesur lequel un logiciel est installeacute raquo (exemple pour s12)

Votre programme doit produire un reacutesultat analogue agrave lrsquoeacutecran suivant

Figure 9-6 Formulaire de saisie

action=exo1suitephp

4055_09_C09 Page 344 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 345

chapitre ndeg 9 Utilisation avec PHP

92 Appel drsquoun sous-programme

Utiliser de nouveau la proceacutedure catalogueacutee supprimeSalle(IN ns VARCHAR(7)OUT resTINYINT) deacutecrite agrave lrsquoexercice du chapitre 8 Cette proceacutedure supprime une salle dont le numeacutero estpasseacute en premier paramegravetre et retourne en second paramegravetre

bull 0 si la suppression srsquoest deacuterouleacutee correctement

bull ndash 1 si le code de la salle est inconnu

bull ndash 2 si la suppression est impossible (contraintes reacutefeacuterentielles)

Eacutecrire le programme exo2suitephp qui agrave partir drsquoune saisie du numeacutero de salle (programmeexo2debutphp similaire agrave exo1debutphp) appelle le sous-programme supprimeSalle

lthtmlgt ltheadgt lttitlegtSuppression dune sallelttitlegt ltheadgt

ltbodygt

ltform action method=POSTgtltpgt

ltH3gtSalle agrave supprimerltH3gtltPgt

Numeacutero de salle ltinput type=text name=ns maxlength=7gtltBRgt

ltinput type=submit value=Supprimergt

ltinput type=reset value=Resetgt

ltformgt

ltbodygt lthtmlgt

Figure 9-7 Extraction preacutepareacutee

Figure 9-8 Formulaire de saisie

=exo2suitephp

4055_09_C09 Page 345 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

346 copy Eacuteditions Eyrolles

Tracez les diffeacuterents cas drsquoerreurs (numeacutero de salle reacutefeacuterenceacute par un poste de travail puis numeacutero desalle inexistant) Pensez agrave donner agrave lrsquoutilisateur le privilegravege en exeacutecution sur cette proceacutedure

93 Insertion preacutepareacutee

Eacutecrire le programme PHP exo3suitephp qui agrave partir drsquoune saisie des paramegravetres neacutecessairespour enregistrer une nouvelle installation agrave la date du jour drsquoun logiciel sur un poste de travail reacutealiselrsquoinsertion dans la table Installer Cette saisie sera reacutealiseacutee dans le programme exo3debutphpci-apregraves

lthtmlgt ltheadgt lttitlegtNouvelle installations de logiciel sur un

postelttitlegt ltheadgt

ltbodygt

lt method=POSTgtltpgt

ltphp

$format=j-n-Y

$datej = date($format)

print ltH4gtInstallation dun logiciel agrave la date du $datejltH4gtltPgt

gt

Numeacutero de poste ltinput type=text name=np maxlength=7gt

Code du logiciel ltinput type=text name=nl maxlength=5gtltBRgt

ltinput type=submit value=Enregistrergt

ltinput type=reset value=Resetgt

ltformgt

ltbodygt lthtmlgt

Pour tester une eacuteventuelle erreur de compatibiliteacute entre le type du poste et celui du logiciel (voir ledeacuteclencheur de lrsquoexercice en fin de chapitre 7) vous afficherez le message drsquoerreur (avec mysqli_stmt_error) et le code drsquoerreur si lrsquoinsertion se passe mal Tester une insertion correcte (p10log1) et une insertion incorrecte du fait des types diffeacuterents (p8 log7)

Figure 9-9 Saisie du formulaire

form action=exo3suitephp

4055_09_C09 Page 346 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 347

chapitre ndeg 9 Utilisation avec PHP

Figure 9-10 Insertion correcte

Figure 9-11 Erreur apregraves insertion

4055_09_C09 Page 347 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

4055_09_C09 Page 348 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

349

Chapitre 10

Outils graphiques

MySQL AB fournit gratuitement plusieurs outils graphiques afin drsquoadministrer de manipulerdrsquointerroger et de faire migrer une base de donneacutees Ce sont

MySQL Administrator

MySQLQuery Browser

et

MySQL Migration Toolkit

Lrsquoutilisation de cet outil de migration sort ducadre de cet ouvrage nous ne lrsquoeacutetudierons donc pas

Par ailleurs il existe drsquoautres consoles graphiques drsquoadministration que nous allons observersommairement agrave savoir le ceacutelegravebre

phpMyAdmin

(interface Web eacutecrite en PHP)

Toad

forMySQL

(plus connu pour sa version Oracle)

Navicat

et

EMS SQL Manager

Ce chapitre survole les principales fonctionnaliteacutes de ces logiciels Nrsquoy voyez pas ici un guidede reacutefeacuterence

MySQL Administrator

MySQL Administrator

est un outil drsquoadministration (bases tables utilisateurs) de sauvegarde(

backup

) de restauration (

restore

recovery

) et de surveillance (

database

monitoring

)

SousWindows il se preacutesente sous la forme drsquoun

Package Windows Installer

(extension

msi

) Soninstallation ne pose aucun problegraveme Vous trouverez la documentation officielle surhttpdevmysqlcomdocadministratorenindexhtml

Connexion

La console se lance sous Windows agrave partir de

Deacutemarrer

Programmes

MySQLMySQLAdministrator

Apparaicirct ensuite lrsquoeacutecran ci-apregraves pour lequel dans notre cas il faut saisirle mode de passe de

root

sur le serveur local

4055_10_C10 Page 349 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

350

copy Eacuteditions Eyrolles

Connexion nommeacutee

Lrsquoeacutecran suivant deacutecrit lrsquointerface accessible (choix laquo hellip raquo agrave cocircteacute de

Stored Connection

)pour preacutedeacutefinir une connexion Ici elle se nomme

cxSoutouLocal

et correspondra agrave laconnexion de

soutou

sur la base

bdsoutou

situeacutee sur le serveur local

Une fois la connexion choisie il faut srsquoidentifier au niveau de la base de donneacutees cible

Figure 10-1

Connexion agrave un serveur

Figure 10-2

Creacuteation drsquoune connexion nommeacutee

4055_10_C10 Page 350 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

351

chapitre ndeg 10 Outils graphiques

Liste des accegraves utilisateur

Lorsque la connexion est eacutetablie pour lrsquoutilisateur choisi il est possible de geacuterer une basetout en respectant ses propres preacuterogatives Ici nous choisissons sous

root

en local delister les accegraves utilisateur En seacutelectionnant un accegraves utilisateur (ici

root

sur

localhost

)il est possible de modifier ces caracteacuteristiques et ces privilegraveges

Quand vous ajoutez un nouvel utilisateur pensez agrave autoriser sa connexion agrave partir de chaquemachine cliente Clic droit sur lrsquoutilisateur dans la fenecirctre principale

Add Host FromWhich The User Can Connect

Ensuite il faudra lui allouer des privilegraveges sur chaquebase de donneacutees autoriseacutee

Gestion des privilegraveges

En seacutelectionnant un utilisateur lrsquoonglet

Schema Privileges

permet graphiquementdrsquoaffecter ou de reacutevoquer tout privilegravege sur toute base Dans lrsquoeacutecran suivant

root

affecte agravelrsquoaccegraves utilisateur

soutou

en local le privilegravege

SELECT

sur la base

mysql

Figure 10-3

Liste des utilisateurs

4055_10_C10 Page 351 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

352

copy Eacuteditions Eyrolles

Caracteacuteristiques systegraveme

Le choix

Health

de la fenecirctre principale renseigne les occupations meacutemoire des process encours sur le serveur MySQL ainsi que la valeur des variables systegraveme Lrsquoeacutecran suivant affichepar exemple le format par deacutefaut de repreacutesentation des colonnes de type date-heure

Figure 10-4

Caracteacuteristiques drsquoun utilisateur

Figure 10-5

Variables systegraveme

4055_10_C10 Page 352 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

353

chapitre ndeg 10 Outils graphiques

Options scripts SQL

Lrsquooption

ToolsOptions

(choix

Editors

) permet de personnaliser les scripts SQL quiseront automatiquement geacuteneacutereacutes suite agrave des modifications structurelles drsquoune base (ajout drsquounetable drsquoune contrainte etc) Lrsquoeacutecran suivant preacutesente les options par deacutefaut Par exemple lacontrainte de cleacute primaire si elle est une seacutequence de la table

Etudiant

se nommera automa-tiquement

idEtudiant

Figure 10-6

Options par deacutefaut des scripts SQL

4055_10_C10 Page 353 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

354

copy Eacuteditions Eyrolles

Composition drsquoune base

Le choix

Catalogs

de la fenecirctre principale donne des informations sur les tables index vueset proceacutedures catalogueacutees drsquoune base Lrsquoeacutecran suivant preacutesente la liste des tables de la base

bdsoutou

Figure 10-7

Liste des tables drsquoune base

4055_10_C10 Page 354 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

355

chapitre ndeg 10 Outils graphiques

Composition drsquoune table

En double-cliquant sur le nom drsquoune table on obtient le deacutetail des colonnes (la compositiondes cleacutes eacutetrangegraveres eacutegalement) ainsi que les caracteacuteristiques systegraveme relatives au mode destockage Lrsquoeacutecran suivant nous reacutevegravele la structure de la table

Poste

situeacutee dans la base

bdsoutou

Figure 10-8

Deacutetail des colonnes drsquoune table

4055_10_C10 Page 355 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

356

copy Eacuteditions Eyrolles

Composition des index

Lrsquoonglet

Shema Indices

deacutetaille les index preacutesents dans une base Lrsquoeacutecran suivant nousmontre les trois index de la table

Poste

situeacutee dans la base

bdsoutou

Modification drsquoun scheacutema

Eacutetudions agrave preacutesent la modification drsquoun scheacutema par le fait drsquoajouter une table puis unenouvelle contrainte agrave une table existante

Creacuteation drsquoune table

Lrsquoeacutecran suivant illustre la creacuteation de la table

Aeroport

dont les colonnes

codeOACI

et

compa

composent la cleacute primaire

Agrave lrsquoissue de cette creacuteation apregraves avoir cliqueacute sur

Apply Changes

arrive lrsquoeacutecran qui deacutecrit lasyntaxe SQL geacuteneacutereacutee Si vous deacutesirez conserver une trace de ce script pensez agrave copier-collerle contenu de la fenecirctre

Figure 10-9

Deacutetail des index

4055_10_C10 Page 356 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

357

chapitre ndeg 10 Outils graphiques

Figure 10-10

Creacuteation drsquoune table

Figure 10-11

Script SQL de creacuteation de table geacuteneacutereacute

4055_10_C10 Page 357 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

358

copy Eacuteditions Eyrolles

Ajout contrainte

Inseacuterons agrave preacutesent la cleacute eacutetrangegravere reliant la table

Aeroport

agrave la table

Compagnie

(laquo pegravere raquo) Dans lrsquoordre ajouter le nom de la contrainte laquo + raquo choisir la table cible puis lacolonne de la table laquo fils raquo (ici

compa

) Enfin vous pouvez restreindre les actions en cascade

Agrave lrsquoissue de cette modification arrive lrsquoeacutecran qui deacutecrit la syntaxe SQL geacuteneacutereacutee Si vousdeacutesirez conserver une trace de ce script pensez agrave copier-coller le contenu de la fenecirctre

Restriction

Pour toute modification dans quelque fenecirctre que ce soit il nrsquoest pas possible drsquoextraire lacommande SQL geacuteneacutereacutee automatiquement (sauf pour la creacuteation et la modification de tables)Cette option est tregraves preacutecieuse pour les administrateurs qui deacutesirent archiver les sources de

toutes leurs opeacuterations pour les reacuteutiliser agrave la demande si neacutecessaire

Figure 10-12

Ajout drsquoune cleacute eacutetrangegravere

Figure 10-13 Script SQL drsquoajout drsquoune cleacute eacutetrangegravere

4055_10_C10 Page 358 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 359

chapitre ndeg 10 Outils graphiques

MySQL Query Browser

MySQL Query Browser est un outil graphique composeacute drsquoune interface pour creacuteer exeacutecuter etoptimiser des instructions SQL (LDD LMD LID et LCD) Bien que toutes les instructionsgeacuteneacutereacutees par le biais de cet outil soient exeacutecutables en ligne de commande (crsquoest une chancepour vous qui avez ingurgiteacute toute la syntaxe SQLhellip) la documentation affirme que certainesrequecirctes peuvent y ecirctre composeacutees graphiquement de maniegravere plus intuitive (ce nrsquoest quandmecircme pas le QBE drsquoAccess)

MySQL Query Browser convient agrave des bases MySQL de version posteacuterieure agrave 40 SousWindows il se preacutesente sous la forme drsquoun Package Windows Installer (extension msi) Soninstallation ne pose aucun problegraveme Vous trouverez la documentation officielle surhttpdevmysqlcomdocquery-browserenindexhtml

Une fois connecteacute avec la mecircme interface que MySQL Administrator (dans laquelle vouschoisissez lrsquoutilisateur le serveur la base et saisissez le mot de passe) arrive la fenecirctreprincipale

Fenecirctre principale

Lrsquointerface inclut la palette drsquooutils suivante

Query Toolbar (zone de texte en haut au centre) pour creacuteer et eacutexeacutecuter des instructions(requecirctes et tout ordre de creacuteation ou de manipulation) et naviguer (avec Next et Goback) dans lrsquohistorique de ces commandes

Resultset qui affiche le reacutesultat drsquoune requecircte avec en bas un bandeau pour les onglets decontrocircle et lrsquoaffichage drsquoeacuteventuelles erreurs

Script Editor (onglets Edit Apply changes Discard changes First Last etSearch qui se trouvent en bas de la fenecirctre de reacutesultats) vous donne le controcircle pour creacuteermodifier et rechercher manuellement des donneacutees parmi les enregistrements extraits parune requecircte

Object Browser vous permet de seacutelectionner les colonnes des tables des bases qui voussont accessibles Vous pouvez double-cliquer ou faire des glisser-deacuteposer de colonnes(mecircme de diffeacuterentes tables pour composer des jointures) dans la zone de commande Lesbookmarks et les historiques sont aussi geacutereacutes agrave ce niveau

Inline Help (zone de texte en bas agrave droite) vous donne un acceacutes direct agrave lrsquoaide de toutescommandes SQL et fonctions La syntaxe srsquoaffiche dans le Resultset

4055_10_C10 Page 359 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

360 copy Eacuteditions Eyrolles

Extraction

Lrsquoeacutecran suivant illustre une jointure composeacutee agrave lrsquoaide drsquoun glisser-deacuteposer des colonnesconcerneacutees Toute la requecircte ne se compose pas automatiquement (jrsquoai ducirc eacutecrire manuelle-ment le signe laquo = raquo du preacutedicat de jointure et la condition du deuxiegraveme preacutedicat)

Je ne suis pas un professionnel de cette interface qui a quand mecircme agrave mon sens encore desprogregraves agrave faire pour faciliter vraiment lrsquoeacutecriture des requecirctes (notamment pour les jointuresavec sous-requecirctes) Notez que crsquoest lrsquoeacutecriture relationnelle de la jointure qui est choisie parlrsquooutil (ce qui confirme mes dires au chapitre 4 section Jointure relationnelle)

Figure 10-14 Fenecirctre principale de MySQL Query Browser

4055_10_C10 Page 360 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 361

chapitre ndeg 10 Outils graphiques

Modification

Lrsquoeacutecran suivant illustre une requecircte (monotable) dont le reacutesultat permet de modifier toutecolonne de la table en seacutelectionnnant lrsquoonglet Edit puis Apply changes

On peut eacutegalement ajouter un enregistrement (eacutequivalent agrave INSERT) en se positionnant surlrsquoenregistrement vide en fin de reacutesultat puis faire un clic droit sur le choix Add Row Poursupprimer un enregistrement (eacutequivalent agrave DELETE) le seacutelectionner puis faire un clic droitsur le choix Delete Row(s) Toute modification devra bien sucircr respecter les eacuteventuellescontraintes drsquouniciteacute de non nulliteacute et drsquointeacutegriteacute reacutefeacuterentielle

Figure 10-15 Jointure (requecircte multitable)

4055_10_C10 Page 361 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

362 copy Eacuteditions Eyrolles

phpMyAdmin

phpMyAdmin est un outil drsquoadministration drsquoun ou de plusieurs serveurs MySQL Les fonc-tionnaliteacutes principales de cet outil sont

de creacuteer modifier et supprimer des bases de donneacutees et des tables de geacuterer les utilisateurset leurs privilegraveges

drsquoexeacutecuter toute instruction SQL mecircme les requecirctes par lot de proposer Query By Examplepour eacutecrire des requecirctes complexes

drsquoimporter des donneacutees provenant de fichiers texte ou drsquoexporter des donneacutees aux formatsCSV XML et Latex

de creacuteer des graphiques PDF du scheacutema de votre base de donneacutees de geacuterer mysqli la derniegravere API PHP pour MySQL

Plusieurs installations sont possibles individuellement avec Apache et PHP avec WAMPavec EasyPHP (mais la version actuelle ne reconnaicirct pas encore MySQL 5) Vous trouverez ladocumentation officielle sur httpwwwphpmyadminnetpma_localized_docsfr

Une fois installeacute et configureacute avec Apache arrive la fenecirctre principale qui permet de seacutelectionnerles principales fonctionnaliteacutes Ici je seacutelectionne la base bdsoutou

Figure 10-16 Modification drsquoun enregistrement

4055_10_C10 Page 362 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 363

chapitre ndeg 10 Outils graphiques

Composition de la base

Les tables et vues (quinze en tout) apparaissent sur lesquelles diffeacuterentes actions sont possibles viales icocircnes dans la colonne Action (afficher structurer rechercher inseacuterer vider et supprimer)

Figure 10-17 phpMyAdmin

Figure 10-18 Composition de la base

4055_10_C10 Page 363 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

364 copy Eacuteditions Eyrolles

Structure drsquoune table

En seacutelectionnant la structure drsquoune table (ou vue) il est possible drsquoajouter de modifier ou desupprimer une colonne ou une contrainte de cleacute (primaire ou eacutetrangegravere)

Administrer une table

Lrsquoonglet Opeacuterations au niveau drsquoune table permet de modifier les caracteacuteristiques drsquounetable agrave lrsquoeacutechelle de la database

Figure 10-19 Structure drsquoune table

4055_10_C10 Page 364 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 365

chapitre ndeg 10 Outils graphiques

Extractions

Lrsquoonglet SQL permet de saisir une instruction SQL (LDD LMD LID ou LCD) Ici jrsquoai fait un copier-coller de la requecircte de division de lrsquoexercice du chapitre 4 Malheureusement jrsquoobtiens une erreurdans cette interface alors qursquoen ligne de commande deux lignes sont retourneacutees (postes 6 et 8)

Figure 10-20 Administrer une table

Figure 10-21 Requecircte SQL

4055_10_C10 Page 365 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

366 copy Eacuteditions Eyrolles

Lrsquoonglet Requecircte aide agrave la construction de requecirctes SQL (de type QBE) Dans lrsquoeacutecransuivant on compose une jointure entre les tables installer et logiciel Notez que laclause de jointure doit ecirctre saisie explicitement Ici on affiche le nom et la date drsquoinstallationdes logiciels existant sur des postes de travail

Rechercher

Lrsquoonglet Rechercher permet de rechercher des valeurs dans une ou plusieurs tables (ou vues)Ici on recherche les tables qui contiennent un enregistrement dont une colonne contient le motlaquo Oracle raquo Il est ensuite possible drsquoafficher ou drsquoeffacer chacune des occurrences veacuterifiant cettecondition

Figure 10-22 Assistant QBE

4055_10_C10 Page 366 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 367

chapitre ndeg 10 Outils graphiques

Exporter

Lrsquoonglet Exporter permet de transfeacuterer des donneacutees (et des structures) drsquoune ou de plusieurstables sous diffeacuterents formats (voir lrsquoeacutecran ci-apregraves)

Figure 10-23 Recherche dans plusieurs tables

Figure 10-24 Exportation au format Word

4055_10_C10 Page 367 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

368 copy Eacuteditions Eyrolles

Utilisateurs

Lrsquoonglet Privilegraveges autorise la gestion des accegraves utilisateur avec leur privilegraveges En seacutelec-tionnant un utilisateur existant il est aussi possible de modifier ses caracteacuteristiques

Le message en rouge en bas de page vous invite agrave modifier le mot de passe de root Jrsquoai eudes mauvaises surprises suite agrave plusieurs tentatives de modification Meacutefiancehellip

TOAD for MySQL

Toad for MySQL est un outil graphique drsquoadministration et de deacuteveloppement qui estdisponible gratuitement dans une version Preview Release Toutefois ce statut de freewaresemble temporaire et le produit doit ecirctre reteacuteleacutechargeacute tous les 60 jours (httpwwwtoad-softcomtoadmysqltoad_mysqlhtm)

Sous Windows il se preacutesente sous la forme drsquoune archive drsquoun installeur (fichier agrave extensionmsi) dont lrsquoexeacutecution ne pose aucun problegraveme Quand la grenouille coasse TOAD est precirctpour vous Au premier deacutemarrage des choix de mode drsquoaffichage vous seront demandeacutes Parla suite vous devrez vous connecter en donnant tous les paramegravetres neacutecessaires

Figure 10-25 Gestion des utilisateurs

4055_10_C10 Page 368 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 369

chapitre ndeg 10 Outils graphiques

Une fois connecteacute arrive une interface agrave partir de laquelle par le menu Tools et Views desonglets se composent dans la fenecirctre principale Lrsquoaffichage de ces onglets qui sont constitueacutesde boutons listes deacuteroulantes choix etc est controcircleacute par le menu Window

Administration

Le choix ToolsDatabase Browser en seacutelectionnant une base de donneacutees renseigne lestables index vues proceacutedures catalogueacutees privilegraveges des utilisateurs etc Tout objet relatif agravela base se retrouve ici

Lrsquoeacutecran suivant preacutesente les onglets disponibles pour la base bdsoutou On srsquointeacuteresse ici agravela composition de la table Installer Toute modification de cette table au niveau de lastructure est possible (sous reacuteserve de maintenir lrsquointeacutegriteacute des donneacutees via drsquoeacuteventuellescontraintes reacutefeacuterentielles)

Lrsquoonglet Data extrait les lignes drsquoune table Lrsquoonglet Indexes deacutecrit les index preacutesents dansla table Lrsquoonglet Constraints liste les contraintes reacutefeacuterentielles Lrsquoonglet Informationeacutenumegravere les caracteacuteristiques physiques de la table Lrsquoonglet Script restitue le script SQL decreacuteation que vous pouvez sauvegarder sous la forme drsquoun fichier texte

Figure 10-26 Connexion via TOAD

4055_10_C10 Page 369 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

370 copy Eacuteditions Eyrolles

Instructions en ligne

Le choix ToolsEditor de la fenecirctre principale ouvre plusieurs fenecirctres dont la plus impor-tante est une zone de texte contenant une instruction SQL Lrsquoeacutecran suivant preacutesente une requecirctequi reacutealise une division (voir chapitre 4) Lrsquoonglet Result Sets contient le(s) reacutesultat(s) delrsquoextraction Lrsquoonglet Explain Plan permet de visualiser le plan drsquoexeacutecution

Figure 10-27 Composition drsquoune base

Figure 10-28 Extraction de donneacutees

4055_10_C10 Page 370 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 371

chapitre ndeg 10 Outils graphiques

Toute autre instruction SQL (LMD LDD et LCD) peut ecirctre exeacutecuteacutee dans ce mode Le menuCreate geacutenegravere automatiquement le deacutebut de la syntaxe SQL adeacutequate (creacuteation drsquoune basetable vue index ou proceacutedure catalogueacutee)

Deacuteveloppement

Le choix ToolsDatabase Browser ensuite lrsquoonglet Procedure en seacutelectionnant uneproceacutedure (clic droit puis Alter Procedure) permet de modifier puis de recompiler(EditorExecute SQL Statement) une proceacutedure existante Pour en creacuteer une nouvellevous avez le choix entre le clic droit puis Create Procedure ou passer par le menu geacuteneacuteralCreateProcedure

Creacuteation drsquoobjets

Le menu geacuteneacuteral Create permet de creacuteer des tables bases vues index et fonctions ou proceacute-dures catalogueacutees En seacutelectionnant le choix Table une fenecirctre srsquoouvre deacutecouvrant troisonglets pour caracteacuteriser la table Le premier onglet permet entre autres de deacutefinir le moteur destockage le nom la base et drsquoautres informations que lrsquoeacutecran suivant illustre

Figure 10-29 Modification drsquoun sous-programme

4055_10_C10 Page 371 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

372 copy Eacuteditions Eyrolles

Le second onglet donne la possibiliteacute de structurer la table (description de chaque colonne etdes contraintes en ligne)

Figure 10-30 Creacuteation drsquoune table (onglet Table)

Figure 10-31 Creacuteation drsquoune table (onglet Columns)

4055_10_C10 Page 372 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 373

chapitre ndeg 10 Outils graphiques

Le dernier onglet permet de deacutefinir les eacuteventuelles cleacutes eacutetrangegraveres de la table Jrsquoavoue avoir eudes problegravemes pour en creacuteer une qui soit impleacutementeacutee dans la basehellip Vous essayerez vous-mecircme

Recherche drsquoobjets

Une fonctionnaliteacute inteacuteressante concerne la recherche drsquoobjets (choix ToolsObjectSearch) Dans lrsquoexemple suivant on extrait tous les objets de la base de donneacutees mysql dontle nom contient la chaicircne laquo user raquo Notez aussi la possibiliteacute de chercher un identifiant (parexemple le nom drsquoune table) au sein du corps de proceacutedures fonctions ou vues (les deacuteclen-cheurs ne sont pas ici pris en compte visiblement)

Figure 10-32 Creacuteation drsquoune table (onglet Constraints)

4055_10_C10 Page 373 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

374 copy Eacuteditions Eyrolles

Exportations

Le choix ToolsExport Wizard lance un assistant (un peu semblable agrave celui drsquoAccess)seacutelectionnant une (ou plusieurs) table(s) ou une (ou plusieurs) base(s) de donneacutees afindrsquoexporter les donneacutees sous diffeacuterents formats Sont permis notamment les fichiers texte(avec seacuteparateurs entre colonnes) fichiers XML ou html insertion INSERT preacuteeacutecrites

La partie de code suivante preacutesente les deux premiegraveres lignes du fichier Installerxmlgeacuteneacutereacute suite agrave lrsquoexportation dans ce format de la table de mecircme nom

ltInstallergtltNPOSTEgtp2ltNPOSTEgtltNLOGgtlog1ltNLOGgtltNUMINSgt1ltNUMINSgt

ltDATEINSgt15052003 000000ltDATEINSgtltDELAIgt292400ltDELAIgt

ltInstallergt

ltInstallergtltNPOSTEgtp2ltNPOSTEgtltNLOGgtlog2ltNLOGgtltNUMINSgt2ltNUMINSgt

ltDATEINSgt17092003 000000ltDATEINSgtltDELAIgt146300ltDELAIgt

ltInstallergt

hellip

Navicat

Navicat est un outil assez simple et intuitif Il ravira ceux qui appreacutecient concevoir des requecirctesgraphiquement Ici le QBE est bien supeacuterieur agrave celui de phpMyAdmin La documentationofficielle se trouve agrave httpsupportnavicatcom

Figure 10-33 Recherche drsquoobjets

4055_10_C10 Page 374 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 375

chapitre ndeg 10 Outils graphiques

Sous Windows il se preacutesente sous la forme drsquoun exeacutecutable dont lrsquoinstallation ne pose aucunproblegraveme Au premier deacutemarrage vous devez vous connecter en donnant tous les paramegravetresneacutecessaires La fenecirctre principale srsquoaffiche

Creacuteation drsquoune table

Apregraves avoir opteacute pour le choix Design Table lrsquoonglet Fields permet de deacutefinir facilementpar listes deacuteroulantes les diffeacuterentes colonnes de la nouvelle table

Figure 10-34 Accueil de Navicat

Figure 10-35 Creacuteation des colonnes

4055_10_C10 Page 375 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

376 copy Eacuteditions Eyrolles

Deacutefinition drsquoune contrainte

Lrsquoonglet Foreign Key permet de creacuteer aiseacutement par listes deacuteroulantes les cleacutes eacutetrangegraveres(une fois que les colonnes sont creacuteeacutees)

Figure 10-36 Deacutefinition drsquoune cleacute eacutetrangegravere

4055_10_C10 Page 376 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 377

chapitre ndeg 10 Outils graphiques

Creacuteation drsquoune requecircte

Lagrave je dis laquo bravo raquo Vous allez vous reacutegaler agrave composer vos jointures en seacutelectionnant unecolonne puis en la glissant au niveau de la cleacute de la table associeacutee Vous verrez votre requecirctesrsquoeacutecrire au fur et agrave mesure que vous agirez sur le diagramme Vous pourrez eacutegalement agir auniveau de la requecircte en cliquant aux diffeacuterents endroits indiqueacutes

Figure 10-37 Creacuteation drsquoune requecircte

4055_10_C10 Page 377 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

378 copy Eacuteditions Eyrolles

Importation

Au niveau drsquoune table drsquoune base de donneacutees lrsquoonglet Import Wizard lance un assistant quicomporte huit eacutetapes et permet de charger la table en enregistrements pouvant provenir de dixformats diffeacuterents

Lrsquoassistant drsquoexportation comporte cinq eacutetapes et reconnaicirct une vingtaine de formats dedonneacutees cibles

Gestion des utilisateurs

Le choix Manage Users offre une maniegravere simple et efficace pour creacuteer modifier supprimerdes accegraves utilisateurs et les privilegraveges associeacutes agrave tous les niveaux (global database tablecolumn et procedure)

Figure 10-38 Importation de donneacutees

4055_10_C10 Page 378 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 379

chapitre ndeg 10 Outils graphiques

Enfin il est aussi possible drsquoeacutecrire des proceacutedures catalogueacutees de composer des rapportsdrsquoimpression et de programmer des tacircches drsquoadministration

MySQL Manager

MySQL Manager (socieacuteteacute EMS) est un outil payant puissant intuitif et posseacutedant denombreuses fonctionnaliteacutes Il ravira ceux qui appreacutecient le QBE qui est ici aussi bien supeacute-rieur agrave celui de phpMyAdmin La documentation officielle se trouve agrave httpwwwsqlmana-gernetfrproductsmysqlmanagerdocumentation

Sous Windows il se preacutesente sous la forme drsquoune archive contenant un exeacutecutable dontlrsquoinstallation ne pose aucun problegraveme Au premier deacutemarrage des choix de modes drsquoaffichagevous seront demandeacutes Par la suite vous devrez vous connecter en donnant tous les paramegravetresneacutecessaires La fenecirctre principale apparaicirct

Figure 10-39 Gestion des accegraves et des privilegraveges

4055_10_C10 Page 379 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

380 copy Eacuteditions Eyrolles

Creacuteation drsquoune table

Plusieurs chemins existent pour lancer lrsquoassistant de creacuteation drsquoune table qui ressemble agrave ceuxdeacutejagrave eacutetudieacutes pour les preacuteceacutedents outils On retrouvera les diffeacuterents onglets permettant demodifier les colonnes index cleacutes eacutetrangegraveres et donneacutees Lrsquoonglet DDL contient lrsquoinstructionSQL geacuteneacutereacutee

Figure 10-40 Accueil de SQL Manager

Figure 10-41 Creacuteation drsquoune table

4055_10_C10 Page 380 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 381

chapitre ndeg 10 Outils graphiques

Les cleacutes eacutetrangegraveres se rajoutent apregraves creacuteation de la structure totale de la table

Figure 10-42 Ajout drsquoune cleacute eacutetrangegravere

4055_10_C10 Page 381 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

382 copy Eacuteditions Eyrolles

Creacuteation drsquoune requecircte

Comme pour Navicat laquo bravo raquo eacutegalement Vous trouverez un outil efficace (plus encore quecelui de Navicat) pour eacutecrire vos requecirctes Lrsquoeacutecran suivant illustre une jointure (geacuteneacutereacutee commepour Navicat sous la forme drsquoune eacutecriture SQL2 avec INNER JOIN) affichant quatre champs

Le reacutesultat peut srsquoexploiter de maniegravere tregraves efficace (en tant que grille ou sous forme imprimable)

Proceacutedures catalogueacutees

Un bon point pour cet outil pour pouvoir geacuterer les proceacutedures en modification ou creacuteation etpour pouvoir les recompiler et affecter des privilegraveges drsquoexeacutecution

Figure 10-43 Construction graphique drsquoune requecircte

Figure 10-44 Proceacutedure catalogueacutee

4055_10_C10 Page 382 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 383

chapitre ndeg 10 Outils graphiques

Gestion des utilisateurs

Lrsquoassistant graphique est tregraves clair

Gestion des privilegraveges

Lrsquoonglet Gestionnaire de droits permet drsquoattribuer des privilegraveges agrave tous les niveauxLrsquoeacutecran suivant illustre lrsquoautorisation drsquoexeacutecution de deux proceacutedures et lrsquoautorisation demodification de deux autres agrave lrsquoaccegraves utilisateur Paul agrave partir de la machine 1921684173

Cet outil offre eacutegalement drsquoautres fonctionnaliteacutes comme la gestion des variables systegravemeassistants drsquoexportation etc

Figure 10-45 Gestion des utilisateurs

4055_10_C10 Page 383 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

384 copy Eacuteditions Eyrolles

Bilan

Les avantages des outils deacutedieacutes et professionnels (comme Navicat TOAD et EMS MySQLManager) reacutesident dans le fait qursquoils sont fiables et permettent de garder une configuration detravail De plus ils peuvent ecirctre facilement installeacutes sur une autre machine que le serveurMySQL

Pour les deacutebutants je leur conseille de commencer agrave travailler avec les deux outils de MySQLagrave savoir MySQL Administrator et MySQL Query Browser qui sont sucircrs et simples drsquoutilisationPhpMyAdmin sera preacutefeacutereacute par les connaisseurs et plutocirct reacuteserveacute aux configurations de typeapplication PHP heacutebergeacutees car il est le plus reacutepandu Neacuteanmoins les nombreuses configura-tions possibles entre les diffeacuterentes versions des acteurs concerneacutes (Apache PHP MySQL etphpMyAdmin) font que des mauvaises surprises peuvent facilement arriverhellip

Figure 10-46 Privilegraveges au niveau routine

4055_10_C10 Page 384 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

385

Annexe

Bibliographie et webographie

Magazines papiers et en ligne

Programmez

(wwwprogrammezcom)

Database Journal

(wwwdatabasejournalcom)

Livres

F B

ROUARD

C S

OUTOU

SQL

Pearson Education 2005

E D

ASPET

CP

DE

G

EYER

PHP 5 avanceacute

Eyrolles 2005

P D

ELMAL

SQL2-SQL3 Applications agrave Oracle

De Boeck Universiteacute 2000

M K

OFLER

MySQL 5

Eyrolles 2005

C S

OUTOU

De UML agrave SQL

Eyrolles 2002

Sites Web

Eyrolles

Eacutediteur wwweditions-eyrollescom

Compleacutements en ligne sur la fiche de lrsquoouvrage sur wwweditions-eyrollescom ou

httpicareiut-blagnacfrsoutoupersoSQLpourMySQLComplementshtml

MySQL

httpwwwmysqlcom

httpmysqldeveloppezcom

httpdevmysqlcomtech-resourcesfaqhtml

4055_11_Biblio Page 385 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

386

copy Eacuteditions Eyrolles

PHP

httpfrphpnetmanualfrindexphp

httpwwwnexennetdocs

SQL et bases de donneacutees

httpsqlprodeveloppezcom

httpfadacedeveloppezcom

Outils

MySQL Administrator MySQL Query Browser

httpwwwmysqlcomproductstools

phpMyAdmin

httpwwwphpmyadminnethome_pageindexphp

Navicat

httpwwwnavicatcom

TOAD

httpwwwtoadsoftcomtoadmysqltoad_mysqlhtm

EMS SQL Manager

httpwwwsqlmanagernet

4055_11_Biblio Page 386 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

387

Index

Symboles

$_POST 344 154amp 100ltlt 100gtgt 100^ 100| 100~ 100

A

ABS 99absolute 304Access 294ACOS 99ACTION_CONDITION 273ACTION_ORIENTATION 273ACTION_REFERENCE_NEW_ROW 273ACTION_REFERENCE_NEW_TABLE 273ACTION_REFERENCE_OLD_ROW 273ACTION_REFERENCE_OLD_TABLE 273ACTION_STATEMENT 273ACTION_TIMING 272ADD CONSTRAINT 72ADD INDEX 72ADDDATE 101ADDTIME 101AFTER 265afterLast 304ALGORITHM=MERGE 176ALGORITHM=TEMPTABLE 176ALGORITHM=UNDEFINED 176alias

colonne 87en-tecircte 89table 87

vue 178WHERE 95

ALL 134ALL PRIVILEGES 166alpha 4ALTER

COLUMN 70DATABASE 158FUNCTION 243PROCEDURE 243ROUTINE 234VIEW 188

ALTER TABLEADD 68ADD CONSTRAINT 72ADD INDEX 72ALTER COLUMN 70CHANGE 69DISABLE KEYS 75DROP 70DROP FOREIGN KEY 74DROP PRIMARY KEY 74ENABLE KEYS 77MODIFY 69

Alter_priv 161Alter_routine_priv 162AND 93ANY 134Apache 327API 5AS SELECT 90ASC 89ASCII 96association 24ATAN 99AUTO_INCREMENT 44 196autojointure 125AVG 110AVG_ROW_LENGTH 196

4055_12_Indexfm Page 387 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

388

copy Eacuteditions Eyrolles

B

batch 13BEFORE 265beforeFirst 304begin 210beta 4BETWEEN 93BIGINT 27BIN 100BINARY 27BINARY() 21 106BIT 27 40BIT_LENGTH 101BLOB 29block label 214BOOL 27BOOLEAN 27

C

CallableStatement 318cancelRowUpdates 308CASCADE 34CASCADED 176CASE 218casse 20 211CAST 106CATALOG_NAME 195CEIL 99CHAR 26CHAR() 96CHARACTER SET 156CHARACTER_OCTET_LENGTH 197CHARACTER_SET_NAME 198CHECK 24 273CHECK_OPTION 193ClassforName 295CLASSPATH 292cleacute

candidate 3eacutetrangegravere 3primaire 3

client-serveur 209CLOSE 245

COLLATE 156COLLATION_NAME 198colonne 2COLUMN_COMMENT 198COLUMN_DEFAULT 197COLUMN_KEY 197COLUMN_NAME 197 203Column_name 168Column_priv 159 168COLUMN_PRIVILEGES 194 203COLUMNS 194 196COMMENT 20 235commentaire 212

MySQL 21COMMIT 228comparaisons 106CONCAT 89 96concateacutenation 89Connection 295CONSTRAINT_NAME 199CONSTRAINT_SCHEMA 198CONSTRAINT_TYPE 199CONTAINS SQL 235CONTINUE 249contrainte 23

CHECK 24FOREIGN KEY 24in-line 23out-of-line 23PRIMARY KEY 23reacutefeacuterentielle 56UNIQUE 23

conventions 24conversions 105CONVERT 106COS 99COT 99COUNT 110CREATE 19

DATABASE 156FUNCTION 235INDEX 32ROUTINE 234SCHEMA 156

4055_12_Indexfm Page 388 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

389

Index Apprendre SQL avec MySQL

TABLE 19TRIGGER 263USER 153VIEW 176

Create_priv 161Create_routine_priv 162CREATE_TIME 195Create_tmp_table_priv 163Create_user_priv 161Create_view_priv 161CREATED 201 273createStatement 295CROSS JOIN 141CURDATE 101CURRENT_DATE 44 101CURRENT_TIME 44CURRENT_TIMESTAMP 44 101CURRENT_USER() 187curseur 244CURSOR 245CURTIME 188

D

data dictionary 190Data Source Name 294DATA_LENGTH 196DATA_TYPE 197database 6 13 155DatabaseMetaData 314DATE 28 42DATE() 101DATE_ADD 51 101DATE_FORMAT 53 101 188DATE_SUB 101DATEDIFF 51 101DATETIME 28 42DAY 101DAY_MINUTE 51DAYNAME 101DAYOFMONTH 101DAYOFYEAR 101Db 167DBA 152

DEALLOCATE 279DEC 28DECIMAL 27DECLARE 213

CONDITION 260deacuteclencheur 262DEFAULT 20 38 213DEFAULT() 108DEFAULT_CHARACTER_SET_NAME 195DEFAULT_COLLATION_NAME 195DEFINER 201definer 201DEGREES 99DELAYED 37DELETE 54Delete_priv 160deleteRow 308delimiter 15 20DESC 89DESCRIBE 29DETERMINISTIC 235dictionnaire des donneacutees 190DISABLE KEYS 75DISTINCT 87DISTINCTROW 87division 142DO 279DOUBLE 27DOUBLE PRECISION 28DriverManager 293DROP 70

FOREIGN KEY 74PRIMARY KEY 74TABLE 33TRIGGER 278USER 155VIEW 189

Drop_priv 161

E

ELSEIF 218ENABLE KEYS 77END 210

4055_12_Indexfm Page 389 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

390

copy Eacuteditions Eyrolles

ENGINE 196ENUM 29 40 107equals 309eacutequijointure 123ERROR

1045 1541046 2501048 391054 951062 39 49 2851172 223 2521263 491265 40 411288 1791303 2431326 2451363 2701369 181 1871394 1821395 1831422 2751424 2421442 2771451 55 611452 39 49 59 285

eacutetiquette 214EVENT_MANIPULATION 272EVENT_OBJECT_CATALOG 273EVENT_OBJECT_SCHEMA 272EVENT_OBJECT_TABLE 272exception 248

JDBC 322EXECUTE 239 279execute 297 316 319Execute_priv 162executeQuery 297 319executeUpdate 297 316 319EXISTS 139EXIT 249exit 15EXP 100expression 88EXTRACT 53 102

F

FALSE 218FETCH 245FIELD 96FIELDS

ENCLOSED BY 63 146ESCAPED BY 63 146TERMINATED BY 63 146

FILE 146File_priv 163first 304FIXED 28FLOAT 27FLOOR 100FLUSH PRIVILEGES 154fonction catalogueacutee 233FOR EACH ROW 265FOR UPDATE 247FOREIGN KEY 56FORMAT 108FROM 85FROM_DAYS 53 102FROM_UNIXTIME 102FULL OUTER JOIN 131

G

gamma 4GET_FORMAT 53getClass 300getColumnCount 313getColumnName 313getColumns 314getColumnType 313getColumnTypeName 313getConcurrency 308getConnection 297getDatabaseProductName 314getDatabaseProductVersion 314getErrorCode 322getFetchDirection 304getGeneratedKeys 312getMessage 322getMetaData 302

4055_12_Indexfm Page 390 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

391

Index Apprendre SQL avec MySQL

getName 300getNextException 322getObject 300getPrecision 313getResultSetConcurrency 308getResultSetType 308getSavepointId 321getSavepointName 321getScale 313getSchemaName 313getSQLState 322getTableName 313getTables 315getter methods 297getType 308getUpdateCount 297getUserName 315GOTO 222GRANT 164

OPTION 164 165Grant_priv 161GRANTEE 202Grantor 168 169GREATEST 108GROUP BY 109GROUP_CONCAT 110

H

HANDLER 249handler 248HAVING 109help 13HEX 101host 7 13HOUR 102html 13 145

I

identificateur 212IDENTIFIED BY 153IF 217

EXISTS 34 158 189NOT EXISTS 19 156

IFNULL 109IGNORE 47 54 63IN 94 134index 30

B-tree 32FULLTEXT 32SPATIAL 32UNIQUE 32

Index_priv 161ineacutequijointure 127INFORMATION_SCHEMA 190INNER JOIN 124InnoDB 20INOUT 237INSERT 37INSERT() 96Insert_priv 160insertRow 308instead of 179INSTR 96INT 28INTEGER 27inteacutegriteacute reacuteferentielle 56INTO OUTFILE 146invoker 201IS NULL 94 214IS_GRANTABLE 202IS_NULLABLE 197isAfterLast 304isBeforeFirst 304isFirst 304isLast 304isNullable 313ITERATE 221

J

JCreator 293JDBC 289JOIN 124jointure 121

eacutequi join 123externe 128inner join 123

4055_12_Indexfm Page 391 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

392

copy Eacuteditions Eyrolles

mixte 136naturelle 140outer join 128proceacutedurale 132relationnelle 122self join 125SQL2 122

K

key preserved 184KEY_COLUMN_USAGE 194 199

L

LANGUAGE SQL 234last 304LAST_ALTERED 201LAST_DAY 102LAST_INSERT_ID() 44LEAST 109LEAVE 221LEFT 97LENGTH 97LIKE 94LIMIT 48 54 90LINES 63 146LMD 37LN 100LOAD DATA INFILE 62LOB (Large Object Binary) 2LOCAL 176localhost 154LOCALTIME 102LOCALTIMESTAMP 102LOCATE 97Lock_tables_priv 163LOG 100LONGBLOB 29LONGTEXT 27LOOP 221LOW_PRIORITY 37 47 54LOWER 97lower_case_table_names 21

LPAD 97LTRIM 99

M

MAKEDATE 102MAKETIME 102MAX 110max_connections 162MAX_CONNECTIONS_PER_HOUR 165MAX_QUERIES_PER_HOUR 165max_questions 162max_updates 162MAX_UPDATES_PER_HOUR 165MAX_USER_CONNECTIONS 165max_user_connections 162MEDIUMBLOB 29MEDIUMINT 27MEDIUMTEXT 27MEMORY 20metadata 190MICROSECOND 102MIN 110MINUTE 102MOD 100MODIFIES SQL DATA 235MODIFY 69MONTH 102MONTHNAME 102moveToCurrentRow 308moveToInsertRow 308msqli_prepare 330mutating tables 277myini 15 21 157MyISAM 20MySQL

sous-programme 233mysql 10MySQL AB 3MySQL Administrator 349MySQL Manager 379MySQL Query Browser 359mysqlcolumns_priv 168mysqldb 159 167

4055_12_Indexfm Page 392 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

393

Index Apprendre SQL avec MySQL

mysqlhost 173mysqlprocs_priv 168mysqltables_priv 168mysqluser 153 159mysql_confh 343mysqli 327MYSQLI_ASSOC 332MYSQLI_BOTH 332mysqli_change_user 330mysqli_close 330mysqli_commit 331mysqli_connect 330mysqli_errno 338mysqli_error 338mysqli_fetch_array 332 333mysqli_fetch_assoc 333 334mysqli_fetch_field 342mysqli_fetch_object 333mysqli_fetch_row 333mysqli_free_result 334mysqli_insert_id 337mysqli_multi_query 339MYSQLI_NUM 332mysqli_num_fields 333 341mysqli_num_rows 334mysqli_query 332mysqli_rollback 331mysqli_select_db 330mysqli_stmt_bind_param 335mysqli_stmt_bind_result 335mysqli_stmt_close 336mysqli_stmt_errno 338mysqli_stmt_error 338mysqli_stmt_execute 330mysqli_stmt_fetch 330 336mysqli_stmt_free_result 333mysqli_stmt_result_metadata 343

N

NATURAL JOIN 140Navicat 374NEW 267next 302

NO SQL 235NOT 92

DETERMINISTIC 235EXISTS 139FOUND 249IN 134NULL 20 23

NOW 28 101 102NULL 20 38NULLIF 109NUMERIC 28NUMERIC_PRECISION 198NUMERIC_SCALE 198

O

OCT 101OCTET_LENGTH 101ODBC 290 294OLD 265ON DELETE

CASCADE 60SET NULL 60

ON UPDATECASCADE 60SET NULL 60

OPEN 245OR 93

REPLACE 176ORDER BY 48 55 89ORDINAL_POSITION 197 199OUTER JOIN 129

P

paquetage 244password 13PASSWORD() 154PERIOD_DIFF 102PHP 327phpMyAdmin 362PI() 99placeholder 279 336POSITION_IN_UNIQUE_CONSTRAINT 199

4055_12_Indexfm Page 393 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

394

copy Eacuteditions Eyrolles

POW 100PREPARE 279prepareCall 295 318prepared statement 278prepareStatement 295 316previous 304privilegravege 158PRIVILEGE_TYPE 202Proc_priv 169proceacutedure catalogueacutee 233Process_priv 163procs_priv 160 168production 4produit carteacutesien 119 141prompt 13 15

Q

QUICK 55quit 15

R

RADIANS 100RAISE 250RAND 100READS SQL DATA 235REAL 28reacutecursiviteacute 241REFERENCED_COLUMN_NAME 200REFERENCED_TABLE_NAME 200REFERENCED_TABLE_SCHEMA 200References_priv 163registerOutParameter 319relative 304releaseSavepoint 321RENAME 67

TO 67USER 154

REPEAT 220Repl_client_priv 163Repl_slave_priv 163REPLACE 54 62 97requecircte 83

RESIGNAL 250RESTRICT 34ResultSet 301ResultSetMetaData 313RETURNS 235REVERSE 98REVOKE 170

ALL PRIVILEGES 171ROLLBACK 228

TO SAVEPOINT 230root 153ROUND 100ROUTINE_COMMENT 201ROUTINE_DEFINITION 201ROUTINE_NAME 201Routine_name 169ROUTINE_SCHEMA 201ROUTINE_TYPE 201Routine_type 169ROUTINES 200row 2row trigger 265RPAD 98RTRIM 98 99

S

Savepoint 321savepoint

JDBC 321MYSQL 230

scheacutema 6SCHEMA_PRIVILEGES 194 202SCHEMATA 194SEC_TO_TIME 52 53 102SECOND 102SECURITY_TYPE 201SELECT 84

fonctions 95SELECT INTO 223Select_priv 160SEQUEL 1seacutequence 44 196

JDBC 311

4055_12_Indexfm Page 394 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

395

Index Apprendre SQL avec MySQL

SERIAL 28SET 29 47 107SET AUTOCOMMIT 228SET FOREIGN_KEY_CHECKS 75 77setAutoCommit 295setFetchDirection 304setMaxRows 297setNull 316setSavepoint 321setter methods 296SHOW 190

COLUMNS 204CREATE DATABASE 204CREATE TABLE 204CREATE VIEW 189DATABASES 204ENGINES 204ERRORS 204 239GRANTS 204GRANTS FOR 165INDEX 204PRIVILEGES 204TABLE STATUS 204TABLES 204TRIGGERS 204

Show_db_priv 161Show_view_priv 161Shutdown_priv 163SIGN 100silent 13SIN 100SINH 100skip-column-names 13SLEEP() 232SMALLINT 27SOUNDEX 98source 15sous-interrogation 133

dans le FROM 137synchroniseacutee 137

sous-programme 210SQL dynamique 278SQL SECURITY 235SQL_PATH 195

SQL2 1SQL3 1SQLEXCEPTION 250SQLException 322SQLSTATE 249SQLWARNING 249SQRT 100Statement 297STATISTICS 194STDDEV 110stored procedures 233stored routines 233STR_TO_DATE 53 102SUBDATE 102SUBSTR 98SUBTIME 102SUM 110SUPER 263 278Super_priv 163supportsSavepoints 315supportsTransactions 315SYSDATE 28 88 102

T

table 2 19dominante 128fils 56key preserved 184pegravere 56subordonneacutee 128TEMPORARY 19

TABLE_COLLATION 196TABLE_COMMENT 196TABLE_CONSTRAINTS 194 198TABLE_NAME 193Table_name 168Table_priv 168TABLE_PRIVILEGES 194 202TABLE_ROWS 196TABLE_SCHEMA 193 202TABLE_TYPE 195TABLES 195tables_priv 159 168

4055_12_Indexfm Page 395 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

396

copy Eacuteditions Eyrolles

TAN 100tee 13 15TEMPORARY 19TEXT 27TIME 28 42 52 53 102TIME_FORMAT 53TIME_TO_SEC 53 103TIMEDIFF 103TIMESTAMP 28 103TIMESTAMPADD 103TIMESTAMPDIF 103TIMESTAMPDIFF 51TINYBLOB 29TINYINT 27TINYTEXT 27TO_DAYS 103TOAD 368transaction 227TRIGGER_CATALOG 273TRIGGER_NAME 272TRIGGER_SCHEMA 272TRIGGERS 272TRIM 99TRUE 218TRUNCATE 55 100

U

UNDO 249UNHEX 101UNION 116

ALL 116UNIX_TIMESTAMP 53 103UNSIGNED 28UNTIL 220UPDATE 47 54Update_priv 160updater methods 297updateRow 308UPPER 99USAGE 164USE 157use 15user 6 13 152

variables 215

USER_PRIVILEGES 194 201user-defined function 277USING 141UTC_DATE 103UTC_TIME 44 103UTC_TIMESTAMP 103

V

VALUES 54VARBINARY 27VARCHAR 26variable

session 215VARIANCE 110verbose 13version 13VERSION() 12vertical 13VIEW_DEFINITION 191VIEWS 194vue 175vue monotable 177

W

wasNull 319WEEKDAY 103WEEKOFYEAR 103WHERE 48 55WHILE 220WITH CHECK OPTION 176

X

xml 13 145

Y

YEAR 28

Z

ZEROFILL 28

4055_12_Indexfm Page 396 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

  • Table des matiegraveres
  • Remerciements
  • Avant-propos
    • Guide de lecture
      • Premiegravere partie SQL de base
      • Deuxiegraveme partie programmation proceacutedurale
      • Troisiegraveme partie langages et outils
      • Annexe
        • Typographie
        • Contact avec lrsquoauteur ndash Corrigeacutes des exercices
          • Introduction
            • SQL une norme un succegraves
            • Modegravele de donneacutees
              • Tables et donneacutees
              • Les cleacutes
                • MySQL
                  • Un peu drsquohistoire
                  • Offre du moment
                  • Licences
                  • Et la concurrence
                  • Notion de scheacutema (database)
                  • Notion drsquohocircte
                  • Aspects eacutetudieacutes
                    • Mise en oeuvre de MySQL (sous Windows)
                      • Installation
                      • Deacutesinstallation
                      • Reconfiguration
                        • Premiers pas
                          • Lrsquointerface de commande
                          • Creacuteation drsquoun utilisateur
                          • Connexion au serveur
                          • Veacuterification de la version
                          • Options de base
                          • Batch
                          • Votre prompt et vite
                          • Commandes de base
                              • Partie I SQL de base
                                • Chapitre 1 Deacutefinition des donneacutees
                                  • Tables relationnelles
                                    • Creacuteation drsquoune table (CREATE TABLE)
                                    • Deacutelimiteurs
                                    • Sensibiliteacute agrave la casse
                                    • Commentaires
                                    • Premier exemple
                                    • Contraintes
                                    • Conventions recommandeacutees
                                    • Types des colonnes
                                    • Structure drsquoune table (DESCRIBE)
                                    • Restrictions
                                      • Index
                                        • Arbres balanceacutes
                                        • Creacuteation drsquoun index (CREATE INDEX)
                                        • Bilan
                                          • Destruction drsquoun scheacutema
                                            • Suppression drsquoune table (DROP TABLE)
                                            • Ordre des suppressions
                                              • Exercices
                                                • Chapitre 2 Manipulation des donneacutees
                                                  • Insertions drsquoenregistrements (INSERT)
                                                    • Syntaxe
                                                    • Renseigner toutes les colonnes
                                                    • Renseigner certaines colonnes
                                                    • Plusieurs enregistrements
                                                    • Ne pas respecter des contraintes
                                                    • Donneacutees binaires
                                                    • Eacutenumeacuterations
                                                    • Dates et heures
                                                      • Seacutequences
                                                        • Utilisation en tant que cleacute primaire
                                                        • Modification drsquoune seacutequence
                                                        • Utilisation en tant que cleacute eacutetrangegravere
                                                          • Modifications de colonnes
                                                            • Syntaxe (UPDATE)
                                                            • Modification drsquoune colonne
                                                            • Modification de plusieurs colonnes
                                                            • Modification de plusieurs enregistrements
                                                            • Ne pas respecter les contraintes
                                                            • Restrictions
                                                            • Dates et intervalles
                                                              • Remplacement drsquoun enregistrement
                                                              • Suppressions drsquoenregistrements
                                                                • Instruction DELETE
                                                                • Instruction TRUNCATE
                                                                  • Inteacutegriteacute reacutefeacuterentielle
                                                                    • Syntaxe
                                                                    • Coheacuterences assureacutees
                                                                    • Contraintes cocircteacute laquo pegravere raquo
                                                                    • Contraintes cocircteacute laquo fils raquo
                                                                    • Cleacutes composites et nulles
                                                                    • Coheacuterence du fils vers le pegravere
                                                                    • Coheacuterence du pegravere vers le fils
                                                                    • En reacutesumeacute
                                                                      • Insertions agrave partir drsquoun fichier
                                                                      • Exercices
                                                                        • Chapitre 3 Eacutevolution drsquoun scheacutema
                                                                          • Renommer une table (RENAME)
                                                                          • Modifications structurelles (ALTER TABLE)
                                                                            • Ajout de colonnes
                                                                            • Renommer des colonnes
                                                                            • Modifier le type des colonnes
                                                                            • Valeurs par deacutefaut
                                                                            • Supprimer des colonnes
                                                                              • Modifications comportementales
                                                                                • Ajout de contraintes
                                                                                • Suppression de contraintes
                                                                                • Deacutesactivation des contraintes
                                                                                • Reacuteactivation des contraintes
                                                                                • Contraintes diffeacutereacutees
                                                                                  • Exercices
                                                                                    • Chapitre 4 Interrogation des donneacutees
                                                                                      • Geacuteneacuteraliteacutes
                                                                                        • Syntaxe (SELECT)
                                                                                        • Pseudotable
                                                                                          • Projection (eacuteleacutements du SELECT)
                                                                                            • Extraction de toutes les colonnes
                                                                                            • Extraction de certaines colonnes
                                                                                            • Alias
                                                                                            • Duplicatas
                                                                                            • Expressions et valeurs nulles
                                                                                            • Ordonnancement
                                                                                            • Concateacutenation
                                                                                            • Insertion multiligne
                                                                                            • Limitation du nombre de lignes
                                                                                              • Restriction (WHERE)
                                                                                                • Opeacuterateurs de comparaison
                                                                                                • Opeacuterateurs logiques
                                                                                                • Opeacuterateurs inteacutegreacutes
                                                                                                • Alias
                                                                                                  • Fonctions
                                                                                                    • Caractegraveres
                                                                                                    • Numeacuteriques
                                                                                                    • Fonction pour les bits
                                                                                                    • Dates
                                                                                                    • Conversions
                                                                                                    • Comparaisons
                                                                                                    • Eacutenumeacuterations
                                                                                                    • Autres fonctions
                                                                                                      • Regroupements
                                                                                                        • Fonctions de groupe
                                                                                                        • Eacutetude du GROUP BY et HAVING
                                                                                                          • Opeacuterateurs ensemblistes
                                                                                                            • Restrictions
                                                                                                            • Exemple
                                                                                                            • Intersection
                                                                                                            • Opeacuterateurs UNION et UNION ALL
                                                                                                            • Diffeacuterence
                                                                                                            • Ordonner les reacutesultats
                                                                                                            • Produit carteacutesien
                                                                                                            • Bilan
                                                                                                              • Jointures
                                                                                                                • Classification
                                                                                                                • Jointure relationnelle
                                                                                                                • Jointures SQL2
                                                                                                                • Types de jointures
                                                                                                                • Eacutequijointure
                                                                                                                • Autojointure
                                                                                                                • Ineacutequijointure
                                                                                                                • Jointures externes
                                                                                                                • Jointures proceacutedurales
                                                                                                                • Jointures mixtes
                                                                                                                • Sous-interrogations synchroniseacutees
                                                                                                                • Autres directives SQL2
                                                                                                                  • Division
                                                                                                                    • Deacutefinition
                                                                                                                    • Classification
                                                                                                                    • Division inexacte
                                                                                                                    • Division exacte
                                                                                                                      • Reacutesulats en HTML ou XML
                                                                                                                      • Eacutecriture dans un fichier
                                                                                                                      • Exercices
                                                                                                                        • Chapitre 5 Controcircle des donneacutees
                                                                                                                        • Gestion des utilisateurs
                                                                                                                          • Classification
                                                                                                                          • Creacuteation drsquoun utilisateur (CREATE USER)
                                                                                                                          • Modification drsquoun utilisateur
                                                                                                                          • Renommer un utilisateur (RENAME USER)
                                                                                                                          • Suppression drsquoun utilisateur (DROP USER)
                                                                                                                            • Gestion des bases de donneacutees
                                                                                                                              • Creacuteation drsquoune base (CREATE DATABASE)
                                                                                                                              • Seacutelection drsquoune base de donneacutees (USE)
                                                                                                                              • Modification drsquoune base (ALTER DATABASE)
                                                                                                                              • Suppression drsquoune base (DROP DATABASE)
                                                                                                                                • Privilegraveges
                                                                                                                                  • Niveaux de privilegraveges
                                                                                                                                  • Tables de la base mysql
                                                                                                                                  • Table mysqluser
                                                                                                                                  • Attribution de privilegraveges (GRANT)
                                                                                                                                  • Table mysqldb
                                                                                                                                  • Table mysqlhost
                                                                                                                                  • Table mysqltables_priv
                                                                                                                                  • Table mysqlcolumns_priv
                                                                                                                                  • Table mysqlprocs_priv
                                                                                                                                  • Reacutevocation de privilegraveges (REVOKE)
                                                                                                                                  • Attributions et reacutevocations laquo sauvages raquo
                                                                                                                                    • Accegraves distants
                                                                                                                                      • Connexion par lrsquointerface de commande
                                                                                                                                      • Table mysqlhost
                                                                                                                                        • Vues
                                                                                                                                          • Creacuteation drsquoune vue (CREATE VIEW)
                                                                                                                                          • Classification
                                                                                                                                          • Vues monotables
                                                                                                                                          • Vues complexes
                                                                                                                                          • Autres utilisations de vues
                                                                                                                                          • Transmission de droits
                                                                                                                                          • Modification drsquoune vue (ALTER VIEW)
                                                                                                                                          • Visualisation drsquoune vue (SHOW CREATE VIEW)
                                                                                                                                          • Suppression drsquoune vue (DROP VIEW)
                                                                                                                                            • Dictionnaire des donneacutees
                                                                                                                                              • Constitution
                                                                                                                                              • Modegravele graphique du dictionnaire des donneacutees
                                                                                                                                              • Deacutemarche agrave suivre
                                                                                                                                              • Classification des vues
                                                                                                                                              • Bases de donneacutees du serveur
                                                                                                                                              • Composition drsquoune base
                                                                                                                                              • Deacutetail de stockage drsquoune base
                                                                                                                                              • Structure drsquoune table
                                                                                                                                              • Recherche des contraintes drsquoune table
                                                                                                                                              • Composition des contraintes drsquoune table
                                                                                                                                              • Recherche du code source drsquoun sous-programme
                                                                                                                                              • Privilegraveges des utilisateurs drsquoune base de donneacutees
                                                                                                                                              • Commande SHOW
                                                                                                                                                • Exercices
                                                                                                                                                  • Partie II Programmation proceacutedurale
                                                                                                                                                    • Chapitre 6 Bases du langage de programmation
                                                                                                                                                      • Geacuteneacuteraliteacutes
                                                                                                                                                        • Environnement client-serveur
                                                                                                                                                        • Avantages
                                                                                                                                                        • Structure drsquoun bloc
                                                                                                                                                        • Porteacutee des objets
                                                                                                                                                        • Casse et lisibiliteacute
                                                                                                                                                        • Identificateurs
                                                                                                                                                        • Commentaires
                                                                                                                                                          • Variables
                                                                                                                                                            • Variables scalaires
                                                                                                                                                            • Affectations
                                                                                                                                                            • Restrictions
                                                                                                                                                            • Reacutesolution de noms
                                                                                                                                                            • Opeacuterateurs
                                                                                                                                                            • Variables de session
                                                                                                                                                            • Conventions recommandeacutees
                                                                                                                                                              • Test des exemples
                                                                                                                                                              • Structures de controcircle
                                                                                                                                                                • Structures conditionnelles
                                                                                                                                                                • Structures reacutepeacutetitives
                                                                                                                                                                  • Interactions avec la base
                                                                                                                                                                    • Extraire des donneacutees
                                                                                                                                                                    • Manipuler des donneacutees
                                                                                                                                                                      • Transactions
                                                                                                                                                                        • Caracteacuteristiques
                                                                                                                                                                        • Deacutebut et fin drsquoune transaction
                                                                                                                                                                        • Mode de validation
                                                                                                                                                                        • Votre premiegravere transaction
                                                                                                                                                                        • Controcircle des transactions
                                                                                                                                                                        • Transactions imbriqueacutees
                                                                                                                                                                          • Exercices
                                                                                                                                                                            • Chapitre 7 Programmation avanceacutee
                                                                                                                                                                              • Sous-programmes
                                                                                                                                                                                • Geacuteneacuteraliteacutes
                                                                                                                                                                                • Proceacutedures catalogueacutees
                                                                                                                                                                                • Fonctions catalogueacutees
                                                                                                                                                                                • Structure drsquoun sous-programme
                                                                                                                                                                                • Exemples
                                                                                                                                                                                • Fonction nrsquointeragissant pas avec la base
                                                                                                                                                                                • Compilation
                                                                                                                                                                                • Appel drsquoun sous-programme
                                                                                                                                                                                • Reacutecursiviteacute
                                                                                                                                                                                • Sous-programmes imbriqueacutes
                                                                                                                                                                                • Modification drsquoun sous-programme
                                                                                                                                                                                • Destruction drsquoun sous-programme
                                                                                                                                                                                • Restrictions
                                                                                                                                                                                  • Curseurs
                                                                                                                                                                                    • Geacuteneacuteraliteacutes
                                                                                                                                                                                    • Instructions
                                                                                                                                                                                    • Parcours drsquoun curseur
                                                                                                                                                                                    • Accegraves concurrents (FOR UPDATE)
                                                                                                                                                                                    • Restrictions
                                                                                                                                                                                      • Exceptions
                                                                                                                                                                                        • Geacuteneacuteraliteacutes
                                                                                                                                                                                        • Restrictions
                                                                                                                                                                                        • Exceptions avec EXIT
                                                                                                                                                                                        • Exceptions avec CONTINUE
                                                                                                                                                                                        • Gestion des autres erreurs (SQLEXCEPTION)
                                                                                                                                                                                        • Mecircme erreur sur diffeacuterentes instructions
                                                                                                                                                                                        • Exceptions nommeacutees
                                                                                                                                                                                          • Deacuteclencheurs
                                                                                                                                                                                            • Geacuteneacuteraliteacutes
                                                                                                                                                                                            • Agrave quoi sert un deacuteclencheur
                                                                                                                                                                                            • Meacutecanisme geacuteneacuteral
                                                                                                                                                                                            • Syntaxe
                                                                                                                                                                                            • Deacuteclencheurs LMD (de lignes)
                                                                                                                                                                                            • Appel de sous-programmes
                                                                                                                                                                                            • Dictionnaire des donneacutees
                                                                                                                                                                                            • Programmation drsquoune contrainte de veacuterification
                                                                                                                                                                                            • Invalidation dans le deacuteclencheur
                                                                                                                                                                                            • Tables mutantes
                                                                                                                                                                                            • Restrictions
                                                                                                                                                                                            • Suppression drsquoun deacuteclencheur
                                                                                                                                                                                              • SQL dynamique
                                                                                                                                                                                                • Syntaxe
                                                                                                                                                                                                • Exemples
                                                                                                                                                                                                • Restrictions
                                                                                                                                                                                                  • Exercices
                                                                                                                                                                                                      • Partie III Langages et outils
                                                                                                                                                                                                        • Chapitre 8 Utilisation avec Java
                                                                                                                                                                                                          • JDBC avec ConnectorJ
                                                                                                                                                                                                            • Classification des pilotes (drivers)
                                                                                                                                                                                                            • Le paquetage javasql
                                                                                                                                                                                                            • Structure drsquoun programme
                                                                                                                                                                                                            • Test de votre configuration
                                                                                                                                                                                                              • Connexion agrave une base
                                                                                                                                                                                                                • Base Access
                                                                                                                                                                                                                • Base MySQL
                                                                                                                                                                                                                • Interface Connection
                                                                                                                                                                                                                  • Eacutetats drsquoune connexion
                                                                                                                                                                                                                    • Interfaces disponibles
                                                                                                                                                                                                                    • Meacutethodes geacuteneacuteriques pour les paramegravetres
                                                                                                                                                                                                                    • Eacutetats simples (interface Statement)
                                                                                                                                                                                                                    • Meacutethodes agrave utiliser
                                                                                                                                                                                                                      • Correspondances de types
                                                                                                                                                                                                                      • Manipulations avec la base
                                                                                                                                                                                                                        • Suppression de donneacutees
                                                                                                                                                                                                                        • Ajout drsquoenregistrements
                                                                                                                                                                                                                        • Modification drsquoenregistrements
                                                                                                                                                                                                                          • Extraction de donneacutees
                                                                                                                                                                                                                            • Curseurs statiques
                                                                                                                                                                                                                            • Curseurs navigables
                                                                                                                                                                                                                              • Curseurs modifiables
                                                                                                                                                                                                                                • Suppressions
                                                                                                                                                                                                                                • Modifications
                                                                                                                                                                                                                                • Insertions
                                                                                                                                                                                                                                  • Gestion des seacutequences
                                                                                                                                                                                                                                    • Meacutethode getGeneratedKeys
                                                                                                                                                                                                                                    • Curseur modifiable
                                                                                                                                                                                                                                      • Interface ResultSetMetaData
                                                                                                                                                                                                                                      • Interface DatabaseMetaData
                                                                                                                                                                                                                                      • Instructions parameacutetreacutees (PreparedStatement)
                                                                                                                                                                                                                                        • Extraction de donneacutees (executeQuery)
                                                                                                                                                                                                                                        • Mises agrave jour (executeUpdate)
                                                                                                                                                                                                                                        • Instruction LDD (execute)
                                                                                                                                                                                                                                          • Proceacutedures catalogueacutees
                                                                                                                                                                                                                                            • Exemple
                                                                                                                                                                                                                                              • Transactions
                                                                                                                                                                                                                                                • Points de validation
                                                                                                                                                                                                                                                  • Traitement des exceptions
                                                                                                                                                                                                                                                    • Affichage des erreurs
                                                                                                                                                                                                                                                    • Traitement des erreurs
                                                                                                                                                                                                                                                      • Exercices
                                                                                                                                                                                                                                                        • Chapitre 9 Utilisation avec PHP
                                                                                                                                                                                                                                                          • Configuration adopteacutee
                                                                                                                                                                                                                                                            • Logiciels
                                                                                                                                                                                                                                                            • Fichiers de configuration
                                                                                                                                                                                                                                                            • Test drsquoApache et de PHP
                                                                                                                                                                                                                                                            • Test drsquoApache de PHP et de MySQL
                                                                                                                                                                                                                                                              • API de PHP pour MySQL
                                                                                                                                                                                                                                                                • Connexion
                                                                                                                                                                                                                                                                • Interactions avec la base
                                                                                                                                                                                                                                                                • Extractions
                                                                                                                                                                                                                                                                • Instructions parameacutetreacutees
                                                                                                                                                                                                                                                                • Gestion des seacutequences
                                                                                                                                                                                                                                                                • Traitement des erreurs
                                                                                                                                                                                                                                                                • Proceacutedures catalogueacutees
                                                                                                                                                                                                                                                                • Meacutetadonneacutees
                                                                                                                                                                                                                                                                  • Exercices
                                                                                                                                                                                                                                                                    • Chapitre 10 Outils graphiques
                                                                                                                                                                                                                                                                      • MySQL Administrator
                                                                                                                                                                                                                                                                        • Connexion
                                                                                                                                                                                                                                                                        • Connexion nommeacutee
                                                                                                                                                                                                                                                                        • Liste des accegraves utilisateur
                                                                                                                                                                                                                                                                        • Gestion des privilegraveges
                                                                                                                                                                                                                                                                        • Caracteacuteristiques systegraveme
                                                                                                                                                                                                                                                                        • Options scripts SQL
                                                                                                                                                                                                                                                                        • Composition drsquoune base
                                                                                                                                                                                                                                                                        • Composition drsquoune table
                                                                                                                                                                                                                                                                        • Composition des index
                                                                                                                                                                                                                                                                        • Modification drsquoun scheacutema
                                                                                                                                                                                                                                                                        • Restriction
                                                                                                                                                                                                                                                                          • MySQL Query Browser
                                                                                                                                                                                                                                                                            • Fenecirctre principale
                                                                                                                                                                                                                                                                            • Extraction
                                                                                                                                                                                                                                                                            • Modification
                                                                                                                                                                                                                                                                              • phpMyAdmin
                                                                                                                                                                                                                                                                                • Composition de la base
                                                                                                                                                                                                                                                                                • Structure drsquoune table
                                                                                                                                                                                                                                                                                • Administrer une table
                                                                                                                                                                                                                                                                                • Extractions
                                                                                                                                                                                                                                                                                • Rechercher
                                                                                                                                                                                                                                                                                • Exporter
                                                                                                                                                                                                                                                                                • Utilisateurs
                                                                                                                                                                                                                                                                                  • TOAD for MySQL
                                                                                                                                                                                                                                                                                    • Administration
                                                                                                                                                                                                                                                                                    • Instructions en ligne
                                                                                                                                                                                                                                                                                    • Deacuteveloppement
                                                                                                                                                                                                                                                                                    • Creacuteation drsquoobjets
                                                                                                                                                                                                                                                                                    • Recherche drsquoobjets
                                                                                                                                                                                                                                                                                    • Exportations
                                                                                                                                                                                                                                                                                      • Navicat
                                                                                                                                                                                                                                                                                        • Creacuteation drsquoune table
                                                                                                                                                                                                                                                                                        • Deacutefinition drsquoune contrainte
                                                                                                                                                                                                                                                                                        • Creacuteation drsquoune requecircte
                                                                                                                                                                                                                                                                                        • Importation
                                                                                                                                                                                                                                                                                        • Gestion des utilisateurs
                                                                                                                                                                                                                                                                                          • MySQL Manager
                                                                                                                                                                                                                                                                                            • Creacuteation drsquoune table
                                                                                                                                                                                                                                                                                            • Creacuteation drsquoune requecircte
                                                                                                                                                                                                                                                                                            • Proceacutedures catalogueacutees
                                                                                                                                                                                                                                                                                            • Gestion des utilisateurs
                                                                                                                                                                                                                                                                                            • Gestion des privilegraveges
                                                                                                                                                                                                                                                                                              • Bilan
                                                                                                                                                                                                                                                                                                  • Annexe Bibliographie et webographie
                                                                                                                                                                                                                                                                                                  • Index
Page 3: CHEZ LE MÊME ÉDITEUR

Pour Aureacutelia mon chat aux yeux si bleus si verts si gris

Pour Reneacute et Lydie Jean et Denise qui sont devenus mes parents

4055_00a_Dedi Page V Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

4055_00a_Dedi Page VI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

VII

Table des matiegraveres

Remerciements XVII

Avant-propos XIX

Guide de lecture

XXPremiegravere partie SQL de base XXDeuxiegraveme partie programmation proceacutedurale XXTroisiegraveme partie langages et outils XXAnnexe XX

Typographie

XXI

Contact avec lrsquoauteur ndash Corrigeacutes des exercices

XXII

Introduction 1

SQL une norme un succegraves

1

Modegravele de donneacutees

2Tables et donneacutees 2Les cleacutes 3

MySQL

3Un peu drsquohistoire 4Offre du moment 5Licences 6Et la concurrence 6Notion de scheacutema (database) 6Notion drsquohocircte 7Aspects eacutetudieacutes 8

Mise en œuvre de MySQL (sous Windows)

9Installation 9Deacutesinstallation 10Reconfiguration 10

Premiers pas

10Lrsquointerface de commande 10Creacuteation drsquoun utilisateur 11Connexion au serveur 12Veacuterification de la version 12Options de base 13Batch 14Votre prompt et vite 14Commandes de base 15

4055_00b_TDMfm Page VII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

VIII

copy Eacuteditions Eyrolles

Partie I SQL de base 17

1 Deacutefinition des donneacutees 19

Tables relationnelles

19Creacuteation drsquoune table (

CREATE TABLE

) 19Deacutelimiteurs 20Sensibiliteacute agrave la casse 20Commentaires 21Premier exemple 22Contraintes 23Conventions recommandeacutees 24Types des colonnes 26Structure drsquoune table (

DESCRIBE

) 29Restrictions 30

Index

30Arbres balanceacutes 31Creacuteation drsquoun index (

CREATE INDEX

) 32Bilan 33

Destruction drsquoun scheacutema

33Suppression drsquoune table (

DROP TABLE

) 33Ordre des suppressions 34

Exercices

35

2 Manipulation des donneacutees 37

Insertions drsquoenregistrements (

INSERT

)

37Syntaxe 37Renseigner toutes les colonnes 38Renseigner certaines colonnes 38Plusieurs enregistrements 39Ne pas respecter des contraintes 39Donneacutees binaires 40Eacutenumeacuterations 40Dates et heures 41

Seacutequences

44Utilisation en tant que cleacute primaire 44Modification drsquoune seacutequence 45Utilisation en tant que cleacute eacutetrangegravere 46

Modifications de colonnes

47Syntaxe (

UPDATE

) 47Modification drsquoune colonne 48Modification de plusieurs colonnes 48Modification de plusieurs enregistrements 48Ne pas respecter les contraintes 48

4055_00b_TDMfm Page VIII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

IX

Table des matiegraveres Apprendre SQL avec MySQL

Restrictions 50Dates et intervalles 50

Remplacement drsquoun enregistrement

54

Suppressions drsquoenregistrements

54Instruction

DELETE

54Instruction

TRUNCATE

55

Inteacutegriteacute reacutefeacuterentielle

56Syntaxe 56Coheacuterences assureacutees 56Contraintes cocircteacute laquo pegravere raquo 57Contraintes cocircteacute laquo fils raquo 58Cleacutes composites et nulles 58Coheacuterence du fils vers le pegravere 59Coheacuterence du pegravere vers le fils 60En reacutesumeacute 62

Insertions agrave partir drsquoun fichier

62

Exercices

64

3 Eacutevolution drsquoun scheacutema 67

Renommer une table (

RENAME

)

67

Modifications structurelles (

ALTER TABLE

)

68Ajout de colonnes 68Renommer des colonnes 69Modifier le type des colonnes 69Valeurs par deacutefaut 70Supprimer des colonnes 70

Modifications comportementales

71Ajout de contraintes 71Suppression de contraintes 73Deacutesactivation des contraintes 75Reacuteactivation des contraintes 77Contraintes diffeacutereacutees 79

Exercices

80

4 Interrogation des donneacutees 83

Geacuteneacuteraliteacutes

83Syntaxe (

SELECT

) 84Pseudotable 84

Projection (eacuteleacutements du

SELECT

)

85Extraction de toutes les colonnes 86Extraction de certaines colonnes 86Alias 87Duplicatas 87

4055_00b_TDMfm Page IX Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

X

copy Eacuteditions Eyrolles

Expressions et valeurs nulles 88Ordonnancement 89Concateacutenation 89Insertion multiligne 90Limitation du nombre de lignes 90

Restriction (

WHERE

)

91Opeacuterateurs de comparaison 92Opeacuterateurs logiques 93Opeacuterateurs inteacutegreacutes 93Alias 95

Fonctions

95Caractegraveres 95Numeacuteriques 99Fonction pour les bits 100Dates 101Conversions 105Comparaisons 106Eacutenumeacuterations 107Autres fonctions 108

Regroupements

109Fonctions de groupe 110Eacutetude du

GROUP BY

et

HAVING

111

Opeacuterateurs ensemblistes

114Restrictions 114Exemple 115Intersection 115Opeacuterateurs

UNION

et

UNION ALL

116Diffeacuterence 117Ordonner les reacutesultats 118Produit carteacutesien 119Bilan 120

Jointures

121Classification 121Jointure relationnelle 122Jointures SQL2 122Types de jointures 123Eacutequijointure 123Autojointure 125Ineacutequijointure 127Jointures externes 128Jointures proceacutedurales 132Jointures mixtes 136Sous-interrogations synchroniseacutees 137Autres directives SQL2 140

4055_00b_TDMfm Page X Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XI

Table des matiegraveres Apprendre SQL avec MySQL

Division

142Deacutefinition 143Classification 143Division inexacte 144Division exacte 144

Reacutesulats en HTML ou XML

145

Eacutecriture dans un fichier

146

Exercices

147

5 Controcircle des donneacutees 151

Gestion des utilisateurs

152Classification 152Creacuteation drsquoun utilisateur (

CREATE USER

) 152Modification drsquoun utilisateur 154Renommer un utilisateur (

RENAME USER

) 154Suppression drsquoun utilisateur (

DROP USER

) 155

Gestion des bases de donneacutees

155Creacuteation drsquoune base (

CREATE DATABASE

) 156Seacutelection drsquoune base de donneacutees (

USE

) 157Modification drsquoune base (

ALTER DATABASE

) 158Suppression drsquoune base (

DROP DATABASE

) 158

Privilegraveges

158Niveaux de privilegraveges 159Tables de la base

mysql

159Table

mysqluser

160Attribution de privilegraveges (

GRANT

) 163Table

mysqldb

167Table

mysqlhost

167Table

mysqltables_priv

168Table

mysqlcolumns_priv

168Table

mysqlprocs_priv

168Reacutevocation de privilegraveges (

REVOKE

) 170Attributions et reacutevocations laquo sauvages raquo 172

Accegraves distants

172Connexion par lrsquointerface de commande 173Table

mysqlhost

173

Vues

175Creacuteation drsquoune vue (

CREATE VIEW

) 176Classification 177Vues monotables 177Vues complexes 181Autres utilisations de vues 185Transmission de droits 188Modification drsquoune vue (

ALTER VIEW

) 188

4055_00b_TDMfm Page XI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

XII

copy Eacuteditions Eyrolles

Visualisation drsquoune vue (

SHOW CREATE VIEW

) 189Suppression drsquoune vue (

DROP VIEW

) 189

Dictionnaire des donneacutees

190Constitution 190Modegravele graphique du dictionnaire des donneacutees 191Deacutemarche agrave suivre 191Classification des vues 193Bases de donneacutees du serveur 194Composition drsquoune base 195Deacutetail de stockage drsquoune base 195Structure drsquoune table 196Recherche des contraintes drsquoune table 198Composition des contraintes drsquoune table 199Recherche du code source drsquoun sous-programme 200Privilegraveges des utilisateurs drsquoune base de donneacutees 201Commande

SHOW

203

Exercices

205

Partie II Programmation proceacutedurale 207

6 Bases du langage de programmation 209Geacuteneacuteraliteacutes 209

Environnement client-serveur 209Avantages 210Structure drsquoun bloc 210Porteacutee des objets 211Casse et lisibiliteacute 211Identificateurs 212Commentaires 212

Variables 212Variables scalaires 213Affectations 213Restrictions 213Reacutesolution de noms 214Opeacuterateurs 214Variables de session 215Conventions recommandeacutees 215

Test des exemples 216Structures de controcircle 217

Structures conditionnelles 217Structures reacutepeacutetitives 219

Interactions avec la base 222Extraire des donneacutees 223Manipuler des donneacutees 224

4055_00b_TDMfm Page XII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles XIII

Table des matiegraveres Apprendre SQL avec MySQL

Transactions 227Caracteacuteristiques 227Deacutebut et fin drsquoune transaction 228Mode de validation 228Votre premiegravere transaction 228Controcircle des transactions 229Transactions imbriqueacutees 230

Exercices 231

7 Programmation avanceacutee 233

Sous-programmes 233Geacuteneacuteraliteacutes 233Proceacutedures catalogueacutees 234Fonctions catalogueacutees 235Structure drsquoun sous-programme 236Exemples 236Fonction nrsquointeragissant pas avec la base 238Compilation 239Appel drsquoun sous-programme 239Reacutecursiviteacute 241Sous-programmes imbriqueacutes 242Modification drsquoun sous-programme 243Destruction drsquoun sous-programme 243Restrictions 244

Curseurs 244Geacuteneacuteraliteacutes 244Instructions 245Parcours drsquoun curseur 246Accegraves concurrents (FOR UPDATE) 247Restrictions 248

Exceptions 248Geacuteneacuteraliteacutes 248Restrictions 250Exceptions avec EXIT 250Exceptions avec CONTINUE 254Gestion des autres erreurs (SQLEXCEPTION) 255Mecircme erreur sur diffeacuterentes instructions 257Exceptions nommeacutees 260

Deacuteclencheurs 262Geacuteneacuteraliteacutes 262Agrave quoi sert un deacuteclencheur 262Meacutecanisme geacuteneacuteral 263Syntaxe 263Deacuteclencheurs LMD (de lignes) 264

4055_00b_TDMfm Page XIII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

XIV copy Eacuteditions Eyrolles

Appel de sous-programmes 271Dictionnaire des donneacutees 272Programmation drsquoune contrainte de veacuterification 273Invalidation dans le deacuteclencheur 275Tables mutantes 277Restrictions 278Suppression drsquoun deacuteclencheur 278

SQL dynamique 278Syntaxe 279Exemples 280Restrictions 281

Exercices 284

Partie III Langages et outils 287

8 Utilisation avec Java 289

JDBC avec ConnectorJ 289Classification des pilotes (drivers) 290Le paquetage javasql 291Structure drsquoun programme 291Test de votre configuration 292

Connexion agrave une base 293Base Access 294Base MySQL 295Interface Connection 295

Eacutetats drsquoune connexion 296Interfaces disponibles 296Meacutethodes geacuteneacuteriques pour les paramegravetres 296Eacutetats simples (interface Statement) 297Meacutethodes agrave utiliser 298

Correspondances de types 298Manipulations avec la base 300

Suppression de donneacutees 300Ajout drsquoenregistrements 301Modification drsquoenregistrements 301

Extraction de donneacutees 301Curseurs statiques 302Curseurs navigables 303

Curseurs modifiables 307Suppressions 309Modifications 310Insertions 310

4055_00b_TDMfm Page XIV Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles XV

Table des matiegraveres Apprendre SQL avec MySQL

Gestion des seacutequences 311Meacutethode getGeneratedKeys 312Curseur modifiable 312

Interface ResultSetMetaData 313Interface DatabaseMetaData 314Instructions parameacutetreacutees (PreparedStatement) 316

Extraction de donneacutees (executeQuery) 316Mises agrave jour (executeUpdate) 317Instruction LDD (execute) 317

Proceacutedures catalogueacutees 318Exemple 319

Transactions 320Points de validation 321

Traitement des exceptions 322Affichage des erreurs 323Traitement des erreurs 323

Exercices 325

9 Utilisation avec PHP 327Configuration adopteacutee 327

Logiciels 327Fichiers de configuration 327Test drsquoApache et de PHP 328Test drsquoApache de PHP et de MySQL 329

API de PHP pour MySQL 329Connexion 330Interactions avec la base 330Extractions 332Instructions parameacutetreacutees 335Gestion des seacutequences 337Traitement des erreurs 337Proceacutedures catalogueacutees 339Meacutetadonneacutees 340

Exercices 344

10 Outils graphiques 349MySQL Administrator 349

Connexion 349Connexion nommeacutee 350Liste des accegraves utilisateur 351Gestion des privilegraveges 351Caracteacuteristiques systegraveme 352Options scripts SQL 353Composition drsquoune base 354

4055_00b_TDMfm Page XV Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Table des matiegraveres

XVI copy Eacuteditions Eyrolles

Composition drsquoune table 355Composition des index 356Modification drsquoun scheacutema 356Restriction 358

MySQL Query Browser 359Fenecirctre principale 359Extraction 360Modification 361

phpMyAdmin 362Composition de la base 363Structure drsquoune table 364Administrer une table 364Extractions 365Rechercher 366Exporter 367Utilisateurs 368

TOAD for MySQL 368Administration 369Instructions en ligne 370Deacuteveloppement 371Creacuteation drsquoobjets 371Recherche drsquoobjets 373Exportations 374

Navicat 374Creacuteation drsquoune table 375Deacutefinition drsquoune contrainte 376Creacuteation drsquoune requecircte 377Importation 378Gestion des utilisateurs 378

MySQL Manager 379Creacuteation drsquoune table 380Creacuteation drsquoune requecircte 382Proceacutedures catalogueacutees 382Gestion des utilisateurs 383Gestion des privilegraveges 383

Bilan 384

Annexe bibliographie et webographie 385

Index 387

4055_00b_TDMfm Page XVI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XVII

Remerciements

Je nrsquoai que deux personnes agrave remercier Il srsquoagit de deux jeunes informaticiens rencontreacutes auhasard drsquoun forum Ils sont talentueux et deacutesinteacuteresseacutes ce qui devient tellement rare dans cemonde drsquoindividualisme exacerbeacute Le premier recherchait un emploi agrave la peacuteriode de la reacutedac-tion souhaitons qursquoil trouve clavier agrave ses mains Le second dirige la rubrique MySQL du siteDeveloppezcom

Merci Pierre Caboche pour la lecture de la premiegravere moitieacute de lrsquoouvrage pour tes remarquesque jrsquoai (presque) toutes prises en compte pour les compleacutements en ligne agrave propos des opeacutera-teurs ensemblistes dans les requecirctes

Merci Guillaume Lebur pour tous tes commentaires de qualiteacute et pour tes corrections agravepropos de la programmation sous MySQL Merci pour ton activiteacute et tes tutoriels mis en lignesur le site de Developpezcom

4055_00c_Lim Page XVII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

4055_00c_Lim Page XVIII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XIX

Avant-propos

Nombre drsquoouvrages traitent de SQL et de MySQL certains reacutesultent drsquoune traduction hasar-deuse et sans vocation peacutedagogique drsquoautres ressemblent agrave des Bottin teacuteleacutephoniques ouproviennent de la traduction de la documentation officielle en moins bien Les survivants nesont peut-ecirctre plus vraiment agrave jour

Ce livre a eacuteteacute reacutedigeacute avec une volonteacute de concision et de progression dans sa deacutemarche il estillustreacute par ailleurs de nombreux exemples et figures Bien que la source principale drsquoinforma-tions fucirct la documentation officielle de MySQL (httpdevmysqlcomdoc) lrsquoouvrage neconstitue pas un condenseacute de commandes SQL Chaque notion importante est introduite parun exemple simple et que jrsquoespegravere deacutemonstratif En fin de chaque chapitre des exercices vouspermettront de tester vos connaissances

La documentation en ligne de MySQL (

MySQL 5 Reference Manual

) repreacutesente une dizainede meacutegaoctets au format HTML Tous les concepts srsquoy trouvant ne pourraient pas ecirctre icideacutecemment expliqueacutes sauf peut-ecirctre si cet ouvrage ressemblait agrave un annuaire Jrsquoai tenteacute drsquoenextraire seulement les aspects fondamentaux sous la forme drsquoune synthegravese

Vous nrsquoy trouverez donc pas des consideacuterations agrave propos drsquoaspects avanceacutes du langage ou duserveur comme lrsquooptimisation de requecirctes la restauration drsquoune base la reacuteplication la versiondu serveur agrave partir de laquelle telle ou telle fonction est apparue etc

Ce livre reacutesulte de mon expeacuterience de lrsquoenseignement dans le domaine des bases de donneacuteesen premier deuxiegraveme et troisiegraveme cycles universitaires dans des cursus drsquoinformatique agravevocation professionnelle (IUT licences et masters professionnels)

Cet ouvrage srsquoadresse principalement aux novices deacutesireux de deacutecouvrir SQL en program-mant sous MySQL

Les eacutetudiants et enseignants trouveront des exemples peacutedagogiques pour chaque conceptabordeacute ainsi que des exercices theacutematiques

Les deacuteveloppeurs PHP ou Java deacutecouvriront des moyens de stocker leurs donneacutees

4055_00c_Lim Page XIX Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

XX

copy Eacuteditions Eyrolles

Guide de lecture

Ce livre srsquoorganise autour de trois parties distinctes mais compleacutementaires La premiegravere inteacute-ressera le lecteur deacutebutant en la matiegravere car elle concerne les instructions SQL et les notionsde base de MySQL La deuxiegraveme partie deacutecrit la programmation avec le langage proceacuteduralde MySQL La troisiegraveme partie attirera lrsquoattention des programmeurs qui envisagent drsquoutiliserMySQL agrave lrsquoaide drsquooutils natifs ou tout en programmant avec des langages eacutevolueacutes ou via desinterfaces Web (PHP ou Java)

Premiegravere partie SQL de base

Cette partie preacutesente les diffeacuterents aspects du langage SQL de MySQL en eacutetudiant en deacutetailles instructions de base Agrave partir drsquoexemples jrsquoexplique notamment comment deacuteclarer mani-puler faire eacutevoluer et interroger des tables avec leurs diffeacuterentes caracteacuteristiques et leurseacuteleacutements associeacutes (contraintes index vues seacutequences) Nous eacutetudions aussi SQL dans uncontexte multi-utilisateur (droits drsquoaccegraves) et au niveau du dictionnaire de donneacutees

Deuxiegraveme partie programmation proceacutedurale

Cette partie deacutecrit les caracteacuteristiques du langage proceacutedural de MySQL Le chapitre 6 traitedes eacuteleacutements de base (structure drsquoun programme variables structures de controcircle interactionsavec la base et transactions) Le chapitre 7 traite des sous-programmes des curseurs de lagestion des exceptions des deacuteclencheurs et de lrsquoutilisation du SQL dynamique

Troisiegraveme partie langages et outils

Cette partie inteacuteressera les programmeurs qui envisagent drsquoexploiter une base MySQL enutilisant un langage de programmation Le chapitre 8 deacutetaille lrsquoAPI JDBC 30 qui permet demanipuler une base MySQL 5 par lrsquointermeacutediaire drsquoun programme Java Le chapitre 9 deacutecritles principales fonctions de lrsquoAPI

mysqli

qui permet drsquointerfacer un programme PHP 5 avecune base MySQL 5

Le chapitre 10 syntheacutetise les fonctionnaliteacutes de plusieurs outils graphiques tels que

MySQLAdministrator

MySQL Query Browser

et

phpMyAdmin

Drsquoautres consoles graphiquesdrsquoadministration sont eacutetudieacutees agrave savoir

Toad

for MySQL

Navicat

et

EMS SQL Manager

Annexe

Lrsquoannexe contient une bibliographie et des adresses Web

4055_00c_Lim Page XX Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

XXI

Avant-propos

Typographie

La police

courrier

est utiliseacutee pour souligner les instructions SQL noms de types tablescontraintes etc (ex

SELECT nom FROM Pilote

)

Les majuscules sont employeacutees pour les directives SQL et les minuscules pour les autreseacuteleacutements Les noms des tables index vues fonctions proceacutedureshellip sont preacuteceacutedeacutes drsquounemajuscule (exemple la table

CompagnieAerienne

contient la colonne

nomComp

)

Les termes de MySQL (bien souvent traduits litteacuteralement de lrsquoanglais) sont noteacutes en italiqueexemple

trigger

table

column

etc

Dans une instruction SQL les symboles deacutesignent une liste drsquoeacuteleacutements et le symbole laquo | raquoun choix (exemple

CREATE

TABLE

|

VIEW

Les symboles laquo [ raquo et laquo ] raquo preacutecisent le carac-tegravere optionnel drsquoune directive au sein drsquoune commande (exemple

CREATE[UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ONtable_name (index_col_namehellip)

)

Ce sigle introduit une deacutefinition un concept ou une remarque importante Il apparaicirct soit dansune partie theacuteorique soit dans une partie technique pour souligner des instructions importantes

ou la marche agrave suivre avec SQL

Ce sigle annonce soit une impossibiliteacute de mise en œuvre drsquoun concept soit une mise en gardeIl est principalement utiliseacute dans la partie consacreacutee agrave SQL

Jrsquoen profite pour faire passer le message suivant si vous travaillez en version 4 de MySQLcertaines instructions deacutecrites dans ce livre ne fonctionneront pas Cet ouvrage nrsquoest pas unguide de reacutefeacuterence Vous trouverez sur le Web des ressources pour connaicirctre la compatibiliteacute

de telle ou telle fonction SQL

Ce sigle indique que le code source est teacuteleacutechargeable agrave partir du site des eacuteditions Eyrolles(wwweyrollescom) Cela est valable pour les exercices corrigeacutes mais aussi pour tous les

exemples du livre

Ce sigle signale une astuce ou un conseil personnel

Web

4055_00c_Lim Page XXI Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

XXII

copy Eacuteditions Eyrolles

Contact avec lrsquoauteur ndash Corrigeacutes des exercices

Si vous avez des remarques agrave formuler sur le contenu de cet ouvrage nrsquoheacutesitez pas agrave mrsquoeacutecrireagrave lrsquoadresse

soutouiut-blagnacfr

Ne me demandez pas de deacuteboguer votre proceacutedurecatalogueacutee ou drsquooptimiser une de vos requecircteshellip Seules les remarques relatives agrave lrsquoouvragetrouveront une reacuteponse

Par ailleurs un site drsquoaccompagnement de lrsquoouvrage (

errata

corrigeacutes des exercices sourcedes exemples et compleacutements) est en ligne et accessible via wwweditions-eyrollescom

4055_00c_Lim Page XXII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

1

Introduction

Dans cette introduction nous preacutesentons tout drsquoabord le cadre geacuteneacuteral dans lequel cetouvrage se positionne (SQL le modegravele de donneacutees et lrsquooffre MySQL) Nous deacutecrivons pourfinir la proceacutedure drsquoinstallation de MySQL sous Windows et lrsquoutilisation de lrsquointerface decommande en ligne pour que vous puissiez programmer en SQL degraves le chapitre 1

SQL une norme un succegraves

Crsquoest IBM

agrave tout seigneur tout honneur

qui avec System-R a implanteacute le modegravele relationnelau travers du langage SEQUEL (

Stuctured English as QUEry Language

) rebaptiseacute par lasuite SQL (

Structured Query Language

)

La premiegravere norme (SQL1) date de 1987 Elle eacutetait le reacutesultat de compromis entre construc-teurs mais elle eacutetait fortement influenceacutee par le dialecte drsquoIBM SQL2 a eacuteteacute normaliseacutee en1992 Elle deacutefinit quatre niveaux de conformiteacute le niveau drsquoentreacutee (

entry level

) les niveauxintermeacutediaires (

transitional

et

intermediate levels

) et le niveau supeacuterieur (

full level

) Leslangages SQL des principaux eacutediteurs sont tous conformes au premier niveau et ont beaucoupde caracteacuteristiques relevant des niveaux supeacuterieurs Depuis 1999 la norme est appeleacutee SQL3Elle comporte de nombreuses parties (concepts objets entrepocircts de donneacutees seacuteries temporel-les accegraves agrave des sources non SQL reacuteplication des donneacutees etc)

Le succegraves que connaissent les eacutediteurs de SGBD relationnels a plusieurs origines et reposenotamment sur SQL

Le langage est une norme depuis 1986 qui srsquoenrichit au fil du temps

SQL peut srsquointerfacer avec des langages de troisiegraveme geacuteneacuteration comme C ou Cobol maisaussi avec des langages plus eacutevolueacutes comme C++ Java ou C Certains considegraverent ainsique le langage SQL nrsquoest pas assez complet (le dialogue entre la base et lrsquointerface nrsquoestpas direct) et la litteacuterature parle de laquo deacutefaut drsquoimpeacutedance raquo (

impedance mismatch

)

Les SGBD rendent indeacutependants programmes et donneacutees (la modification drsquoune structure dedonneacutees nrsquoentraicircne pas forceacutement une importante refonte des programmes drsquoapplication)

Ces systegravemes sont bien adapteacutes aux grandes applications informatiques de gestion (archi-tectures type client-serveur et Internet) et ont acquis une maturiteacute sur le plan de la fiabiliteacuteet des performances

Ils integravegrent des outils de deacuteveloppement comme les preacutecompilateurs les geacuteneacuterateurs decode drsquoeacutetats de formulaires

4055_00d_Intro Page 1 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

2

copy Eacuteditions Eyrolles

Ils offrent la possibiliteacute de stocker des informations non structureacutees (comme le textelrsquoimage etc) dans des champs appeleacutes LOB (

Large Object Binary

)

Nous eacutetudierons les principales instructions SQL de MySQL qui sont classifieacutees dans letableau suivant

Modegravele de donneacutees

Le modegravele de donneacutees relationnelles repose sur une theacuteorie rigoureuse bien qursquoadoptant desprincipes simples La table relationnelle (

relational table

) est la structure de donneacutees de basequi contient des enregistrements appeleacutes aussi laquo lignes raquo (

rows

) Une table est composeacutee decolonnes (

columns

) qui deacutecrivent les enregistrements

Tables et donneacutees

Consideacuterons la figure suivante qui preacutesente deux tables relationnelles permettant de stockerdes compagnies des pilotes et le fait qursquoun pilote soit embaucheacute par une compagnie

Tableau 0-1 Classification des ordres SQL

Ordres SQL Aspect du langage

CREATE ndash ALTER ndash DROP - RENAME ndash TRUNCATE

Deacutefinition des donneacutees (LDD)

INSERT ndash UPDATE ndash DELETE - LOCK TABLE

Manipulation des donneacutees (LMD)

SELECT

Interrogation des donneacutees (LID)

GRANT ndash REVOKE ndash COMMIT ndash ROLLBACK ndash SAVEPOINT - SET TRANSACTION

Controcircle des donneacutees (LCD)

Figure 0-1

Deux tables

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

4055_00d_Intro Page 2 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

3

Introduction

Les cleacutes

La cleacute primaire (

primary key

) drsquoune table est lrsquoensemble minimal de colonnes qui permet

drsquoidentifier de maniegravere unique chaque enregistrement

Dans la figure preacuteceacutedente les colonnes laquo cleacutes primaires raquo sont noteacutees en gras La colonne

comp

repreacutesente le code de la compagnie et la colonne

brevet

deacutecrit le numeacutero du brevet

Une cleacute est dite laquo candidate raquo (

candidate key

) si elle peut se substituer agrave la cleacute primaire agrave tout

instant Une table peut contenir plusieurs cleacutes candidates ou aucune

Dans notre exemple les colonnes

nomComp

et

nom

peuvent ecirctre des cleacutes candidates si onsuppose qursquoaucun homonyme nrsquoest permis

Une cleacute eacutetrangegravere (

foreign key

) reacutefeacuterence dans la majoriteacute des cas une cleacute primaire drsquoune autretable (sinon une cleacute candidate sur laquelle un index unique aura eacuteteacute deacutefini) Une cleacute eacutetrangegravereest composeacutee drsquoune ou de plusieurs colonnes Une table peut contenir plusieurs cleacutes eacutetrangegrave-

res ou aucune

Dans notre exemple la colonne

compa

(noteacutee en italique dans la figure) est une cleacute eacutetrangegraverecar elle permet de reacutefeacuterencer un enregistrement unique de la table

Compagnie

via la cleacuteprimaire

comp

Le modegravele relationnel est ainsi fondamentalement baseacute sur les valeurs Les associations entretables sont toujours binaires et assureacutees par les cleacutes eacutetrangegraveres Les theacuteoriciens considegraverentcelles-ci comme des pointeurs logiques Les cleacutes primaires et eacutetrangegraveres seront deacutefinies dansles tables en SQL agrave lrsquoaide de contraintes

MySQL

MySQL est agrave la fois le nom du SGBD et le nom de la socieacuteteacute (qui se nomme en faitMySQL AB deacutecrite sur httpwwwmysqlcom) dont le siegravege se trouve en Suegravede agrave Uppsala ndashcompter une cinquantaine de kilomegravetres au nord de Stockholm Selon leurs dires leur serveurde donneacutees qui est eacutecrit en C et C++ serait installeacute de faccedilon opeacuterationnelle sur plus de sixmillions de sites Drsquoun point de vue coucirct lrsquoutilisation du SGBD sur des projets importants(entre 250 000

euro

et 500 000

euro

) ferait eacuteconomiser 90 sur le prix des licences du serveur60 sur les ressources systegraveme 70 sur le prix du mateacuteriel 50 sur les tacircches drsquoadminis-tration et de support

4055_00d_Intro Page 3 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

4

copy Eacuteditions Eyrolles

Par analogie avec les systegravemes drsquoexploitation depuis 1999 MySQL connaicirct le succegraves deLinux Teacuteleacutechargeacutee pregraves drsquoun million de fois en trois semaines (en octobre 2005) la version

production

de MySQL doit sa populariteacute du fait de son caractegravere

open source

de ses fonction-naliteacutes de plus en plus riches de ses performances de son ouverture agrave tous les principauxlangages du marcheacute de son fonctionnement sur les systegravemes les plus courants (les distribu-tions classiques de Linux Windows Mac OS BSD Novell et les deacuteriveacutes drsquoUnix) et de safaciliteacute drsquoutilisation pour des applications Web de taille moyenne

Un peu drsquohistoire

Le tableau suivant reacutesume lrsquohistorique des fonctionnaliteacutes importantes du serveur de donneacuteesMySQL Une version majeure comme 323 se deacutecline au fil des mois en diffeacuterentes sous-versions en fonction des diverses phases de deacuteveloppement

alpha

correspond agrave la phase active de nouvelles fonctionnaliteacutes sont ajouteacutees

becircta

correspond agrave lrsquoimpleacutementation des nouvelles fonctionnaliteacutes de la phase

alpha

sansapport important de code

gamma

correspond au terme

release candidate

(apregraves reacutesolution des bugs de la version

becircta

)

production

est lrsquoeacutetape suivante aussi appeleacutee GA (

Generally Available

) Les bugs sontreacutesolus srsquoils ne modifient pas le comportement geacuteneacuteral du serveur

old

correspond agrave la preacuteceacutedente version de production (par rapport agrave la courante)

Ainsi en septembre 2005 la version 4114 eacutetait mise en production et en octobre 2005 laversion 50 lrsquoeacutetait aussi

Ce qui est planifieacute agrave moyen terme concerne un enrichissement geacuteneacuteral des commandes SQLla prise en compte des types manquants de SQL2 et de ODBC3 la programmation des requecirc-tes hieacuterarchiques (interrogation de structures en arbres) en srsquoinspirant de ce qursquoa fait Oracle enla matiegravere (directive

CONNECT BY

dans un

SELECT

)

Tableau 0-2 Dates importantes pour MySQL

Anneacutee ndash versions Caracteacuteristiques principales

1999 ndash 323

x

Reacuteplication ndash Recherches textuelles ndash Transactions et Inteacutegriteacute reacutefeacuterentielle tables InnoDB (2002 ndash 32344)

2001 ndash 40

x

Cache de requecirctes ndash Seacutecurisation SSL ndash Sauvegarde agrave chaud

2003 ndash 41

x

Support de Unicode ndash Donneacutees geacuteographiques ndash SQL dynamique

2004 ndash 50

x

Vues ndash Curseurs ndash Proceacutedures catalogueacutees ndash Deacuteclencheurs ndash Dictionnaire des donneacutees ndash Transactions distribueacutees (XA)

Agrave venir ndash 51

x

Jointure externe ndash Contraintes

CHECK

ndash Sauvegarde agrave chaud et Inteacutegriteacute reacutefeacuterentielle tables MyISAM

4055_00d_Intro Page 4 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

5

Introduction

Ce qui nrsquoest pas encore planifieacute reste la prise en charge du stockage de donneacutees au formatXML et les extensions objets de SQL3 (principalement les types abstraits les heacuteritage et lesmeacutethodes)

Les changements opeacutereacutes sont preacutesenteacutes en deacutetail et par version agrave lrsquoadresse httpdevmysqlcomdocrefman

xy

ennewshtml (

xy

eacutetant le numeacutero de version majeure parexemple actuellement 51)

Offre du moment

La figure suivante (merci au passage agrave httpwwwiconarchivecom) preacutesente la majeurepartie des fonctionnaliteacutes de MySQL qui se positionnent au sein du serveur de donneacutees(SGBD)

Les API permettent drsquointeacutegrer SQL dans des programmes de diffeacuterents langages Le langageSQL sera utiliseacute par tous ceux (manuellement ou par un outil) travaillant sur la base dedonneacutees (administrateur deacuteveloppeur utilisateur) Le langage proceacutedural de MySQL permetdrsquoincorporer nativement tout ordre SQL dans un programme

Concregravetement une fois teacuteleacutechargeacute et installeacute vous avez accegraves agrave un SGBD un client en modetexte (interface de commande) Les pilotes ODBC JDBC API pour les langages C et C++ etles outils

MySQL Administrator

MySQL Query Browser

et

MySQL Migration Toolkit

sont agraveteacuteleacutecharger puis agrave installer seacutepareacutement

Figure 0-2

Offre MySQL

API C JDBC ODBC NET PHP Python Perl Ruby Microsoft VB

Pool de connexions Authentification ndash Reacuteutilisation de processus ndash Cache ndash hellip

Utilitaires Sauvegarde Restauration Reacuteplication Migrat ion Cluster hellip

SQL LDD ndash LMD LCD - Vues Proceacutedures Deacuteclencheurs hellip

Analyseur Requecirctes Privilegraveges

Optimiseur Accegraves Statistiques

Cache Buffers

Moteurs de stockage Meacutemoire - Index

MyISAM InnoDB Archive Cluster Federated

Serveur MysQL

Systegraveme de fichiers NTFS ndash NFS ndash SAN - NAS

Fichiers et logs Donneacutees ndash index - hellip

4055_00d_Intro Page 5 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

6

copy Eacuteditions Eyrolles

Licences

Deux types de licences sont proposeacutes par MySQL commerciale et GPL Dans le cadre drsquoundeacuteveloppement drsquoapplication entiegraverement sous licence GPL MySQL est gratuit Il en va demecircme srsquoil nrsquoest pas copieacute modifieacute distribueacute ou employeacute pour une utilisation en combinaisonavec un serveur Web (si vous deacuteveloppez lrsquoapplication Web vous-mecircme)

Dans tous les autres cas il est neacutecessaire drsquoobtenir une licence commerciale Par exemple sivous incluez un serveur MySQL ou des pilotes MySQL dans une application non

open source

Et la concurrence

Elle fait rage Deux types de concurrents ceux qui sont dans le domaine de lrsquo

open source

etceux qui engrangent des dollars agrave tour de bras

Dans la premiegravere cateacutegorie citons principalement Interbase 6 et Firebird de BorlandPostgreSQL et Berkeley DB

Dans la seconde on trouvera 4D Filemaker IBM (

DB2 UDB

) Informix Microsoft (

SQLServer Access

) Oracle et Sybase (

Adaptive Server SQL Anywhere Studio

) Depuis peu lesgrands eacutediteurs srsquoouvrent agrave la distribution gratuite Ces produits neacutecessitent de solides confi-gurations ce que nrsquoexigent pas les eacutediteurs de la premiegravere cateacutegorie

Fin 2004 Microsoft proposait

SQL Server 2005 Express Edition

qui est limiteacute drsquoun seulCPU 1 Go de meacutemoire et 4 Go de donneacutees

Fin 2004 Sybase offrait

ASE Express Edition

Plusieurs instances peuvent cohabiter surune machine tout en nrsquoutilisant pas plus drsquoun processeur moins de 2 Go de RAM et pasplus de 5 Go de donneacutees

Oracle annonccedilait en novembre 2005 une version gratuite avec

Oracle Database XE

(

Express Edition

) Version toutefois laquo limiteacutee raquo agrave un processeur moins de 1 Go de RAMune seule instance par systegraveme et pas plus de 4 Go de donneacutees

Peu de temps avant IBM avait aussi annonceacute une licence gratuite de

DB2 Express

Pasplus de deux processeurs et moins de 4 Go de RAM

Tout le monde est donc sur les rangs La guerre des versions nrsquoest donc pas finie Bien malinqui pourra preacutedire qui gagnera sur ce terrain

Notion de scheacutema (database)

MySQL appelle

database

un regroupement logique drsquoobjets (tables index vues deacuteclen-cheurs proceacutedures catalogueacutees etc) pouvant ecirctre stockeacutes agrave diffeacuterents endroits de lrsquoespacedisque Je ferai donc souvent reacutefeacuterence au terme laquo base de donneacutees raquo pour parler de cettenotion

On peut aussi assimiler ce concept agrave la notion de scheacutema pour ceux qui connaissent OracleLagrave ougrave MySQL et drsquoautres SGBD diffegraverent crsquoest sur la notion drsquoutilisateur (

user

)

4055_00d_Intro Page 6 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

7

Introduction

Pour tous un utilisateur sera associeacute agrave un mot de passe pour pouvoir se connecter et mani-puler des tables (srsquoil en a le droit bien sucircr)

Pour MySQL il nrsquoy a pas de notion drsquoappartenance drsquoun objet (table index etc) agrave unutilisateur Un objet appartient agrave son scheacutema (

database

) Ainsi deux utilisateurs distincts(

Jules

et

Paul) se connectant sur la mecircme base (database) ne pourront pas creacuteer chacunune table de nom Compagnie Srsquoils doivent le faire ce sera dans deux bases diffeacuterentes(bdjules et bdpaul)

Pour Oracle ou drsquoautres SGBD chaque objet appartient agrave un scheacutema (user) Ainsi deuxutilisateurs distincts Jules et Paul se connectant agrave la base (qui est un ensemble de scheacute-mas) pourront creacuteer chacun une table de nom Compagnie (la premiegravere sera reacutefeacuterenceacuteeJulesCompagnie la seconde PaulCompagnie)

La figure suivante illustre deux utilisateurs travaillant sur diffeacuterentes bases par une interfacequi peut ecirctre la fenecirctre de commande en ligne (dans la majeure partie des enseignements) ouun langage de programmation comme C Java ou PHP (utilisation drsquoune API) Notez deacutejagravelrsquoexistence de trois bases initiales (mysql test et information_schema) que nousdeacutetaillerons au chapitre 5

Notion drsquohocircte

MySQL deacutenomme host la machine heacutebergeant le SGBD MySQL diffegravere aussi agrave ce niveau desautres SGBD car il est possible de distinguer des accegraves drsquoun mecircme utilisateur suivant qursquoil seconnecte agrave partir drsquoune machine ou drsquoune autre La notion drsquoidentiteacute est baseacutee sur le couplenom drsquoutilisateur MySQL (user) cocircteacute serveur machine cliente

Identiteacutes

Ainsi lrsquoutilisateur Paul se connectant depuis la machine camparols peut ne pas ecirctre lemecircme que celui se connectant depuis la machine gambetta Srsquoil srsquoagit du mecircme il faudra auniveau du serveur eacuteventuellement composer un ensemble de preacuterogatives eacutequivalent pour lesdeux accegraves (voir le chapitre 5) Srsquoil srsquoagit de deux personnes diffeacuterentes il faudra distinguer

Figure 0-3 Notions de base et drsquoutilisateur MySQL

Interface

MySQL

Jules Paul

mysql test

information_schema

bdjules bdpaul

4055_00d_Intro Page 7 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

8 copy Eacuteditions Eyrolles

les attributions des diffeacuterents droits La figure suivante illustre le fait que deux utilisateurspeuvent se connecter par deux accegraves diffeacuterents Trois identiteacutes seront donc agrave preacutevoir cocircteacuteserveur

Nous verrons au chapitre 5 comment configurer le serveur et les clients Nous eacutetudierons auchapitre 9 des outils graphiques drsquoaide agrave lrsquoadministration

Accegraves agrave MySQL

Une fois que vous aurez installeacute MySQL sur votre ordinateur vous serez libre de choisirlrsquoaccegraves qui vous convient Ce livre utilise essentiellement lrsquointerface de commande en lignefournie avec le SGBD mais aussi Java via JDBC et le navigateur Web au travers de PHP

Aspects eacutetudieacutes

Nous nrsquoeacutetudierons pas tous les eacuteleacutements drsquoune base car certains sont assez speacutecifiques etsortent du cadre traditionnel de lrsquoenseignement mecircme supeacuterieur Le tableau suivant indiquedans quel chapitre du livre les principaux eacuteleacutements drsquoun scheacutema sont eacutetudieacutes

Figure 0-4 Notion drsquohocircte MySQL

brassens

Jules

Paul

mysql test

julesgambetta

paulcamparols

camparols

gambetta

Paul paulgambetta

TCP-IP

Tableau 0-3 Eacuteleacutements drsquoune base MySQL

Eacuteleacutements eacutetudieacutes ndash Chapitre Aspects non eacutetudieacutes

Deacuteclencheurs (triggers) ndash 7Fonctions et proceacutedures ndash 7Tables et index ndash 1Seacutequences ndash 2 5Vues (views) et utilisateurs ndash 5

Clusters ndash Moteurs de stockage (storage engine) ndash Partitionnement ndash Donneacutees spatiales

4055_00d_Intro Page 8 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 9

Introduction

Mise en œuvre de MySQL (sous Windows)

Si tout se passe bien comptez quelques minutes pour installer MySQL Je vous conseilletoutefois de creacuteer un point de restauration Windows pour pouvoir revenir agrave votre derniegraverebonne configuration connue Extraire lrsquoarchive teacuteleacutechargeacutee sur le site officiel de MySQL AB(httpdevmysqlcomdownloads) dans un reacutepertoire temporaire (exemple CTemp) puisexeacutecuter Setupexe

Installation

Le premier choix est donneacute pour le type drsquoinstallation typique complegravete et personnaliseacutee ndashchoisir typique dans un premier temps

Le deuxiegraveme eacutecran vous invite agrave vous enregistrer ndash ce nrsquoest pas obligatoire mais conseilleacutetoutefois pour saluer lrsquoeacutenorme travail fait par ces jeunes informaticiens de geacutenie (voilagrave lapommade est passeacutee)

La suite concerne la configuration du serveur de donneacutees (choisir la configuration deacutetailleacuteepour suivre les diffeacuterentes eacutetapes et mieux comprendre le parameacutetrage de votre serveur)

Lrsquoassistant propose en premier lieu de deacuteterminer le type de votre serveur (machine dedeacuteveloppement serveur ou machine deacutedieacutee) Jrsquoai opteacute pour le premier choix

Choissisez ensuite le type de base de donneacutees que vous comptez exploiter (multifonctionmode transactionnel seulement ou jamais transactionnel) Jrsquoai opteacute pour le premier choix

Deacuteterminez ensuite le reacutepertoire qui contiendra les donneacutees des bases InnoDB (crsquoest letype de tables que nous utiliserons dans cet ouvrage car eacutetant le seul dans cette version agraveprendre en charge les cleacutes eacutetrangegraveres) Jrsquoai opteacute pour le choix par deacutefaut

Choissisez ensuite lrsquooption qui convient agrave votre utilisation (en fonction du nombre deconnexions) Jrsquoai opteacute pour le premier choix (vingt connexions maximum)

Il est ensuite possible de modifier le port UDP drsquoeacutecoute (par deacutefaut 3306) et le modecomportemental du serveur par rapport agrave la syntaxe des instructions SQL Jrsquoai opteacute pour lepremier choix (mode strict)

Attention agrave ne pas seacutelectionner un jeu de caractegraveres japonais dans lrsquoeacutecran qui arrive Jrsquoaiopteacute pour les choix par deacutefaut (West European et latin1)

Lrsquoeacutecran suivant permet de deacuteclarer MySQL comme un service Windows (qursquoon pourraarrecircter via le panneau de configuration plutocirct qursquoavec une belle commande en ligne ou parun Ctrl-Alt-Suppr bien connu des bidouilleurshellip) Penser aussi agrave inclure dans le path lechemin de lrsquoexeacutecutable mysql de maniegravere agrave pouvoir lancer une connexion en ligne decommande Il vous suffit de cocher la case approprieacutee

Saisissez un mot de passe pour root vous pouvez aussi creacuteer un compte anonyme(connexion fantocircme sans utilisateur ni mot de passe)

4055_00d_Intro Page 9 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

10 copy Eacuteditions Eyrolles

Apregraves avoir valideacute la demande drsquoexeacutecution (bouton Execute) quelques secondes vontsrsquoeacutecouler avant qursquoon vous invite agrave terminer lrsquoinstallation

Voilagrave MySQL est installeacute Si ce nrsquoest pas le cas la section suivante vous aidera sucircrementDerniegravere chose si vous nrsquoutilisez pas souvent MySQL pensez agrave arrecircter et agrave positionner surManuel le service (ce nrsquoest pas pour lrsquoespace qursquoil occupe 10 Mo en RAM)

Pour modifier une configuration existante vous trouverez un assistant dans DeacutemarrerMySQLhellipMySQL Server Instance Wizard

Deacutesinstallation

Pour supprimer une configuration vous trouverez un assistant dans DeacutemarrerTous lesprogrammesMySQLhellipMySQL Server Instance Wizard choix Remove InstanceCependant le reacutepertoire installeacute par deacutefaut dans Program Files reste sur le disque (compterune centaine de meacutega-octets) De mecircme qursquoen ce qui concerne les entreacutees dans le menu Deacutemar-rer je ne parle pas de la base de registres qui est inchangeacuteehellip

Dans Panneau de configuration AjoutSuppression de programmes supprimerMySQL Server Il reste encore des choses dans la base de registres Le reacutepertoire MySQL sousProgram Files a diminueacute de taille mais il est toujours preacutesent Une fois que tout est faitredeacutemarrez votre machine et reprenez lrsquoinstallation initiale Prudence si vous modifiez leschemins des reacutepertoires des donneacutees entre plusieurs installations

Reconfiguration

En relanccedilant une installation il vous est donneacute drsquoajouter des composants (option Modify) sivous nrsquoavez pas fait une installation complegravete au deacutebut Vous avez aussi la possibiliteacute delaquo reacuteparer raquo (option Repair) une configuration existante

Premiers pas

La proceacutedure suivante va guider vos premiers pas pour travailler sous cette interface drsquounemaniegravere laquo professionnelle raquo Il srsquoagit de stocker vos fichiers de commande qui pourront serviragrave diffeacuterentes actions (creacuteations de tables de vues ou drsquoutilisateurs insertions modificationsou suppressions drsquoenregistrements eacutelaboration de requecirctes de proceacutedures catalogueacutees etc)

Lrsquointerface de commande

Lrsquointerface de commande en ligne porte le nom du SGBD (mysql) Cette interface ressembleagrave une fenecirctre DOS ou telnet et permet de dialoguer de la plus simple faccedilon avec la base dedonneacutees Lrsquoutilisation peut ecirctre interactive ou laquo batch raquo Quand lrsquoutilisation est interactive

4055_00d_Intro Page 10 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 11

Introduction

(crsquoest le mode le plus courant) le reacutesultat des extractions est preacutesenteacute sous une forme tabulaireau format ASCII

Vous verrez qursquoil est notamment possible

drsquoexeacutecuter des instructions SQL (creacuteeacuter des tables manipuler des donneacutees extraire desinformations etc)

de compiler des proceacutedures catalogueacutees et des deacuteclencheurs

de reacutealiser des tacircches drsquoadministration (creacuteation drsquoutilisateurs attribution de privilegravegesetc)

Le principe geacuteneacuteral de lrsquointerface est le suivant apregraves une connexion locale ou distante desinstructions sont saisies et envoyeacutees agrave la base qui retourne des reacutesultats afficheacutes dans la mecircmefenecirctre de commande

Nrsquoayez pas honte de bien maicirctriser cette interface au lieu de connaicirctre toutes les options drsquounoutil graphique (comme PhpMyAdmin MySQL Administrator ou autre) Il vous sera toujoursplus facile de vous adapter aux diffeacuterents boutons et menus tout en connaissant les instruc-tions SQL que lrsquoinverse

Imaginez-vous un jour agrave Singapour sur une machine ne disposant pas drsquooutils graphiques quele client vous demande la reacuteduction que vous pouvez lui faire sur la vente drsquoune piscine inteacute-rieure drsquoun Airbus A380 et que vous devez interroger (ou mettre agrave jour) une table sur leserveur du siegravege social agrave Blagnac Vous ne savez pas vous servir de lrsquointerface en ligne vousnrsquoecirctes pas un vrai informaticien

Creacuteation drsquoun utilisateur

Vous allez maintenant creacuteer un utilisateur MySQL Ouvrez le fichier premierPassql qui setrouve dans le reacutepertoire Introduction agrave lrsquoaide du bloc-notes (ou drsquoun eacutediteur de texte de votre

Figure 0-5 Principe geacuteneacuteral de lrsquointerface de commande en ligne

mysql [options] [nomBase] [entreacutees-sorties]

quit ou exit

mysqlgt INSERT hellip

mysqlgt CREATE hellip

mysqlgt SELECT hellip

hellip

mysqlgt

mysql

Systegraveme drsquoexploitation

nomBase

Web

4055_00d_Intro Page 11 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

12 copy Eacuteditions Eyrolles

choix) Changez laquo util raquo par le nom de lrsquoutilisateur agrave creacuteer (modifiez aussi le nom de la base) Vouspouvez changer le mot de passe si vous voulez Enregistrez ce fichier dans un de vos reacutepertoires

Connexion au serveur

Dans une fenecirctre de commande Windows Linux (ou autre) lancer lrsquointerface en ligne enconnectant lrsquoutilisateur root avec le mot de passe que vous avez donneacute lors de lrsquoinstallation

mysql --user=root -p

Une fois connecteacute par copier-coller (en effectuant un clic droit dans la fenecirctre de commandeMySQL) exeacutecutez une agrave une les diffeacuterentes instructions (creacuteation de la base de lrsquoutilisateurdes privilegraveges et deacuteconnexion de root) Nous eacutetudierons au chapitre 5 les notions eacuteleacutementai-res de droits et de seacutecuriteacute Les lignes preacuteceacutedeacutees de laquo -- raquo sont des commentaires

Voilagrave votre utilisateur (util) est creacuteeacute il peut se connecter et il possegravede toutes les preacuterogatives sur labase (bdutil) pour exeacutecuter les instructions deacutecrites dans cet ouvrage Pour tester votre connexionlancez la commande suivante qui se connecte au serveur sur la base bdutil sous lrsquoutilisateur util

mysql --user=util --host=localhost -p --database=bdutil

Veacuterification de la version

Pour controcircler la version du serveur sur lequel vous ecirctes connecteacute exeacutecutez la connexion-deacuteconnexion suivante dans une fenecirctre de commande Windows Linux (ou autre)

mysql --version

Si vous ecirctes deacutejagrave connecteacute la commande laquo SELECT VERSION() raquo vous renseignera eacutegale-ment agrave propos de la version du SGBD Si vous nrsquoecirctes pas en version 5 il vous sera impossiblede travailler avec des proceacutedures catalogueacutees vues et deacuteclencheurs Pour ma part lors de lareacutedaction de cet ouvrage cette commande a renvoyeacute le reacutesultat suivant

Figure 0-6 Interface en mode ligne de commande

4055_00d_Intro Page 12 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 13

Introduction

+-----------+

| VERSION() |

+-----------+

| 5015-nt |

+-----------+

Options de base

Les principales options au lancement de mysql sont reacutesumeacutees dans le tableau suivant

Tableau 0-4 Principales options de la commande mysql

Option Commentaire

--help ou - Affiche les options disponibles lrsquoeacutetat des variables drsquoenvironnement etrend la main

--batch ou -B Toute commande SQL peut ecirctre lanceacutee dans la fenecirctre de commandesystegraveme sans pour autant voir lrsquoinvite les reacutesultats (colonnes) sontseacutepareacutes par des tabulations

--database=nomBD ou ndashD nomBD

Seacutelection de la base de donneacutees agrave utiliser apregraves la connexion

--host=nomServeur ou -h nomServeur

Deacutesignation du serveur

--html ou -H Formate le reacutesultat des extractions en HTML

--one-database ou -O Restreint les instructions agrave la base de donneacutees speacutecifieacutee initialement

-p Demande le mot de passe sans lrsquoemployer en tant que paramegravetre

--password=motdePasse Transmission du mot de passe de lrsquoutilisateur agrave connecter Eacutevitez cetteoption et preacutefeacuterez la preacuteceacutedentehellip

--prompt=parametre Personnalise lrsquoinvite de commande (par deacutefaut mysqlgt)

--silent ou -s Configure le mode silence pour reacuteduire les messages de MySQL

--skip-column-names ou -N

Nrsquoeacutecrit aucun en-tecircte de colonne pour les reacutesultats drsquoextraction

--table ou -t Formate le reacutesultat des extractions en tables agrave en-tecircte de colonne (pardeacutefaut dans le mode interactif)

--tee=cheminNomFichier Copie la trace de toute la session dans le fichier que vous indiquez

--user=utilisateur ou -u utilisateur

Deacutesigne lrsquoutilisateur devant se connecter

--verbose ou -v Mode verbeux pour avoir davantage de messages du serveur

--version ou -V Affiche la version du serveur et rend la main

--vertical ou -E Affiche les reacutesultats des extractions verticalement (non plus en ligneshorizontales)

--xml ou -X Formate le reacutesultat des extractions en XML Les noms de balisesgeacuteneacutereacutees sont ltresultsetgt pour la table reacutesultat ltrowgtpour chaque ligne et ltfieldgt pour les colonnes

4055_00d_Intro Page 13 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

14 copy Eacuteditions Eyrolles

Ces options peuvent se combiner en les seacuteparant simplement par un espace (exemple mysql--tee=Ddevsortiemysqltxt --database=bdsoutou va se connecteranonymement agrave la base bdsoutou en inscrivant le contenu de la trace de la session dans lefichier sortiemysqltxt situeacute dans le reacutepertoire Ddev)

Le tableau suivant reacutesume les principaux paramegravetres pour afficher les invites de commande(relatives agrave lrsquooption prompt)

Batch

Pour lancer plusieurs commandes regroupeacutees dans un fichier agrave extension laquo sql raquo il fautpreacuteciser le chemin du fichier et celui qui contiendra les eacuteventuels reacutesultats (crsquoest du laquo brut dedeacutecoffrage raquo ) Ainsi lrsquoinstruction suivante exeacutecute dans la base bdsoutou sous lrsquoautoriteacutede lrsquoutilisateur soutou les commandes contenues dans le fichier Testbatchsql situeacutedans le reacutepertoire Ddev (notez lrsquoutilisation du double back-slash pour deacutesigner une arbo-rescence Windows) Le reacutesultat sera consigneacute dans le fichier sortietxt du mecircme reacuteper-toire

mysql --user=soutou --password=iut bdsoutou

Votre prompt et vite

Lrsquoexeacutecution de lrsquoinstruction laquo mysql --prompt=(uh) [d]gt --user=root ndashp raquodans une fenecirctre de commande shell ou DOS connectera lrsquoutilisateur root en lui demandantson mot de passe Lrsquoinvite de commande agrave lrsquoaffichage sera de la forme suivante

Tableau 0-5 Principales options de lrsquoinvite de commandes

Option Commentaire

v Version du serveur

d Base de donneacutees en cours drsquoutilisation

h Nom du serveur

u Nom drsquoutilisateur

U Nom drsquoutilisateur long (au format nomserveur)

_ Un espace

R Heure (0 agrave 23)

m Minutes

s Secondes

Y Anneacutee sur quatre chiffres

D Date en cours

c Compteur drsquoinstructions

ltDdevTestbatchsql gtDdevsortietxt

4055_00d_Intro Page 14 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 15

Introduction

(rootlocalhost) [bdsoutou]gt une fois que root aura seacutelectionneacute la base bdsou-tou (par la commande laquo use nombase raquo)

Configurez votre invite de commande SQL dans le fichier de configuration myini situeacute enprincipe dans le reacutepertoire CProgram FilesMySQLMySQL Server xx de la maniegravere quivous convient le plus

Pour ma part jrsquoai ajouteacute les deux lignes suivantes sous la section [mysql] elle-mecircme situeacuteesous lrsquoeacutetiquette [client]

mon prompt

prompt=(uh) [d]_mysqlgt_

Une fois le serveur redeacutemarreacute en consideacuterant que votre compte srsquoappelle util toutes voscommandes SQL devraient en principe ecirctre preacutefixeacutees de la syntaxe suivante

(utillocalhost) [bdutil] mysqlgt

Commandes de base

Une fois connecteacute vous pouvez utiliser des commandes ou faire des copier-coller drsquoun eacutediteurde texte dans lrsquointerface mysql (ce moyen de faire correspond plus agrave un environnement detest qui conviendra agrave lrsquoapprentissage) Le tableau suivant reacutesume les principales instructionspour manipuler le buffer drsquoentreacutee de lrsquointerface

La commande source est tregraves utile pour eacuteviter les copier-coller de trop nombreuses instructions

Tableau 0-6 Commandes de base du buffer drsquoentreacutee

Commande Commentaire

Affichage des commandes disponibles

delimiter chaicircne Modifie le deacutelimiteur (par deacutefaut laquo raquo)

use nomBase Rend une base de donneacutees courante

prompt chaicircne Modifie lrsquoinvite de commande avec les paramegravetres vus preacuteceacutedemment

quit ou exit Quitte lrsquointerface

source cheminNomFichiersql Charge et exeacutecute dans le buffer le contenu du cheminNomFichiersql (ex source DdevTestbatchsql exeacutecutera le script Testbatchsql situeacute dans Ddev)

tee nomFichierSortie Creacuteation nomFichierSortie dans le reacutepertoire CProgram FilesMySQLMySQL Server nnbin qui contiendra la trace de la session

4055_00d_Intro Page 15 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

4055_00d_Intro Page 16 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

Partie I

SQL de base

4055_00e_P01 Page 17 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

4055_00e_P01 Page 18 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

19

Chapitre 1

Deacutefinition des donneacutees

Ce chapitre deacutecrit les instructions SQL qui constituent lrsquoaspect LDD (langage de deacutefinitiondes donneacutees) Agrave cet effet nous verrons notamment comment deacuteclarer une table avec ses eacuteven-tuels index et contraintes

Tables relationnelles

Une table est creacuteeacutee en SQL par lrsquoinstruction

CREATE TABLE

modifieacutee au niveau de sa struc-ture par lrsquoinstruction

ALTER TABLE

et supprimeacutee par la commande

DROP TABLE

Creacuteation drsquoune table (

CREATE TABLE

)

Pour pouvoir creacuteer une table dans votre base il faut que vous ayez reccedilu le privilegravege

CREATE

Le meacutecanisme des privilegraveges est deacutecrit au chapitre 5

La syntaxe SQL simplifieacutee est la suivante

CREATE

[TEMPORARY]

TABLE

[IF NOT EXISTS] [

nomBase

]

nomTable

(

colonne1 type1

[NOT NULL | NULL] [DEFAULT

valeur1

] [COMMENT

chaine1

]

[

colonne2 type2

[NOT NULL | NULL] [DEFAULT

valeur2

] [COMMENT

chaine2

] ]

[CONSTRAINT

nomContrainte1 typeContrainte1

]

)

[ENGINE= InnoDB | MyISAM |

]

TEMPORARY

pour creacuteer une table qui nrsquoexistera que durant la session courante (la tablesera supprimeacutee agrave la deacuteconnexion) Deux connexions peuvent ainsi creacuteer deux tablestemporaires de mecircme nom sans risquer de conflit Il faut posseacuteder le privilegravege

CREATETEMPORARY TABLES

IF NOT EXISTS

permet drsquoeacuteviter qursquoune erreur se produise si la table existe deacutejagrave (sicrsquoest le cas elle nrsquoest aucunement affecteacutee par la tentative de creacuteation)

nomBase

(jusqursquoagrave 64 caractegraveres permis dans un nom de reacutepertoire ou de fichier sauflaquo

raquo laquo

raquo et laquo

raquo) srsquoil est omis il sera assimileacute agrave la base connecteacutee Srsquoil est preacuteciseacute il

4055_01_C01 Page 19 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

20

copy Eacuteditions Eyrolles

deacutesigne soit la base connecteacutee soit une autre base (dans ce cas il faut que lrsquoutilisateurcourant ait le droit de creacuteeacuter une table dans lrsquoautre base) Nous aborderons ces points dansle chapitre Controcircle des donneacutees et nous consideacutererons jusque-lagrave que nous travaillons dansla base courante (ce sera votre configuration la plupart du temps)

nomTable

mecircmes limitations que pour le nom de la base

colonnei typei

nom drsquoune colonne (mecircmes caracteacuteristiques que pour les noms destables) et son type (

INTEGER

CHAR

DATE

hellip) Nous verrons quels types sont disponiblessous MySQL La directive

DEFAULT

fixe une valeur par deacutefaut La directive

NOT NULL

interdit que la valeur de la colonne soit nulle

NULL

repreacutesente une valeur qursquoon peut consideacuterer comme non disponible non affecteacutee incon-nue ou inapplicable Elle est diffeacuterente drsquoun espace pour un caractegravere ou drsquoun zeacutero pour un

nombre

COMMENT

(jusqursquoagrave 60 caractegraveres) permet de commenter une colonne Ce texte seraensuite automatiquement afficheacute agrave lrsquoaide des commandes

SHOW CREATE TABLE

et

SHOWFULL COLUMNS

(voir le chapitre 5)

nomContraintei typeContraintei

nom de la contrainte et son type (cleacute primairecleacute eacutetrangegravere etc) Nous allons deacutetailler dans le paragraphe suivant les diffeacuterentescontraintes possibles

ENGINE

deacutefinit le type de table (par deacutefaut

InnoDB

bien adapteacute agrave la programmation detransactions et adopteacute dans cet ouvrage)

MyISAM

correspond au type par deacutefaut desversions 3 parfaitement robuste mais ne supportant pas pour lrsquoheure lrsquointeacutegriteacute reacutefeacuteren-tielle Drsquoautres types existent citons

MEMORY

pour les tables temporaires

ARCHIVE

etc

laquo

raquo symbole par deacutefaut qui termine une instruction MySQL en mode ligne decommande (en lrsquoabsence drsquoun autre deacutelimiteur)

Deacutelimiteurs

En mode ligne de commande il est possible (par la directive

delimiter

) de choisir lesymbole qui terminera chaque instruction Dans lrsquoexemple suivant on choisit le dollar aucours de lrsquoouvrage nous resterons avec le symbole par deacutefaut de MySQL agrave savoir laquo raquo

delimiter $

CREATE TABLE Test (t CHAR(8))$

Sensibiliteacute agrave la casse

Alors que MySQL est sensible par deacutefaut agrave la casse (au niveau des noms de base et de table)dans la plupart des distributions Unix il ne lrsquoest pas pour Windows En revanche concernantles noms de colonnes index alias de colonnes deacuteclencheurs et proceacutedures catalogueacutees

4055_01_C01 Page 20 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

21

chapitre ndeg 1 Deacutefinition des donneacutees

MySQL nrsquoest pas sensible agrave la casse tous systegravemes confondus En fait tous ces noms sontstockeacutes en minuscules dans le dictionnaire de donneacutees

La variable

lower_case_table_names

permet de forcer la sensibiliteacute agrave la casse pourles noms des tables et des bases de donneacutees (si elle vaut 0 la sensibiliteacute agrave la casse est active etles noms sont stockeacutes en minuscules 1 pas de sensibiliteacute agrave la casse et les noms sontstockeacutes en minuscules 2 pas de sensibiliteacute agrave la casse et les noms sont stockeacutes en respectant lacasse)

Je vous invite agrave positionner cette variable agrave 0 de maniegravere agrave homogeacuteneacuteiser le codage et agravecontrocircler un peu plus lrsquoeacutecriture de vos instructions SQL De plus crsquoest lrsquooption par deacutefaut surLinux Dans le fichier

myini

sous la section serveur identifieacutee par [

mysqld

] ajouter laligne et le commentaire suivants

Rend sensible agrave la CASSE les noms de tables et de database

lower_case_table_names=0

Refusez ce type de programmation (rendue impossible drsquoailleurs si la variable

lower_case_table_names

est positionneacutee agrave 0)

mysqlgt SELECT FROM

Avion

WHERE

AVION

capacite gt 150

Par ailleurs la casse devrait toujours avoir (quel que soit le SGBD concerneacute) une incidencemajeure dans les expressions de comparaison entre colonnes et valeurs que ce soit dans uneinstruction SQL ou un test dans un programme

Ainsi lrsquoexpression laquo

nomComp=Air France

raquo a la mecircme signification que lrsquoexpressionlaquo

nomComp=AIR France

raquo avec MySQL Horreur oui

Donc si vous deacutesirez veacuterifier la casse au sein mecircme des donneacutees il faudra utiliser la fonction

BINARY()

qui convertit en bits une expression En effet laquo

BINARY(AIR France)

raquo est dif-feacuterent de laquo

BINARY(Air France)

raquo et laquo

BINARY(nomComp)=BINARY(Air France)

raquo

renverra vrai en respectant la casse

Commentaires

Dans toute instruction SQL (deacuteclaration manipulation interrogation et controcircle des donneacutees)il est possible drsquoinclure des retours chariot des tabulations espaces et commentaires (sur uneligne preacuteceacutedeacutee de deux tirets laquo

ndash - raquo en fin de ligne agrave lrsquoaide du diegravese laquo raquo au sein drsquouneligne ou sur plusieurs lignes entre laquo raquo et laquo raquo) Les scripts suivants deacutecrivent la deacutecla-ration drsquoune mecircme table en utilisant diffeacuterentes conventions

4055_01_C01 Page 21 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

22 copy Eacuteditions Eyrolles

Comme nous le conseillons dans lrsquoavant-propos il est preacutefeacuterable drsquoutiliser les conventionssuivantes

bull Tous les mots-cleacutes de SQL sont noteacutes en majuscules

bull Les noms de tables sont noteacutes en Minuscules (excepteacute la premiegravere lettre ces noms serontquand mecircme stockeacutes dans le systegraveme en minuscules)

bull Les noms de colonnes et de contraintes en minuscules

Lrsquoadoption de ces conventions rendra vos requecirctes scripts et programmes plus lisibles (un peuagrave la mode Java)

Premier exemple

Le tableau ci-apregraves deacutecrit lrsquoinstruction SQL qui permet de creacuteer la table Compagnie illustreacuteepar la figure suivante dans la base bdsoutou (lrsquoabsence du preacutefixe laquo bdsoutou raquo conduiraitau mecircme reacutesultat si bdsoutou eacutetait la base connecteacutee lors de lrsquoexeacutecution du script)

Tableau 1-1 Diffeacuterentes eacutecritures SQL

Sans commentaire Avec commentaires

CREATE TABLE Test(colonneDECIMAL(388))

CREATE TABLE Test (colonne DECIMAL(388))

CREATE TABLE -- nom de la tableTest( deacutebut de la description COLONNE DECIMAL(388) )-- fin ne pas oublier le point-virguleCREATE TABLE Test ( une plus grande description des colonnes COLONNE type DECIMAL(388))

Figure 1-1 Table agrave creacuteer

Compagnie

comp nrue rue ville nomComp

4055_01_C01 Page 22 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 23

chapitre ndeg 1 Deacutefinition des donneacutees

Contraintes

Les contraintes ont pour but de programmer des regravegles de gestion au niveau des colonnes destables Elles peuvent alleacuteger un deacuteveloppement cocircteacute client (si on deacuteclare qursquoune note doit ecirctrecomprise entre 0 et 20 les programmes de saisie nrsquoont plus agrave tester les valeurs en entreacutee maisseulement le code retour apregraves connexion agrave la base on deacuteporte les contraintes cocircteacute serveur)

Les contraintes peuvent ecirctre deacuteclareacutees de deux maniegraveres

En mecircme temps que la colonne (valable pour les contraintes monocolonnes) ces contrain-tes sont dites laquo en ligne raquo (inline constraints) Lrsquoexemple preacuteceacutedent en deacuteclare deux

Apregraves que la colonne est deacuteclareacutee ces contraintes ne sont pas limiteacutees agrave une colonne etpeuvent ecirctre personnaliseacutees par un nom (out-of-line constraints)

Il est recommandeacute de deacuteclarer les contraintes NOT NULL en ligne les autres peuvent soit ecirctredeacuteclareacutees en ligne soit ecirctre nommeacutees Eacutetudions agrave preacutesent les types de contraintes nommeacutees(out-of-line) Les quatre types de contraintes les plus utiliseacutees sont les suivants

CONSTRAINT nomContrainte

UNIQUE (colonne1 [colonne2])

PRIMARY KEY (colonne1 [colonne2])

FOREIGN KEY (colonne1 [colonne2])

REFERENCES nomTablePere [(colonne1 [colonne2])]

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

CHECK (condition)

La contrainte UNIQUE impose une valeur distincte au niveau de la table (les valeurs nullesfont exception agrave moins que NOT NULL soit aussi appliqueacutee sur les colonnes)

La contrainte PRIMARY KEY deacuteclare la cleacute primaire de la table Un index est geacuteneacutereacute auto-matiquement sur la ou les colonnes concerneacutees Les colonnes cleacutes primaires ne peuventecirctre ni nulles ni identiques (en totaliteacute si elles sont composeacutees de plusieurs colonnes)

Tableau 1-2 Creacuteation drsquoune table et de ses contraintes

Instruction SQL Commentaires

CREATE TABLE bdsoutouCompagnie (comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) DEFAULT Paris COMMENT Par defaut Paris nomComp CHAR(15) NOT NULL)

La table contient cinq colonnes (quatre chaicircnes de caractegraveres et un numeacuterique de trois chiffres) La colonne ville est commenteacuteeLa table inclut en plus deux contraintes bull DEFAULT qui fixe Paris comme valeur par deacutefaut

de la colonne ville bull NOT NULL qui impose une valeur non nulle dans

la colonne nomComp

4055_01_C01 Page 23 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

24 copy Eacuteditions Eyrolles

La contrainte FOREIGN KEY deacuteclare une cleacute eacutetrangegravere entre une table enfant (child) et unetable pegravere (parent) Ces contraintes deacutefinissent lrsquointeacutegriteacute reacutefeacuterentielle que nous aborde-rons plus tard Les directives ON UPDATE et ON DELETE disposent de quatre options quenous deacutetaillerons avec les directives MATCH agrave la section Inteacutegriteacute reacutefeacuterentielle duchapitre 2)

La contrainte CHECK impose un domaine de valeurs ou une condition simple ou complexe entrecolonnes (exemple CHECK (note BETWEEN 0 AND 20) CHECK (grade=Copilote ORgrade=Commandant)) Cette contrainte est prise en charge au niveau de la deacuteclarationmais nrsquoest pas encore opeacuterationnelle mecircme dans la version 51

Il est recommandeacute de ne pas deacutefinir de contraintes sans les nommer (bien que cela soit possi-ble) car il sera difficile de les faire eacutevoluer (deacutesactivation reacuteactivation suppression) et la lisi-biliteacute des programmes en sera affecteacutee

Nous verrons au chapitre 3 comment ajouter supprimer deacutesactiver et reacuteactiver des contraintes(options de la commande ALTER TABLE)

Conventions recommandeacutees

Adoptez les conventions drsquoeacutecriture suivantes pour vos contraintes

bull Preacutefixez par pk_ le nom drsquoune contrainte cleacute primaire fk_ une cleacute eacutetrangegravere ck_ une veacuteri-fication un_ une uniciteacute

bull Pour une contrainte cleacute primaire suffixez du nom de la table la contrainte (exemple pk_Avion)

bull Pour une contrainte cleacute eacutetrangegravere renseignez (ou abreacutegez) les noms de la table source dela cleacute et de la table cible (exemple fk_Pil_compa_Comp)

En respectant nos conventions deacuteclarons les tables de lrsquoexemple suivant (Compagnie avec sacleacute primaire et Avion avec sa cleacute primaire et sa cleacute eacutetrangegravere) Du fait de lrsquoexistence de la cleacuteeacutetrangegravere la table Compagnie est dite laquo parent raquo (ou laquo pegravere raquo) de la table Avion laquo enfant raquo(ou laquo fils raquo) Cela reacutesulte de la traduction drsquoune association un-agrave-plusieurs entre les deuxtables (De UML agrave SQL Eyrolles 2002) Nous reviendrons sur ces principes agrave la section Inteacute-griteacute reacutefeacuterentielle du prochain chapitre

4055_01_C01 Page 24 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 25

chapitre ndeg 1 Deacutefinition des donneacutees

Remarques

bull Lrsquoordre nrsquoest pas important dans la deacuteclaration des contraintes nommeacutees

bull PRIMARY KEY eacutequivaut agrave UNIQUE + NOT NULL + index

bull Lrsquoordre de creacuteation des tables est important quand on deacutefinit les contraintes en mecircme tempsque les tables (on peut diffeacuterer la creacuteation ou lrsquoactivation des contraintes voir le chapitre 3)Il faut creacuteer drsquoabord les tables laquo pegraveres raquo puis les tables laquo fils raquo Le script de destruction destables suit le raisonnement inverse

Figure 1-2 Deux tables relieacutees agrave creacuteer

Tableau 1-3 Contraintes en ligne et nommeacutees

Tables Contraintes

CREATE TABLE Compagnie(comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) DEFAULT Paris COMMENT Par defaut Paris nomComp CHAR(15) NOT NULL CONSTRAINT pk_Compagnie PRIMARY KEY(comp))

Deux contraintes en ligneet une contrainte nommeacuteede cleacute primaire

CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) NOT NULL nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT ck_nbHVol CHECK(nbHVol BETWEEN 0 AND 20000) CONSTRAINT un_nom UNIQUE (nom) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))

Une contrainte en ligneet quatre contraintes nommeacutees bull Cleacute primairebull NOT NULLbull CHECK (nombre drsquoheures de vol

compris entre 0 et 20 000)bull UNIQUE (homonymes interdits)bull Cleacute eacutetrangegravere

Pilote

brevet nom nbHVol compa

Compagnie

comp nrue rue ville nomComp

Web

4055_01_C01 Page 25 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

26 copy Eacuteditions Eyrolles

Types des colonnes

Pour deacutecrire les colonnes drsquoune table MySQL fournit les types preacutedeacutefinis suivants (built-indatatypes)

caractegraveres (CHAR VARCHAR TINYTEXT TEXT MEDIUMTEXT LONGTEXT)

valeurs numeacuteriques (TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINTFLOAT DOUBLE REAL DECIMAL NUMERIC et BIT)

dateheure (DATE DATETIME TIME YEAR TIMESTAMP)

donneacutees binaires (BLOB TINYBLOB MEDIUMBLOB LONGBLOB)

eacutenumeacuterations (ENUM SET)

Deacutetaillons agrave preacutesent ces types Nous verrons comment utiliser les plus courants au chapitre 2et les autres au fil de lrsquoouvrage

Caractegraveres

Le type CHAR permet de stocker des chaicircnes de caractegraveres de taille fixe Les valeurs sontstockeacutees en ajoutant srsquoil le faut des espaces (trailing spaces) agrave concurrence de la tailledeacutefinie Ces espaces ne seront pas consideacutereacutes apregraves extraction agrave partir de la table

Le type VARCHAR permet de stocker des chaicircnes de caractegraveres de taille variable Les valeurssont stockeacutees sans lrsquoajout drsquoespaces agrave concurrence de la taille deacutefinie Depuis la version 503de MySQL les eacuteventuels espaces de fin de chaicircne seront stockeacutes et extraits en conformiteacuteavec la norme SQL Des caractegraveres Unicode (meacutethode de codage universelle qui fournit unevaleur de code unique pour chaque caractegravere quels que soient la plate-forme le programme oula langue) peuvent aussi ecirctre stockeacutes

Tableau 1-4 Types de donneacutees caractegraveres

Type Description Commentaire pour une colonne

CHAR(n) [BINARY | ASCII| UNICODE]

Chaicircne fixe de n octets ou caractegraveres

Taille fixe (maximum de 255 caractegraveres)

VARCHAR(n) [BINARY] Chaicircne variable de n caractegraveres ou octets

Taille variable (maximum de 65 535 caractegraveres)

BINARY(n) Chaicircne fixe de n octets

Taille fixe (maximum de 255 octets)

VARBINARY(n) Chaicircne variable de n octets

Taille variable (maximum de 255 octets)

TINYTEXT(n) Flot de n octets Taille fixe (maximum de 255 octets)

TEXT(n) Flot de n octets Taille fixe (maximum de 65 535 octets)

MEDIUMTEXT(n) Flot de n octets Taille fixe (maximum de 16 meacutegaoctets)

LONGTEXT(n) Flot de n octets Taille fixe (maximum de 429 gigaoctets)

4055_01_C01 Page 26 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 27

chapitre ndeg 1 Deacutefinition des donneacutees

Les types BINARY et VARBINARY sont similaires agrave CHAR et VARCHAR excepteacute par le faitqursquoils contiennent des chaicircnes drsquooctets sans tenir compte drsquoun jeu de caractegraveres en particulier

Les quatre types permettant aussi de stocker du texte sont TINYTEXT TEXT MEDIUMTEXTet LONGTEXT Ces types sont associeacutes agrave un jeu de caractegraveres Il nrsquoy a pas de meacutecanisme desuppression drsquoespaces de fin ni de possibiliteacute drsquoy associer une contrainte DEFAULT

Valeurs numeacuteriques

De nombreux types sont proposeacutes par MySQL pour deacutefinir des valeurs exactes (entiers ou deacutecimauxpositifs ou neacutegatifs INTEGER et SMALLINT) et des valeurs agrave virgule fixe ou flottante (FLOATDOUBLE et DECIMAL) En plus des speacutecifications de la norme SQL MySQL propose les typesdrsquoentiers restreints (TINYINT MEDIUMINT et BIGINT) Le tableau suivant deacutecrit ces types

n indique le nombre de positions de la valeur agrave lrsquoaffichage (le maximum est de 255) Ainsiil est possible de deacuteclarer une colonne TINYINT(4) sachant que seules 3 positions sontneacutecessaires en fonction du domaine de valeurs permises

Tableau 1-5 Types de donneacutees numeacuteriques

Type Description

BIT[(n)] Ensemble de n bits Taille de 1 agrave 64 (par deacutefaut 1)

TINYINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur un octet) de -128 agrave 127 signeacute 0 agrave 255 non signeacute

BOOL et BOOLEAN Synonymes de TINYINT(1) la valeur zeacutero est consideacutereacuteecomme fausse Le non-zeacutero est consideacutereacute comme vrai Dans lesprochaines versions le type boolean comme le preacuteconise lanorme SQL sera reacuteellement pris en charge

SMALLINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 2 octets) de ndash 32 768 agrave 32 767 signeacute 0 agrave 65 535 nonsigneacute

MEDIUMINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 3 octets) de ndash 8 388 608 agrave 8 388 607 signeacute 0 agrave 16 777 215 non signeacute

INTEGER[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 4 octets) de ndash2 147 483 648 agrave 2 147 483 647 signeacute0 agrave 4 294 967 295 non signeacute

BIGINT[(n)] [UNSIGNED] [ZEROFILL]

Entier (sur 8 octets) de ndash 9 223 372 036 854 775 808 agrave 9 223 372 036 854 775 807 signeacute 0 agrave 18 446 744 073 709 551 615 non signeacute

FLOAT[(n[p])] [UNSIGNED] [ZEROFILL]

Flottant (de 4 agrave 8 octets) p deacutesigne la preacutecision simple (jusqursquoagrave7deacutecimales) de -34 10+38 agrave -11 10-38 0 signeacute et de 11 10-38 agrave34 10+38 non signeacute

DOUBLE[(n[p])] [UNSIGNED] [ZEROFILL]

Flottant (sur 8 octets) p deacutesigne la preacutecision double (jusqursquoagrave 15deacutecimales) de -17 10+308 agrave -22 10-308 0 signeacute et de 22 10-308

agrave 17 10+308 non signeacute

DECIMAL[(n[p])] [UNSIGNED] [ZEROFILL]

Deacutecimal agrave virgule fixe p deacutesigne la preacutecision (nombre de chiffresapregraves la virgule maximum 30) Par deacutefaut n vaut 10 p vaut 0

4055_01_C01 Page 27 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

28 copy Eacuteditions Eyrolles

La directive UNSIGNED permet de consideacuterer seulement des valeurs positives

La directive ZEROFILL complegravete par des zeacuteros agrave gauche une valeur (par exemple soit unINTEGER(5) contenant 4 si ZEROFILL est appliqueacute la valeur extraite sera laquo 00004 raquo)En deacuteclarant une colonne ZEROFILL MySQL lrsquoaffecte automatiquement aussi agrave UNSI-GNED

Synonymes et alias

bull INT est synonyme de INTEGER

bull DOUBLE PRECISION et REAL sont synonymes de DOUBLE

bull DEC NUMERIC et FIXED sont synonymes de DECIMAL

bull SERIAL est un alias pour BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE

bull Dans toute instruction SQL eacutecrivez la virgule avec un point (72 retourne 35)

Dates et heures

Les types suivants permettent de stocker des moments ponctuels (dates dates et heuresanneacutees et heures) Les fonctions NOW() et SYSDATE() retournent la date et lrsquoheure courantesDans une proceacutedure ou un deacuteclencheur SYSDATE est reacuteeacutevalueacutee en temps reacuteel alors que NOWdeacutesignera toujours lrsquoinstant de deacutebut de traitement

Tableau 1-6 Types de donneacutees dates et heures

Type Description Commentaire pour une colonne

DATE Dates du 1er janvier de lrsquoan 1000 au 31 deacutecembre 9999 apregraves J-C

Sur 3 octets Lrsquoaffichage est au format lsquoYYYY-MM-DDrsquo

DATETIME Dates et heures (de 0 h de la premiegravere date agrave 23 h 59 minutes 59 secondes de la derniegravere date)

Sur 8 octets Lrsquoaffichage est au format lsquoYYYY-MM-DD HHMMSSrsquo

YEAR[(2|4)] Sur 4 positions de 1901 agrave 2155 (incluant 0000) Sur 2 positions de 70 agrave 69 (deacutesignant 1970 agrave 2069)

Sur 1 octet lrsquoanneacutee est consideacutereacutee sur 2 ou 4 positions (4 par deacutefaut) Le format drsquoaffichage est lsquoYYYYrsquo

TIME Heures de -838 h 59 minutes 59 secondes agrave 838 h 59 minutes 59 secondes

Lrsquoheure au format lsquoHHHMMSSrsquo sur 3 octets

TIMESTAMP Instants du 1er Janvier 1970 0 h 0 minute 0 seconde agrave lrsquoanneacutee 2037

Estampille sur 4 octets (au format lsquoYYYY-MM-DD HHMMSSrsquo) mise agrave jour agrave chaque modification sur la table

4055_01_C01 Page 28 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 29

chapitre ndeg 1 Deacutefinition des donneacutees

Donneacutees binaires

Les types BLOB (Binary Large OBject) permettent de stocker des donneacutees non structureacuteescomme le multimeacutedia (images sons videacuteo etc) Les quatre types de colonnes BLOB sontTINYBLOB BLOB MEDIUMBLOB et LONGBLOB Ces types sont traiteacutes comme des flotsdrsquooctets sans jeu de caractegravere associeacute

Eacutenumeacuteration

Deux types de collections sont proposeacutes par MySQL

Le type ENUM deacutefinit une liste de valeurs permises (chaicircnes de caractegraveres)

Le type SET permettra de comparer une liste agrave une combinaison de valeurs permises agravepartir drsquoun ensemble de reacutefeacuterence (chaicircnes de caractegraveres)

Structure drsquoune table (DESCRIBE)

DESCRIBE (eacutecriture autoriseacutee DESC) est une commande qui vient de SQLPlus drsquoOracle etqui a eacuteteacute reprise par MySQL Elle permet drsquoextraire la structure brute drsquoune table ou drsquounevue

DESCRIBE [nomBase] nomTableouVue [colonne]

Si la base nrsquoest pas indiqueacutee il srsquoagit de celle en cours drsquoutilisation Retrouvons la structuredes tables Compagnie et Pilote preacuteceacutedemment creacuteeacutees Le type de chaque colonneapparaicirct

Tableau 1-7 Types de donneacutees binaires

Type Description Commentaire pour une colonne

TINYBLOB(n)

Flot de n octets

Taille fixe (maximum de 255 octets)

BLOB(n) Taille fixe (maximum de 65 535 octets)

MEDIUMBLOB(n) Taille fixe (maximum de 16 meacutegaoctets)

LONGBLOB(n) Taille fixe (maximum de 429 gigaoctets)

Tableau 1-8 Types de donneacutees eacutenumeacuteration

Type Description

ENUM(valeur1valeur2) Liste de 65 535 valeurs au maximum

SET(valeur1valeur2) Ensemble de reacutefeacuterence (maximum de 64 valeurs)

4055_01_C01 Page 29 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

30 copy Eacuteditions Eyrolles

Restrictions

Les contraintes CHECK deacutefinies ne sont pas encore opeacuterationnelles

La fraction de seconde du type TIME nrsquoest pas encore pris en charge D HHMMSSfrac-tion

Les noms des colonnes doivent ecirctre uniques pour une table donneacutee (il est en revanchepossible drsquoutiliser le mecircme nom de colonne dans plusieurs tables)

Les colonnes de type SET sont eacutevalueacutees par des chaicircnes de caractegraveres seacutepareacutes par des laquo raquo(lsquoAirbus Boeingrsquo) En conseacutequence aucune valeur drsquoun SET ne doit contenir le symbole laquo raquo

Les noms des objets (base tables colonnes contraintes vues etc) ne doivent pas emprunterdes mots-cleacutes de MySQL TABLE SELECT INSERT IFhellip Si vous ecirctes laquo franco-franccedilais raquo celane vous gecircnera pas

Index

Comme lrsquoindex de cet ouvrage vous aide agrave atteindre les pages concerneacutees par un mot recher-cheacute un index MySQL permet drsquoacceacuteleacuterer lrsquoaccegraves aux donneacutees drsquoune table Le but principal

Tableau 1-9 Structure brute des tables

Reacutesultat Commentaires

mysqlgt DESCRIBE Pilote+--------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| brevet | char(6) | NO | PRI | | || nom | char(15) | YES | UNI | NULL | || nbHVol | double(72) | YES | | NULL | || compa | char(4) | YES | MUL | NULL | |+--------+-------------+------+-----+---------+-------+

Les cleacutes primaires sont NOT NULL (deacutesigneacutees par PRI dans la colonne Key)Les uniciteacutes sont deacutesigneacutees par UNI dans la colonne KeyLes occurrences multiples possibles sont deacutesigneacutees par MUL dans la colonne KeyLes contraintes NOT NULL nommeacutees (deacutefinies via les contraintes CHECK) nrsquoapparaissent pasLa colonne Extra indique notamment les seacutequences (AUTO_INCREMENT)

mysqlgt DESCRIBE Compagnie+---------+----------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+----------+------+-----+---------+-------+| comp | char(4) | NO | PRI | | || nrue | int(3) | YES | | NULL | || rue | char(20) | YES | | NULL | || ville | char(15) | YES | | Paris | || nomComp | char(15) | NO | | | |+---------+----------+------+-----+---------+-------+

4055_01_C01 Page 30 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 31

chapitre ndeg 1 Deacutefinition des donneacutees

drsquoun index est drsquoeacuteviter de parcourir une table seacutequentiellement du premier enregistrementjusqursquoagrave celui viseacute (problegraveme rencontreacute si crsquoest le Franccedilais nommeacute laquo Zidane raquo qursquoon recherchedans une table non indeacutexeacutee de plus de soixante-six millions drsquoenregistrementshellip) Le principedrsquoun index est lrsquoassociation de lrsquoadresse de chaque enregistrement avec la valeur des colonnesindeacutexeacutees

Sans index et pour n enregistrements le nombre moyen drsquoaccegraves neacutecessaire pour trouver uneacuteleacutement est eacutegal agrave n2 Avec un index ce nombre tendra vers log(n) et augmentera donc bienplus faiblement en fonction de la monteacutee en charge des enregistrements Si une table contient1 000 enregistrements alors lrsquousage drsquoun index acceacuteleacuterera lrsquoaccegraves drsquoun facteur 100 par rapportagrave un accegraves seacutequentiel

Arbres balanceacutes

La figure suivante illustre un index sous la forme drsquoun arbre Cet index est baseacute sur la colonnenom de la table Pilote Cette figure est caricaturale car un index nrsquoest pas un arbre binaire(plus de deux liens peuvent partir drsquoun nœud) Dans cet exemple trois accegraves agrave lrsquoindex serontneacutecessaires pour adresser directement un pilote via son nom au lieu drsquoen analyser huit au plus

Un index est associeacute agrave une table et peut ecirctre deacutefini sur une ou plusieurs colonnes (diteslaquo indeacutexeacutees raquo) Une table peut laquo heacuteberger raquo plusieurs index Ils sont mis agrave jour automatique-ment apregraves rafraicircchissement de la table (ajouts et suppressions drsquoenregistrements ou modifica-tion des colonnes indeacutexeacutees) Un index peut ecirctre deacuteclareacute unique si on sait que les valeurs descolonnes indeacutexeacutees seront toujours uniques

Figure 1-3 Index sur la colonne nom

ROWID

Pilote

ROWID brevet nom nbHVol compa

A PL-1 Ameacutelie Sulpice 450 AF B PL-2 Thomas Sulpice 900 AF C PL-3 Paul Soutou 1000 SING D PL-4 Aureacutelia Ente 850 ALIB E PL-5 Agnegraves Bidal 500 SING F PL-6 Sylvie Payrissat 2500 SING G PL-7 Thierry Guibert 600 ALIB H PL-8 Cathy Castaings 400 AF

Index (nom)

E F A D C B H G

nom lt rsquoDrsquo nom ge rsquoDrsquo

lt rsquoAmrsquo ge rsquoAmrsquo

ge rsquoBrsquo lt rsquoBrsquo lt rsquoAjrsquo ge rsquoAjrsquo

ge rsquoTrsquo lt rsquoTrsquo

ge rsquoQrsquo ge rsquoThlrsquo lt rsquoQrsquo ge rsquoThlrsquo

4055_01_C01 Page 31 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

32 copy Eacuteditions Eyrolles

La plupart des index de MySQL (PRIMARY KEY UNIQUE INDEX et FULLTEXT) sont stoc-keacutes dans des arbres eacutequilibreacutes (balanced trees B-trees) Drsquoautres types drsquoindex existentcitons ceux qui portent sur des colonnes SPATIAL (reverse key R-trees) et ceux appliqueacutesaux tables MEMORY (tables de hachage hash)

La particulariteacute des index B-tree est qursquoils conservent en permanence une arborescence symeacute-trique (balanceacutee) Toutes les feuilles sont agrave la mecircme profondeur Le temps de recherche estainsi agrave peu pregraves constant quel que soit lrsquoenregistrement chercheacute Le plus bas niveau de lrsquoindex(leaf blocks) contient les valeurs des colonnes indexeacutees et le rowid Toutes les feuilles delrsquoindex sont chaicircneacutees entre elles Pour les index non uniques (par exemple si on voulait deacutefinirun index sur la colonne compa de la table Pilote) le rowid est inclus dans la valeur de lacolonne indexeacutee Ces index premiers apparus sont deacutesormais tregraves fiables et performants ilsne se deacutegradent pas lors de la monteacutee en charge de la table

Creacuteation drsquoun index (CREATE INDEX)

Pour pouvoir creacuteer un index dans sa base la table agrave indexer doit appartenir agrave la base Si lrsquoutili-sateur a le privilegravege INDEX il peut creacuteer et supprimer des index dans sa base Un index estcreacuteeacute par lrsquoinstruction CREATE INDEX et supprimeacute par DROP INDEX

La syntaxe de creacuteation drsquoun index est la suivante

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX nomIndex

[USING BTREE | HASH]

ON nomTable (colonne1 [(taille1)] [ASC | DESC])

UNIQUE permet de creacuteer un index qui nrsquoaccepte pas les doublons

FULLTEXT permet de beacuteneacuteficier de fonctions de recherche dans des textes (flot de caractegrave-res)

SPATIAL permet de profiter de fonctions pour les donneacutees geacuteographiques

ASC et DESC preacutecisent lrsquoordre (croissant ou deacutecroissant)

Creacuteons deux index sur la table Pilote

Tableau 1-10 Creacuteations drsquoindex

Instruction SQL Commentaires

CREATE UNIQUE INDEX idx_Pilote_nom3 USING BTREE ON Pilote (nom(3) DESC)

Index B-tree ordre deacutecroissant sur les troispremiers caractegraveres du nom des pilotes

CREATE INDEX idx_Pilote_compa USING BTREE ON Pilote (compa)

Index B-tree ordre croissant sur la colonne cleacuteeacutetrangegravere compa

4055_01_C01 Page 32 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 33

chapitre ndeg 1 Deacutefinition des donneacutees

Bilan

bull Un index ralentit les rafraicircchissements de la base (conseacutequence de la mise agrave jour de lrsquoarbreou des bitmaps) En revanche il acceacutelegravere les accegraves

bull Il est conseilleacute de creacuteer des index sur des colonnes (majoritairement des cleacutes eacutetrangegraveres)utiliseacutees dans les clauses de jointures (voir chapitre 4)

bull Il est possible de creacuteer des index pour toutes les colonnes drsquoune table (jusqursquoagrave concurrencede 16)

bull Les index sont peacutenalisants lorsqursquoils sont deacutefinis sur des colonnes tregraves souvent modifieacutees ousi la table contient peu de lignes

Destruction drsquoun scheacutema

Il vous sera utile drsquoeacutecrire un script de destruction drsquoun scheacutema (jrsquoentends laquo scheacutema raquo commeensemble de tables contraintes et index composant une base de donneacutees et non pas en tantqursquoensemble de tous les objets drsquoun utilisateur) pour pouvoir recreacuteer une base propre Bienentendu si des donneacutees sont deacutejagrave preacutesentes dans les tables et que vous souhaitez les garder ilfaudra utiliser une strateacutegie pour les reacuteimporter dans les nouvelles tables Agrave ce niveau delrsquoouvrage vous nrsquoen ecirctes pas lagrave et le script de destruction va vous permettre de corriger voserreurs de syntaxe du script de creacuteation des tables

Nous avons vu qursquoil fallait creacuteer drsquoabord les tables laquo pegraveres raquo puis les tables laquo fils raquo (si descontraintes sont deacutefinies en mecircme temps que les tables) Lrsquoordre de destruction des tablespour des raisons de coheacuterence est inverse (il faut deacutetruire les tables laquo fils raquo puis les tableslaquo pegraveres raquo) Dans notre exemple il serait malvenu de supprimer la table Compagnie avant latable Pilote En effet la cleacute eacutetrangegravere compa nrsquoaurait plus de sens

Suppression drsquoune table (DROP TABLE)

Pour pouvoir supprimer une table dans une base il faut posseacuteder le privilegravege DROP sur cettebase Lrsquoinstruction DROP TABLE entraicircne la suppression des donneacutees de la structure de ladescription dans le dictionnaire des donneacutees des index des deacuteclencheurs associeacutes (triggers) etla reacutecupeacuteration de la place dans lrsquoespace de stockage

DROP [TEMPORARY] TABLE [IF EXISTS]

[nomBase] nomTable1 [[nomBase2]nomTable2]

[RESTRICT | CASCADE]

4055_01_C01 Page 33 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

34 copy Eacuteditions Eyrolles

TEMPORARY pour supprimer des tables temporaires Les transactions en cours ne sont pasaffecteacutees Lrsquoutilisation de TEMPORARY peut ecirctre un bon moyen de srsquoassurer qursquoon nedeacutetruit pas accidentellement une table non temporairehellip

IF EXISTS permet drsquoeacuteviter qursquoune erreur se produise si la table nrsquoexiste pas

RESTRICT et CASCADE ne sont pas encore opeacuterationnels Le premier permettra de veacuteri-fier qursquoaucun autre eacuteleacutement nrsquoutilise la table (vue deacuteclencheur etc) Le second reacutepercu-tera la destruction agrave tous les eacuteleacutements reacutefeacuterenceacutes

Les eacuteleacutements qui utilisaient la table (vues synonymes fonctions et proceacutedures) ne sont passupprimeacutes mais sont temporairement inopeacuterants Attention une suppression ne peut pas ecirctrepar la suite annuleacutee

Ordre des suppressions

Il suffit de relire agrave lrsquoenvers le script de creacuteation de vos tables pour en deacuteduire lrsquoordre de sup-pression agrave eacutecrire dans le script de destruction de votre scheacutema

Le tableau suivant preacutesente deux eacutecritures possibles pour deacutetruire des scheacutemas La premiegravereeacutecriture nrsquoest pas encore possible et il reste agrave voir comment drsquoun point de vue des performan-ces MySQL programmera le CASCADE

Tableau 1-11 Scripts eacutequivalents de destruction

Avec CASCADE (pas encore opeacuterationnel) Les laquo fils raquo puis les laquo pegraveres raquo

DROP TABLE Compagnie CASCADEDROP TABLE Pilote

DROP TABLE PiloteDROP TABLE Compagnie

4055_01_C01 Page 34 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 35

chapitre ndeg 1 Deacutefinition des donneacutees

Exercices

Lrsquoobjectif de ces exercices est de creacuteer des tables leur cleacute primaire et des contraintes de veacuteri-fication (NOT NULL et CHECK)

11 Preacutesentation de la base de donneacutees

Une entreprise deacutesire geacuterer son parc informatique agrave lrsquoaide drsquoune base de donneacutees Le bacirctiment estcomposeacute de trois eacutetages Chaque eacutetage possegravede son reacuteseau (ou segment distinct) eacutethernet Cesreacuteseaux traversent des salles eacutequipeacutees de postes de travail Un poste de travail est une machine surlaquelle sont installeacutes certains logiciels Quatre cateacutegories de postes de travail sont recenseacutees(stations Unix terminaux X PC Windows et PC NT) La base de donneacutees devra aussi deacutecrire lesinstallations de logiciels

Les noms et types des colonnes sont les suivants

Tableau 1-12 Caracteacuteristiques des colonnes

Colonne Commentaire Type

indIP trois premiers groupes IP (exemple 13012080) VARCHAR(11)

nomSegment nom du segment VARCHAR(20)

etage eacutetage du segment TINYINT(1)

nSalle numeacutero de la salle VARCHAR(7)

nomSalle nom de la salle VARCHAR(20)

nbPoste nombre de postes de travail dans la salle TINYINT(2)

nPoste code du poste de travail VARCHAR(7)

nomPoste nom du poste de travail VARCHAR(20)

ad dernier groupe de chiffres IP (exemple 11) VARCHAR(3)

typePoste type du poste (UNIX TX PCWS PCNT) VARCHAR(9)

dateIns date drsquoinstallation du logiciel sur le poste dateTIME

nLog code du logiciel VARCHAR(5)

nomLog nom du logiciel VARCHAR(20)

dateAch date drsquoachat du logiciel dateTIME

version version du logiciel VARCHAR(7)

typeLog type du logiciel (UNIX TX PCWS PCNT) VARCHAR(9)

prix prix du logiciel DECIMAL(62)

numIns numeacutero seacutequentiel des installations INTEGER(5)

dateIns date drsquoinstallation du logiciel TIMESTAMP

delai intervalle entre achat et installation SMALLINT

typeLP types des logiciels et des postes VARCHAR(9)

nomType noms des types (Terminaux X PC Windowshellip) VARCHAR(20)

4055_01_C01 Page 35 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

Partie I SQL de base

36 copy Eacuteditions Eyrolles

12 Creacuteation des tables

Eacutecrire puis exeacutecuter le script SQL (que vous appellerez creParcsql) de creacuteation des tables avecleur cleacute primaire (en gras dans le scheacutema suivant) et les contraintes suivantes

bull Les noms des segments des salles et des postes sont non nuls

bull Le domaine de valeurs de la colonne ad srsquoeacutetend de 0 agrave 255

bull La colonne prix est supeacuterieure ou eacutegale agrave 0

bull La colonne dateIns est eacutegale agrave la date du jour par deacutefaut

13 Structure des tables

Eacutecrire puis exeacutecuter le script SQL (que vous appellerez descParcsql) qui affiche la description detoutes ces tables (en utilisant des commandes DESCRIBE) Comparer le reacutesultat obtenu avec lescheacutema ci-dessus

14 Destruction des tables

Eacutecrire puis exeacutecuter le script SQL de destruction des tables (que vous appellerez dropParcsql)Lancer ce script puis celui de la creacuteation des tables agrave nouveau

Figure 1-4 Composition des tables

SegmentindIP nomSegment etage

SallenSalle nomSalle nbPoste indIP

PostenPoste nomPoste indIP ad typePoste nSalle

LogicielnLog nomLog dateAch version typeLog prix

InstallernPoste nLog numIns dateIns delai

TypestypeLP nomType

4055_01_C01 Page 36 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

37

Chapitre 2

Manipulation des donneacutees

Ce chapitre deacutecrit lrsquoaspect LMD (langage de manipulation des donneacutees) de MySQL Nousverrons que SQL propose trois instructions pour manipuler des donneacutees

lrsquoinsertion drsquoenregistrements

INSERT

la modification de donneacutees

UPDATE

la suppression drsquoenregistrements

DELETE

(et

TRUNCATE

)

Il existe drsquoautres possibiliteacutes que nous ne deacutetaillerons pas dans ce chapitre pour inseacuterer desdonneacutees en utilisant des outils drsquoimportation ou de migration citons MySQL Migration Tool-kit SQLPorter Navicat Intelligent Converters et MySQL Data Import de la socieacuteteacute EMS

Insertions drsquoenregistrements (

INSERT

)

Pour pouvoir inseacuterer des enregistrements dans une table il faut que vous ayez reccedilu le privilegravege

INSERT

Il existe plusieurs possibiliteacutes drsquoinsertion lrsquoinsertion monoligne qui ajoute un enre-gistrement par instruction (que nous allons deacutetailler maintenant) et lrsquoinsertion multiligne quiinsegravere plusieurs enregistrements par une requecircte (que nous deacutetaillerons au chapitre 4)

Syntaxe

La syntaxe simplifieacutee de lrsquoinstruction

INSERT

monoligne est la suivante

INSERT

[LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] [

nomBase

]

nomTable

|

nomVue

[(

nomColonne

)]

VALUES (

expression

| DEFAULT)()

[ON DUPLICATE KEY UPDATE

nomColonne

=

expression

]

DELAYED

indique que lrsquoinsertion est diffeacutereacutee (si la table est modifieacutee par ailleurs leserveur attend qursquoelle se libegravere pour y inseacuterer peacuteriodiquement de nouveaux enregistre-ments si elle redevient active entre-temps)

LOW_PRIORITY

indique que lrsquoinsertion est diffeacutereacutee agrave la libeacuteration complegravete de la table(option agrave ne pas utiliser sur des tables

MyISAM

)

HIGH_PRIORITY

annule lrsquooption

low priority

du serveur

IGNORE

indique que les eacuteventuelles erreurs deacuteclencheacutees suite agrave lrsquoinsertion seront consideacute-reacutees en tant que

warning

s

4055_02_C02 Page 37 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

38

copy Eacuteditions Eyrolles

ON DUPLICATE KEY UPDATE

permet de mettre agrave jour lrsquoenregistrement preacutesent dansla table qui a deacuteclencheacute lrsquoerreur de doublon (dans le cas drsquoun index

UNIQUE

ou drsquounecleacute primaire) Dans ce cas le nouvel enregistrement nrsquoest pas inseacutereacute seul lrsquoancien estmis agrave jour

Agrave lrsquoaide drsquoexemples nous allons deacutetailler les possibiliteacutes de cette instruction en consideacuterant lamajeure partie des types de donneacutees proposeacutes par MySQL

Renseigner toutes les colonnes

Ajoutons trois lignes dans la table

Compagnie

en alimentant toutes les colonnes de la tablepar des valeurs La deuxiegraveme insertion utilise le mot-cleacute

DEFAULT

pour affecter explicitementla valeur par deacutefaut agrave la colonne

ville

La troisiegraveme insertion attribue explicitement la valeur

NULL

agrave la colonne

nrue

Renseigner certaines colonnes

Inseacuterons deux lignes dans la table

Compagnie

en ne preacutecisant pas toutes les colonnes Lapremiegravere insertion affecte implicitement la valeur par deacutefaut agrave la colonne

ville

Ladeuxiegraveme donne implicitement la valeur

NULL

agrave la colonne

nrue

La table

Compagnie

contient agrave preacutesent les lignes suivantes

Tableau 2-1 Insertions

Instruction SQL Commentaires

INSERT INTO Compagnie VALUES (SING 7 Camparols Singapour Singapore AL)

Toutes les valeurs sont renseigneacutees dans lrsquoordre de la structure de la table

INSERT INTO Compagnie VALUES (AC 10 Gambetta

DEFAULT

Air France)

DEFAULT

explicite

INSERT INTO Compagnie VALUES (AN1

NULL

Hoche Blagnac Air Nul1)

NULL

explicite

Web

Tableau 2-2 Insertions de certaines colonnes

Instruction SQL Commentaires

INSERT INTO Compagnie(comp nrue rue nomComp) VALUES (AF 8 Champs Elyseacutees Castanet Air)

DEFAULT

implicite

INSERT INTO Compagnie(comp rue ville nomComp) VALUES (AN2 Foch Blagnac Air Nul2)

NULL

sur

nrue

implicite

Web

4055_02_C02 Page 38 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

39

chapitre ndeg 2 Manipulation des donneacutees

Plusieurs enregistrements

Le script suivant ajoute trois nouvelles compagnies en une seule instruction

INSERT

INSERT INTO Compagnie VALUES

(LUFT9SalasMunichLuftansa)

(QUAN1KangourooSydneyQuantas)

(SNCM3P PaoliBastiaCorse Air)

Ne pas respecter des contraintes

Inseacuterons des enregistrements dans la table

Pilote

qui ne respectent pas des contraintes Le tableausuivant deacutecrit les messages renvoyeacutes pour chaque erreur (le nom de la contrainte apparaicirct danschaque message les valeurs erroneacutees sont noteacutees en gras) La premiegravere erreur vient de la cleacute primairela seconde de lrsquouniciteacute du nom La troisiegraveme erreur signifie que la cleacute eacutetrangegravere reacutefeacuterence une cleacuteprimaire absente (ici une compagnie inexistante) Nous reviendrons sur ce dernier problegraveme dans lasection

Erreur Source du renvoi introuvable

La derniegravere concerne la contrainte en ligne

NOT NULL

Figure 2-1

Table apregraves les insertions

Compagnie

comp nrue rue ville nomComp

SING 7 Camparols Singapour Singapore AL AF 10 Gambetta Paris Air France AN1 Hoche Blagnac Air Nul1 AC 8 Champs Elyseacutees Paris Castanet Air AN2 Foch Blagnac Air Nul2

Valeur par deacutefaut Valeur NULL

Tableau 2-3 Insertions

Insertions veacuterifiant les contraintes Insertions ne veacuterifiant pas les contraintes

INSERT INTO Pilote VALUES (PL-1 Louise Ente 450 AF)

mysqlgt INSERT INTO Pilote VALUES(

PL-1

Ameacutelie Sulpice 100 AF)ERROR

1062

(23000)

Duplicate entry

PL-1 forkey 1

INSERT INTO Pilote VALUES (PL-2 Jules Ente 900 AF)

mysqlgt INSERT INTO Pilote VALUES (PL-4

Louise Ente

450 AF)ERROR

1062

(23000)

Duplicate entry

Louise Ente for key 2

INSERT INTO Pilote VALUES (PL-3 Paul Soutou 1000 SING)

mysqlgt INSERT INTO Pilote VALUES (PL-5 Thomas Sulpice 500

TOTO

)ERROR

1452

(23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT`fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))mysqlgt INSERT INTO Pilote VALUES (PL-6

NULL

100 AF)ERROR

1048

(23000) Column nom cannot be null

Web

4055_02_C02 Page 39 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

40

copy Eacuteditions Eyrolles

Donneacutees binaires

Le type BIT permet de manipuler des suites variables de bits Des fonctions sont disponiblespour programmer le laquo ET raquo le laquo OU raquo exclusif ou inclusif etc La table suivante contientdeux colonnes de ce type Notez lrsquoutilisation du preacutefixe laquo b raquo pour initialiser un tel type

CREATE TABLE Registres (nom CHAR(5)numero BIT(2)adresse BIT(16))

INSERT INTO Registres VALUES (COM2 )

Eacutenumeacuterations

Le type ENUM est consideacutereacute comme une liste de chaicircnes de caractegraveres Toute valeur drsquounecolonne de ce type devra appartenir agrave cette liste eacutetablie lors de la creacuteation de la table Suppo-sons qursquoon recense quatre types possibles de diplocircmes (BTS DUT Licence et INSA) pourchaque eacutetudiant On ne stocke qursquoun seul diplocircme par eacutetudiant

Le script de la creacuteation de la table et des insertions est le suivant Notez que les parenthegravesessont optionnelles pour deacutesigner la colonne ENUM

Le type SET permet de comparer une liste agrave une combinaison de valeurs permises agrave partir drsquounensemble de reacutefeacuterence (chaicircnes de caractegraveres) Supposons qursquoon deacutesire stocker plusieursdiplocircmes par eacutetudiant

b10 b0000010011110111

Figure 2-2 Table avec une colonne ENUM

UnCursus

num nom diplome

E1 F Brouard BTS E2 F Degrelle Licence

ENUM

BTS DUT Licence INSA

Tableau 2-4 Insertions avec un ENUM

Creacuteation Insertions (deux bonnes une illicite)

CREATE TABLE UnCursus (num CHAR(4) nom CHAR(15) diplome ENUM CONSTRAINT pk_Cusus PRIMARY KEY(num))

mysqlgt INSERT INTO UnCursus VALUES (E1 F Brouard (BTS))mysqlgt INSERT INTO UnCursus VALUES (E2 F Degrelle Licence)

mysqlgt INSERT INTO UnCursus VALUES (E3 Bug (MathSup))ERROR 1265 (01000) Data truncated for column diplome at row 1

(BTSDUTLicenceINSA)

4055_02_C02 Page 40 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 41

chapitre ndeg 2 Manipulation des donneacutees

Le script de la creacuteation de la table et des insertions est le suivant (mecircme remarque pour lesparenthegraveses)

Dates et heures

Nous avons deacutecrit au chapitre 1 les caracteacuteristiques geacuteneacuterales des types MySQL pour stockerdes eacuteleacutements de type dateheure Eacutetudions maintenant la manipulation de ces types Nousverrons que MySQL peut les consideacuterer soit en tant que chaicircnes de caractegraveres soit commenumeacuteriques

Formats

Concernant les types DATETIME DATE et TIMESTAMP les formats possibles sont lessuivants

Chaicircnes de caractegraveres YYYY-MM-DD HHMMSS ou YY-MM-DD HHMMSS (pour lescolonnes DATE YYYY-MM-DD ou YY-MM-DD) Tout autre deacutelimiteur est autoriseacute comme 20051231 113045 (pour les colonnes DATE 651231 651231 et651231 sont eacutequivalents et deacutesignent tous le reacuteveillon de lrsquoanneacutee 1965)

Consideacutereacutes comme chaicircnes de caractegraveres dans les formats suivants YYYYMMDD-HHMMSS ou YYMMDDHHMMSS (pour les DATE YYYYMMDD ou YYMMDD) ensupposant que la chaicircne ait un sens en tant que date Ainsi 19650205063000 est inter-preacuteteacute comme le 5 feacutevrier 1965 agrave 6 heures et 30 minutes Par contre 19650255 nrsquoa pas desens du fait du jour (il sera interpreacuteteacute comme 0000-00-00)

Figure 2-3 Table avec une colonne SET

Cursus

num nom diplomes

E1 F Brouard BTS Licence E2 F Degrelle Licence INSA DUT

SET

BTS DUT Licence INSA

Tableau 2-5 Insertions avec un SET

Creacuteation Insertions (deux bonnes une illicite)

CREATE TABLE Cursus (num CHAR(4) nom CHAR(15) diplomes SET CONSTRAINT pk_Cusus PRIMARY KEY(num))

mysqlgt INSERT INTO Cursus VALUES (E1 F Brouard )mysqlgt INSERT INTO Cursus VALUES (E2 F Degrelle

mysqlgt INSERT INTO Cursus VALUES (E3 Bug )ERROR 1265 (01000) Data truncated for column diplomes at row 1

(BTSDUTLicenceINSA)

(BTSLicence)

LicenceINSADUT

(BTSINSAENAC)

4055_02_C02 Page 41 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

42 copy Eacuteditions Eyrolles

Consideacutereacutes comme numeacuteriques dans les formats suivants YYYYMMDDHHMMSS ouYYMMDDHHMMSS (pour les DATE YYYYMMDD ou YYMMDD) en supposant que le nombre aitun sens en tant que date Ainsi 19650205063000 est interpreacuteteacute comme le 5 feacutevrier 1965 agrave6 heures et 30 minutes Par contre 19650205069000 nrsquoa pas de sens du fait des minutes (ilsera interpreacuteteacute comme 00000000000000)

Exemple avec DATE et DATETIME

Deacuteclarons la table Pilote qui contient deux colonnes de type dateheure DATE et DATETIME

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) dateNaiss DATE

nbHVol DECIMAL(72)dateEmbauche DATETIME compa VARCHAR(4)

CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

Lrsquoinsertion du pilote initialise la date de naissance au 5 feacutevrier 1965 ainsi que celle delrsquoembauche agrave la date du moment (heures minutes secondes) par la fonction SYSDATE

INSERT INTO Pilote

VALUES (PL-1 Christian Soutou 1965-02-05 900 SYSDATE() AF)

Nous verrons au chapitre 4 comment extraire les anneacutees mois jours heures minutes etsecondes Nous verrons aussi qursquoil est possible drsquoajouter ou de soustraire des dates entre elles

Exemple avec TIME et YEAR

Par analogie aux diffeacuterents formats des dates les heures (type TIME HHMMSS ouHHHMMSS) peuvent aussi ecirctre manipuleacutees sous la forme de chaicircnes ou de nombres

Chaicircne D HHMMSSfraction avec le nombre de jours (0 agrave 34) et la fraction deseconde (pas encore opeacuterationnelle) HHMMSSfraction HHMMSS HHMMD HHMMSS D HHMM D HH ou SS

Chaicircne sans les deacutelimiteurs sous reacuteserve que la chaicircne ait un sens Ainsi 101112 estconsideacutereacute comme 101112 mais 109712 est incorrect du fait des minutes ildevient 000000

Nombre en raisonnant comme les chaicircnes Ainsi 101112 est consideacutereacute comme101112 mais 109712 est incorrect du fait des minutes il devient 000000Les formats suivants sont aussi corrects SS MMSS HHMMSS

La table Pilote suivante contient la colonne pasVolDepuis pour stocker le deacutelai depuis ledernier vol et la colonne retraite qui indique lrsquoanneacutee de retraite

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) pasVolDepuis TIME retraite YEAR

CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

4055_02_C02 Page 42 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 43

chapitre ndeg 2 Manipulation des donneacutees

Les insertions suivantes utilisent diffeacuterents formats Le premier pilote nrsquoa pas voleacute depuis1 jour et 23 heures (47 heures) le second depuis 15 heures 26 minutes 30 secondes le troi-siegraveme depuis 4 jours et 23 heures (119 heures) le quatriegraveme depuis 3 heures 27 minutes et50 secondes et le dernier se croit plus preacutecis que tous les autres en ajoutant une fraction qui nesera pas prise en compte au niveau de la base

INSERT INTO Pilote VALUES (PL-1 Hait 1 2300 2002)

INSERT INTO Pilote VALUES (PL-2 Crampes 152630 2006)

INSERT INTO Pilote VALUES (PL-3 Tuffery 4 2300 05)

INSERT INTO Pilote VALUES (PL-4 Mercier 032750 07)

INSERT INTO Pilote VALUES (PL-5 Albaric 1 2300457 01)

Lrsquoeacutetat de la base est le suivant

mysqlgt SELECT FROM Pilote

+--------+---------+--------------+----------+

| brevet | nom | pasVolDepuis | retraite |

+--------+---------+--------------+----------+

| PL-1 | Hait | 470000 | 2002 |

| PL-2 | Crampes | 152630 | 2006 |

| PL-3 | Tuffery | 1190000 | 2005 |

| PL-4 | Mercier | 032750 | 2007 |

| PL-5 | Albaric | 470000 | 2001 |

+--------+---------+--------------+----------+

Si un deacutepassement se produit au niveau drsquoune colonne TIME celle-ci est eacutevalueacutee au maximumou au minimum (-8500000 et 9990000 sont respectivement convertis agrave -8385959 et8385959)

Exemple avec TIMESTAMP

Toute colonne du type TIMESTAMP est actualiseacutee agrave chaque modification de lrsquoenregistrement la premiegravere fois agrave lrsquoINSERT puis agrave chaque UPDATE (quelle que soit la colonne mise agrave jour)Deacuteclarons la table Pilote qui contient une colonne de ce type

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) misaJour TIMESTAMP

CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

Lrsquoinsertion du pilote suivant initialisera la colonne agrave la date systegraveme (comme SYSDATE)

INSERT INTO Pilote (brevetnom) VALUES (PL-1 Hait)

Par la suite et agrave la diffeacuterence drsquoun type DATE ou DATETIME pour chaque modification de cepilote la colonne misaJour sera reacuteactualiseacutee avec la date de lrsquoinstant de la mise agrave jour

4055_02_C02 Page 43 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

44 copy Eacuteditions Eyrolles

Mecircme si vous croyez mettre agrave NULL cette colonne avec une instruction UPDATE elle contien-dra toujours lrsquoinstant de votre vaine tentative

Fonctions utiles

Les fonctions CURRENT_TIMESTAMP() CURRENT_DATE() et CURRENT_TIME() UTC_TIME() renseignent sur lrsquoinstant la date lrsquoheure et lrsquoheure GMT de la session en cours

Il nrsquoest pas neacutecessaire drsquoutiliser une table pour afficher une expression dans lrsquointerface decommande Lrsquoexemple suivant montre que la requecircte a eacuteteacute exeacutecuteacutee le 1er novembre 2005 agrave10 heures 11 minutes et 27 secondes Le client est sur le fuseau GMT+1h

mysqlgt SELECT CURRENT_TIMESTAMP() CURRENT_TIME() CURRENT_DATE() UTC_TIME()+---------------------+----------------+----------------+------------+| CURRENT_TIMESTAMP() | CURRENT_TIME() | CURRENT_DATE() | UTC_TIME() |+---------------------+----------------+----------------+------------+| 2005-11-01 101127 | 101127 | 2005-11-01 | 091127 |+---------------------+----------------+----------------+------------+

Seacutequences

Bien que laquo seacutequence raquo ne soit pas dans le vocabulaire de MySQL car le meacutecanisme qursquoilpropose nrsquoest pas aussi puissant que celui drsquoOracle MySQL offre la possibiliteacute de geacuteneacutererautomatiquement des valeurs numeacuteriques Ces valeurs sont bien utiles pour composer des cleacutesprimaires de tables quand vous ne disposez pas de colonnes adeacutequates agrave cet effet Ce meacuteca-nisme reacutepond en grande partie agrave ce qursquoon attendrait drsquoune seacutequence

En attendant que MySQL offre peut-ecirctre dans une prochaine version un meacutecanisme plus richeque celui que nous allons eacutetudier je me permets drsquoappeler laquo seacutequence raquo une colonne indexeacuteede type entier (INTEGER SMALLINT TINYINT MEDIUMINT et BIGINT) deacutefinie agrave lrsquoaide de ladirective AUTO_INCREMENT Cette colonne est cleacute primaire ou unique et non nulle Uneseacutequence est en geacuteneacuteral affecteacutee agrave une table mais vous pouvez lrsquoutiliser pour plusieurs tablesou variables

Utilisation en tant que cleacute primaire

La figure suivante illustre la seacutequence appliqueacutee agrave la colonne numAff pour initialiser lesvaleurs de la cleacute primaire de la table Affreter La fonction LAST_INSERT_ID() retournela derniegravere valeur de la seacutequence geacuteneacutereacutee (ici le pas est de 1 la seacutequence deacutebute par deacutefaut agrave 1nous verrons par la suite qursquoil est possible drsquoutiliser une valeur diffeacuterente)

4055_02_C02 Page 44 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 45

chapitre ndeg 2 Manipulation des donneacutees

Le tableau suivant deacutecrit la creacuteation de cette table et diffeacuterentes eacutecritures pour les insertions

Modification drsquoune seacutequence

La seule modification possible drsquoune seacutequence est celle qui consiste agrave changer la valeur dedeacutepart de la seacutequence (avec ALTER TABLE) Seules les valeurs agrave venir de la seacutequence modi-fieacutee seront changeacutees (heureusement pour les donneacutees existantes des tables)

Supposons qursquoon deacutesire continuer agrave inseacuterer des nouveaux affregravetements agrave partir de lavaleur 100 Le prochain affregravetement sera estimeacute agrave 100 et les insertions suivantes prendront encompte le nouveau point de deacutepart tout en laissant intactes les donneacutees existantes des tables

ALTER TABLE Affreter AUTO_INCREMENT = 100

INSERT INTO Affreter (compimmatdateAffnbPax)

VALUES (SING F-NEW SYSDATE() 77)

mysqlgt SELECT FROM Affreter

Figure 2-4 Seacutequence appliqueacutee agrave une cleacute primaire

Affreter numAff comp immat dateAff nbPax

1 AF F-WTSS 13-05-2005 85 2 SING F-GAFU 05-02-2005 155 3 AF F-WTSS 11-09-2005 90 4 AF F-GLFS 11-09-2005 75 AUTO_INCREMENT

LAST_INSERT_ID() rArr 4

Tableau 2-6 Seacutequence pour une cleacute primaire

Table Insertions

CREATE TABLE Affreter( comp CHAR(4) immat CHAR(6) dateAff DATE nbPax SMALLINT(3) CONSTRAINT pk_Affreter PRIMARY KEY (numAff))

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES (AFF-WTSS2005-05-1385)

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES (SINGF-GAFU2005-02-05155)

INSERT INTO Affreter VALUES (NULLAFF-WTSS2005-09-1190)

INSERT INTO Affreter VALUES (0AFF-GLFS2005-09-1175)

numAff SMALLINT AUTO_INCREMENT

4055_02_C02 Page 45 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

46 copy Eacuteditions Eyrolles

+--------+------+--------+------------+-------+

| numAff | comp | immat | dateAff | nbPax |

+--------+------+--------+------------+-------+

| 1 | AF | F-WTSS | 2005-05-13 | 85 |

| 2 | SING | F-GAFU | 2005-02-05 | 155 |

| 3 | AF | F-WTSS | 2005-09-11 | 90 |

| 4 | AF | F-GLFS | 2005-09-11 | 75 |

| 100 | SING | F-NEW | 2005-11-01 | 77 |

+--------+------+--------+------------+-------+

Utilisation en tant que cleacute eacutetrangegravere

Creacuteons deux seacutequences qui vont permettre de donner leur valeur aux cleacutes primaires des deuxtables illustreacutees agrave la figure suivante (les affregravetements commencent agrave 1 les passagers agrave 100)Servons-nous aussi de la seacutequence de la table Affreter pour indiquer le dernier vol dechaque passager La section Inteacutegriteacute reacutefeacuterentielle deacutetaille les meacutecanismes relatifs aux cleacuteseacutetrangegraveres

Le script SQL de deacutefinition et de manipulation des donneacutees est indiqueacute ci-apregraves La valeur dedeacutepart drsquoune seacutequence peut ecirctre deacutefinie agrave la fin de lrsquoordre CREATE TABLE Notez eacutegalementlrsquoutilisation de la fonction LAST_INSERT_ID dans les insertions pour reacutecupeacuterer la valeur dela cleacute primaire

Figure 2-5 Seacutequence appliqueacutee agrave une cleacute eacutetrangegravere

Affreter

numAff comp immat dateAff nbPax

1 AF F-WTSS 13-05-2005 85 2 SING F-GAFU 05-02-2005 155 3 AF F-WTSS 15-05-2005 82 AUTO_INCREMENT

LAST_INSERT_ID() rArr 3

Passager

numPax nom siege dernierVol

100 Payrissat 7A 2 101 Castaings 2E 3

AUTO_INCREMENT

LAST_INSERT_ID() rArr 101

4055_02_C02 Page 46 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 47

chapitre ndeg 2 Manipulation des donneacutees

Modifications de colonnes

Lrsquoinstruction UPDATE permet la mise agrave jour des colonnes drsquoune table Pour pouvoir modifierdes enregistrements drsquoune table il faut que cette derniegravere soit dans votre base ou que vousayez reccedilu le privilegravege UPDATE sur la table

Syntaxe (UPDATE)

La syntaxe simplifieacutee de lrsquoinstruction UPDATE est la suivante

UPDATE [LOW_PRIORITY] [IGNORE] [nomBase] nomTable

SET col_name1=expr1 [ col_name2=expr2 ]

SET colonne1 = expression1 | (requecircte_SELECT) | DEFAULT

[colonne2 = expression2]

[WHERE (condition)]

[ORDER BY listeColonnes]

[LIMIT nbreLimite]

LOW_PRIORITY indique que la modification est diffeacutereacutee agrave la libeacuteration complegravete de latable (option agrave ne pas utiliser sur des tables MyISAM)

IGNORE signifie que les eacuteventuelles erreurs deacuteclencheacutees suite aux modifications serontconsideacutereacutees en tant que warnings

La clause SET actualise une colonne en lui affectant une expression (valeur valeur pardeacutefaut calcul ou reacutesultat drsquoune requecircte)

Tableau 2-7 Seacutequence pour une cleacute eacutetrangegravere

Tables Insertions

CREATE TABLE Affreter( comp CHAR(4) immat CHAR(6) dateAff DATEnbPax SMALLINT(3) CONSTRAINT pk_Affreter PRIMARY KEY (numAff))

CREATE TABLE Passager( nom CHAR(15) siege CHAR(4) dernierVol SMALLINTCONSTRAINT pk_Passager PRIMARY KEY(numPax)CONSTRAINT fk_Pax_vol_Affreter FOREIGN KEY (dernierVol) REFERENCES Affreter(numAff))

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES(AFF-WTSS2005-05-1385)

INSERT INTO Affreter (compimmatdateAffnbPax) VALUES(SINGF-GAFU2005-02-05155)

INSERT INTO Passager VALUES (NULLPayrissat7ALAST_INSERT_ID())

INSERT INTO Affreter VALUES (NULLAFF-WTSS2005-05-1582)

INSERT INTO Passager VALUES (NULLCastaings2ELAST_INSERT_ID())

WebnumAff SMALLINT AUTO_INCREMENT

numPax SMALLINT AUTO_INCREMENT

AUTO_INCREMENT = 100

4055_02_C02 Page 47 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

48 copy Eacuteditions Eyrolles

La condition du WHERE filtre les lignes agrave mettre agrave jour dans la table Si aucune conditionnrsquoest preacuteciseacutee tous les enregistrements seront actualiseacutes Si la condition ne filtre aucuneligne aucune mise agrave jour ne sera reacutealiseacutee

ORDER BY indique lrsquoordre de modification des colonnes

LIMIT speacutecifie le nombre maximum drsquoenregistrements agrave changer (par ordre de cleacuteprimaire croissante)

Modification drsquoune colonne

Modifions la compagnie de code AN1 en affectant la valeur 50 agrave la colonne nrue

UPDATE Compagnie SET nrue = 50 WHERE comp = AN1

Modification de plusieurs colonnes

Modifions la compagnie de code AN2 en affectant simultaneacutement la valeur 14 agrave la colonnenrue et la valeur par deacutefaut (Paris) agrave la colonne ville

UPDATE Compagnie SET nrue = 14 ville = DEFAULT WHERE comp = AN2

La table Compagnie contient agrave preacutesent les donneacutees suivantes

Modification de plusieurs enregistrements

Modifions les deux premiegraveres compagnies (par ordre de cleacute primaire ici AC et AF) en affec-tant la valeur Toulouse agrave la colonne ville

UPDATE Compagnie SET ville = Toulouse LIMIT 2

Ne pas respecter les contraintes

Il faut comme pour les insertions respecter les contraintes qui existent au niveau des colon-nes Dans le cas inverse une erreur est renvoyeacutee (le nom de la contrainte apparaicirct) et la mise agravejour nrsquoest pas effectueacutee

Figure 2-6 Table apregraves les modifications

Compagnie

comp nrue rue ville nomComp

SING 7 Camparols Singapour Singapore AL AF 10 Gambetta Paris Air France AN1 50 Hoche Blagnac Air Nul1 AC 8 Champs Elyseacutees Paris Castanet Air AN2 14 Foch Paris Air Nul2

Modifications 2

Modification 1

4055_02_C02 Page 48 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 49

chapitre ndeg 2 Manipulation des donneacutees

Agrave partir de la table Pilote le tableau suivant deacutecrit des modifications (certaines ne veacuterifientpas de contraintes) La mise agrave jour drsquoune cleacute eacutetrangegravere est possible si elle nrsquoest pas reacutefeacuterenceacuteepar une cleacute primaire (voir la section Inteacutegriteacute reacutefeacuterentielle)

Tableau 2-8 Table donneacutees et contraintes

Donneacutees Table et contraintes

Figure 2-7 Donneacutees CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) NOT NULL nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT ck_nbHVol CHECK (nbHVol BETWEEN 0 AND 20000) CONSTRAINT un_nom UNIQUE(nom) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))

Web

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

Tableau 2-9 Modifications

Veacuterifiant les contraintes (sauf une ) Ne veacuterifiant pas les contraintes

--Modification drsquoune cleacute eacutetrangegravereUPDATE Pilote SET compa = SING WHERE brevet = PL-2

-- Modification drsquoune cleacute primaireUPDATE Pilote SET brevet = PL3bis WHERE brevet = PL-3

--Passe outre la contrainte CHECK UPDATE Pilote SET nbHVol= 30000 WHERE brevet = PL-1

Figure 2-8 Apregraves modifications

mysqlgt UPDATE Pilote SET brevet=PL-2 WHERE brevet=PL-1ERROR 1062 (23000) Duplicate entry PL-2 for key 1

mysqlgt UPDATE Pilote SET nom = NULL WHERE brevet = PL-1ERROR 1263 (22004) Column set to default value NULL supplied to NOT NULL column nom at row 1

mysqlgt UPDATE Pilote SET nom=Paul Soutou WHERE brevet = PL-1ERROR 1062 (23000) Duplicate entry Paul Soutou for key 2

mysqlgt UPDATE Pilote SET compa=TOTO WHERE brevet = PL-1ERROR 1452 (23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))

Web

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 30000 AF PL-2 Jules Ente 900 SING PL3bis Paul Soutou 1000 SING

4055_02_C02 Page 49 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

50 copy Eacuteditions Eyrolles

Restrictions

Pour lrsquoheure il nrsquoest pas possible de modifier une table en utilisant une requecircte (dans la clauseSET) portant sur cette mecircme table

Dates et intervalles

Le tableau suivant reacutesume les principales opeacuterations possibles entre des colonnes de type date-heure

Consideacuterons la table suivante

CREATE TABLE Pilote

(brevet VARCHAR(6) nom VARCHAR(20) dateNaiss DATETIME dernierVol DATE

dateEmbauche DATETIME prochainVolControle DATETIME

nombreJoursNaisBoulot INTEGER(5)

intervalleNaisBoulot Decimal (206) intervalleVolExterieur

Decimal (106)

intervalleEntreVols Decimal (106) intervalleEmbaucheControle

TIME

compa VARCHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet))

Agrave lrsquoinsertion du pilote Thierry Albaric de la compagnie de code AF initialisons sa date denaissance (25 mars 1967) la date de son dernier vol (30 octobre 2005) sa date drsquoembauche (agravecelle du jour) et la date de son prochain controcircle en vol (13 novembre 2005 15h30)

INSERT INTO Pilote VALUES

(PL-1 Thierry Albaric1967-03-252005-10-30 SYSDATE()

2005-11-13 153000 NULL NULL NULL NULL NULL AF)

Les mises agrave jour par UPDATE sur cet enregistrement vont consister sur la base de ces quatredates agrave calculer les intervalles illustreacutes agrave la figure suivante

Tableau 2-10 Opeacuterations entre colonnes date-heure

Opeacuterande 1 Opeacuterateur Opeacuterande 2 Reacutesultat

DATE | DATETIME + ou - Interval DATE | DATETIME

DATE | DATETIME + ou - INTEGER DATE | DATETIME

TIME + ou - TIME TIME

TIME + ou - INTEGER TIME

Web

4055_02_C02 Page 50 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 51

chapitre ndeg 2 Manipulation des donneacutees

Modification drsquoune heure

On modifie une date en preacutecisant une heure via la fonction en rajoutant le format HHMMSSquels que soient les deacutelimiteurs (ici laquo raquo)

UPDATE Pilote SET dateNaiss = 1967-03-25 123500

WHERE brevet = PL-1

Ajout drsquoun deacutelai

On modifie la date drsquoembauche de 10 minutes apregraves la semaine prochaine Lrsquoajout drsquoun inter-valle srsquoopegravere par la fonction DATE_ADD coupleacutee agrave la directive DAY_MINUTE qui permet despeacutecifier un jour une heure et une minute Ainsi la semaine agrave ajouter correspond au laquo 7 raquo duparamegravetre de mecircme pour les 10 minutes

UPDATE Pilote

SET dateEmbauche =

WHERE brevet = PL-1

Diffeacuterence entre deux dates

La diffeacuterence entre deux dates peut se programmer agrave lrsquoaide de la fonction DATEDIFF quirenvoie un entier correspondant au nombre de jours seacuteparant les deux dates

UPDATE Pilote

SET nombreJoursNaisBoulot =

WHERE brevet = PL-1

Cette mecircme diffeacuterence au format drsquoun intervalle plus preacutecis (nombre de jours deacutecimaux) requiertlrsquoutilisation de la fonction TIMESTAMPDIFF(intervalledatetime1datetime2) quenous eacutetudierons au chapitre 4 (il existe bien sucircr drsquoautres possibiliteacutes de programmation) Cettefonction effectue la diffeacuterence entre deux dates suivant un format drsquointervalle donneacute (ici onobtient des secondes qursquoon divise par (243600) pour convertir en jours)

Figure 2-9 Intervalles agrave calculer

dateNais 2351967 qui passe agrave 12h35

dernierVol 30-10-2005

dateEmbauche 02-11-2005 x h y min qui passe agrave 09-11-2005 x h y+10 min

prochainVolControle13-11-2005 15h30

nombreJoursNaisBoulot

intervalleNaisBoulot

intervalleVolExterieur

intervalleEntreVols

intervalleEmbaucheControle

DATE_ADD(dateEmbaucheINTERVAL 7 010 DAY_MINUTE)

DATEDIFF(dateEmbauchedateNaiss)

4055_02_C02 Page 51 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

52 copy Eacuteditions Eyrolles

UPDATE Pilote SET

intervalleNaisBoulot =

intervalleEntreVols =

intervalleVolExterieur =

WHERE brevet = PL-1

Diffeacuterence entre deux intervalles

La diffeacuterence entre deux deacutecimaux renvoie un deacutecimal qursquoon convertit en format TIME (srsquoilest infeacuterieur agrave 839 h soit 3495 jours) par la fonction SEC_TO_TIME apregraves lrsquoavoir changeacute ensecondes (multiplieacute par 243600)

UPDATE Pilote SET

intervalleEmbaucheControle =

WHERE brevet = PL-1

La ligne contient deacutesormais les informations suivantes Les donneacutees en gras correspondentaux mises agrave jour On trouve qursquoil a fallu 14 109126875 jours pour que ce pilote soit embau-cheacute 106511181 jours seacuteparent le dernier vol du pilote du moment de son embauche14645833 jours seacuteparent son dernier vol de son prochain controcircle en vol La diffeacuterence entreces deux deacutelais est de 95 heures 52 minutes et 18 secondes

Nous verrons au chapitre 4 comment convertir en jours heures minutes et secondes un deacuteci-mal de grande taille

Figure 2-10 Ligne modifieacutee par des calculs de dates

TIMESTAMPDIFF(SECONDdateNaissdateEmbauche)(243600)

TIMESTAMPDIFF(SECONDdernierVolprochainVolControle)(243600)

TIMESTAMPDIFF(SECONDdernierVoldateEmbauche)(243600)

SEC_TO_TIME((intervalleEntreVols - intervalleVolExterieur)243600)

Pilote

brevet nom dateNaiss dernierVol dateEmbauche prochainVolControle

PL-1 Thierry Albaric 1967-03-25 1967-03-25 123500

2005-10-30 2005-11-02 152742 2005-11-09 153742

2005-11-13 153000

nombreJoursNaisBoulot intervalleNaisBoulot intervall eVolExterieur

13186 1596 14109126875 10651181

intervalleEntreVols intervalleEmbaucheControle compa

14645833 955218 AF

4055_02_C02 Page 52 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 53

chapitre ndeg 2 Manipulation des donneacutees

Fonctions utiles

Les fonctions suivantes vous seront drsquoun grand secours pour manipuler des dates et des intervalles

bull DATE_FORMAT(dateformat) convertit une date (heure) suivant un certain format

bull EXTRACT(type FROM date) extrait une partie donneacutee drsquoune date (heure)

bull FROM_DAYS(n) retourne une date agrave partir drsquoun entier (le 110001 correspond agrave 366) UNIX_TIMESTAMP(date) retourne le nombre de secondes qui se sont eacutecouleacutees depuis le1er janvier 1970 jusqursquoagrave la date (heure) en paramegravetre

bull GET_FORMAT(DATE|TIME|DATETIMEEUR|USA|JIS|ISO|INTERNAL)retourne un format de date (heure)

bull SEC_TO_TIME(secondes) convertit un nombre en un type TIME et son inverse TIME_TO_SEC(time)

bull STR_TO_DATE(chaineformat) convertit une chaicircne en date (heure) suivant un certain format

bull TIME(expression)extrait drsquoune date (heure) un type TIME

bull TIME_FORMAT(timeformat) convertit un intervalle suivant un certain format

Les tableaux suivants preacutesentent quelques exemples drsquoutilisation de ces fonctions

Tableau 2-11 Quelques formats pour DATE_FORMAT et STR_TO_DATE

Expression Reacutesultat Commentaire

DATE_FORMAT(SYSDATE()j) 306 Ce nrsquoest pas la vitesse de Danieldans Taxi2 mais le numeacutero du jourde lrsquoanneacutee (ici il srsquoagit du2 novembre 2005)

DATE_FORMAT(dateNaissW en M X)

Saturday en March 1967

Affichage des libelleacutes des jours etdes mois en anglais par deacutefaut

STR_TO_DATE(11092005 153742dmY His)

2005-09-11 153742 Conversion drsquoune chaicircne typeacutee datefranccedilaise au format DATETIME

Tableau 2-12 Utilisation de EXTRACT et UNIX_TIMESTAMP

Expression Reacutesultat Commentaire

EXTRACT(DAY FROM dateEmbauche) 9 Extraction du jour contenu dans la colonne

EXTRACT(MONTH FROM dateNaiss) 3 Extraction du mois contenu dans la colonne

UNIX_TIMESTAMP(SYSDATE())(243600) 130898850 Le 2 novembre 2005 au soir 13 089 jours etdes poussiegraveres srsquoeacutetaient eacutecouleacutes depuis1970

4055_02_C02 Page 53 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

54 copy Eacuteditions Eyrolles

Remplacement drsquoun enregistrement

Lrsquoinstruction REPLACE consiste comme son nom lrsquoindique agrave remplacer un enregistrementdans sa totaliteacute (toutes ses colonnes) Il faut avoir les privilegraveges INSERT et DELETE sur latable Crsquoest selon la valeur de la cleacute primaire ou celle drsquoun index unique que lrsquoenregistrementsera remplaceacute

Si la table ne dispose pas drsquoune contrainte PRIMARY KEY ou UNIQUE lrsquoutilisation de REPLACEnrsquoa pas de sens et devient eacutequivalente agrave INSERT

La syntaxe simplifieacutee de lrsquoinstruction UPDATE est la suivante

REPLACE [LOW_PRIORITY | DELAYED]

[INTO] [nomBase] nomTable [(colonne1)]

VALUES (expression1 | DEFAULT) [()]

LOW_PRIORITY et DELAYED ont la mecircme signification que pour INSERT et UPDATE

VALUES contient les valeurs de remplacement

Lrsquoinstruction suivante remplace lrsquoenregistrement relatif agrave la compagnie de code AN1 (voirfigure 2-6)

REPLACE INTO Compagnie VALUES (AN1 24 Salas Ramonville Air RENATO)

Suppressions drsquoenregistrements

Les instructions DELETE et TRUNCATE permettent de supprimer un ou plusieurs enregistre-ments drsquoune table Pour pouvoir supprimer des enregistrements dans une table il faut quecette derniegravere soit dans votre base ou que vous ayez reccedilu le privilegravege DELETE sur la table

Instruction DELETELa syntaxe simplifieacutee de lrsquoinstruction DELETE est la suivante

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM [nomBase] nomTable

[WHERE (condition)]

[ORDER BY listeColonnes]

[LIMIT nbreLimite]

LOW_PRIORITY IGNORE et LIMIT ont la mecircme signification que pour UPDATE

4055_02_C02 Page 54 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 55

chapitre ndeg 2 Manipulation des donneacutees

QUICK (pour les tables de type MyISAM) ne met pas agrave jour les index associeacutes pour acceacuteleacutererle traitement

La condition du WHERE seacutelectionne les lignes agrave supprimer dans la table Si aucune condi-tion nrsquoest preacuteciseacutee toutes les lignes seront deacutetruites Si la condition ne seacutelectionne aucuneligne aucun enregistrement ne sera supprimeacute

ORDER BY reacutealise un tri des enregistrements qui seront effaceacutes dans cet ordre

Deacutetaillons les possibiliteacutes de cette instruction en consideacuterant les diffeacuterentes tables preacuteceacutedem-ment deacutefinies La premiegravere commande supprime tous les pilotes de la compagnie de code AFla seconde avec une autre eacutecriture deacutetruit la compagnie de code AF

DELETE FROM Pilote WHERE compa = AF

DELETE FROM Compagnie WHERE comp = AF

Tentons de supprimer une compagnie qui est reacutefeacuterenceacutee par un pilote agrave lrsquoaide drsquoune cleacute eacutetran-gegravere Il srsquoaffiche une erreur qui sera expliqueacutee dans la section Inteacutegriteacute reacutefeacuterentielle

mysqlgt DELETE FROM Compagnie WHERE comp = SING

ERROR 1451 (23000) Cannot delete or update a parent row a foreign

key constraint fails (`bdsoutoupilote` CONSTRAINT `fk_Pil_compa_

Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))

Deacutetruisons enfin les deux premiegraveres compagnies (trieacutees par ordre croissant de cleacute ici AC etAN1) qui ne sont reacutefeacuterenceacutees par aucun pilote

DELETE FROM Compagnie LIMIT 2

Instruction TRUNCATELa commande TRUNCATE est une extension de SQL qui a eacuteteacute proposeacutee par Oracle et reprisepar MySQL Cette commande supprime tous les enregistrements drsquoune table et libegravere eacuteven-tuellement lrsquoespace de stockage utiliseacute par la table La syntaxe est la suivante

TRUNCATE [TABLE] [nomBase] nomTable

Avec le moteur InnoDB lrsquoopeacuteration est programmeacutee en DELETE Pour les autres moteurslrsquoopeacuteration diffegravere de DELETE de la maniegravere suivante

La table est supprimeacutee (DROP) puis recreacuteeacutee (CREATE) ce qui est plus rapide que dedeacutetruire les enregistrements un agrave un

Lrsquoopeacuteration peut ecirctre interrompue si une transaction active utilise la table (ou si un verrouest poseacute)

Le nombre drsquoenregistrements supprimeacutes nrsquoest pas retourneacute

Lrsquoeacuteventuelle derniegravere valeur drsquoune colonne AUTO_INCREMENT nrsquoest pas meacutemoriseacutee

Web

4055_02_C02 Page 55 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

56 copy Eacuteditions Eyrolles

Il nrsquoest pas possible de laquo tronquer raquo une table qui est reacutefeacuterenceacutee par des cleacutes eacutetrangegraveres acti-ves La solution consiste agrave deacutesactiver les contraintes puis agrave tronquer la table

Inteacutegriteacute reacutefeacuterentielle

Lrsquointeacutegriteacute reacutefeacuterentielle forme le cœur de la coheacuterence drsquoune base de donneacutees relationnelleCette inteacutegriteacute est fondeacutee sur la relation entre cleacutes eacutetrangegraveres et cleacutes primaires (ou candidates colonnes indexeacutees uniques et non nulles) qui permettent de programmer des regravegles de gestion(exemple lrsquoaffregravetement drsquoun vol doit se faire par une compagnie et pour un avion tous deuxexistant dans la base de donneacutees) Ce faisant la plupart des controcircles cocircteacute client (interface)sont ainsi deacuteporteacutes cocircteacute serveur

Pour les regravegles de gestion plus complexes (exemple lrsquoaffregravetement drsquoun avion doit se faire parune compagnie qui a embaucheacute au moins quinze pilotes dans les six derniers mois) il faudraprogrammer un deacuteclencheur (deacutecrits au chapitre 7) Il faut savoir que les deacuteclencheurs sontplus peacutenalisants que des contraintes dans un mode transactionnel

La contrainte reacutefeacuterentielle concerne toujours deux tables ndash une table laquo pegravere raquo aussi dite laquo maicirctre raquo(parentreferenced) et une table laquo fils raquo (childdependent) ndash posseacutedant une ou plusieurs colonnesen commun Pour la table laquo pegravere raquo ces colonnes composent la cleacute primaire (ou candidate avec unindex unique) Pour la table laquo fils raquo ces colonnes composent une cleacute eacutetrangegravere

Syntaxe

Crsquoest seulement dans sa version 32344 en 2002 (dix ans apregraves Oracle) que MySQL a inclusdans son offre les contraintes reacutefeacuterentielles pour les tables InnoDB Lrsquointeacutegriteacute reacutefeacuterentielle seprogramme dans la table laquo fils raquo par la contrainte suivante Il est conseilleacute de nommer lacontrainte sinon MySQL srsquoen charge Si la cleacute eacutetrangegravere nrsquoest pas deacutejagrave indexeacutee MySQL srsquoencharge aussi Les deux tables ne doivent pas ecirctre temporaires

[CONSTRAINT nomContrainte] FOREIGN KEY [id] (listeColonneEnfant)

REFERENCES nomTable (listeColonneParent)

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

Coheacuterences assureacutees

Lrsquoexemple suivant illustre quatre contraintes reacutefeacuterentielles Une table peut ecirctre laquo pegravere raquo pourune contrainte et laquo fils raquo pour une autre (crsquoest le cas de la table Avion)

Web

4055_02_C02 Page 56 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 57

chapitre ndeg 2 Manipulation des donneacutees

Deux types de problegravemes sont automatiquement reacutesolus par MySQL pour assurer lrsquointeacutegriteacutereacutefeacuterentielle

bull La coheacuterence du laquo fils raquo vers le laquo pegravere raquo on ne doit pas pouvoir inseacuterer un enregistrementlaquo fils raquo (ou modifier sa cleacute eacutetrangegravere) rattacheacute agrave un enregistrement laquo pegravere raquo inexistant Il estcependant possible drsquoinseacuterer un laquo fils raquo (ou de modifier sa cleacute eacutetrangegravere) sans rattacherdrsquoenregistrement laquo pegravere raquo agrave la condition qursquoil nrsquoexiste pas de contrainte NOT NULL auniveau de la cleacute eacutetrangegravere

bull La coheacuterence du laquo pegravere raquo vers le laquo fils raquo on ne doit pas pouvoir supprimer un enregistre-ment laquo pegravere raquo si un enregistrement laquo fils raquo y est encore rattacheacute Il est possible de suppri-mer les laquo fils raquo associeacutes (DELETE CASCADE) drsquoaffecter la valeur nulle aux cleacutes eacutetrangegraveresdes laquo fils raquo associeacutes (DELETE SET NULL) ou de reacutepercuter une modification de la cleacute pri-maire du pegravere (UPDATE CASCADE et UPDATE SET NULL)

Deacuteclarons agrave preacutesent ces contraintes sous MySQL en deacutetaillant les options disponibles

Contraintes cocircteacute laquo pegravere raquo

Le tableau suivant illustre les deux possibiliteacutes (cleacute primaire ou candidate) dans le cas de latable Compagnie Notons que pour le cas de la cleacute candidate une cleacute primaire peut ecirctre deacutefi-nie par ailleurs (sur nomComp par exemple)

Figure 2-11 Inteacutegriteacute reacutefeacuterentielle

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2005-05-13 85 SING F-GAFU 2005-02-05 155 AF F-WTSS 2005-05-15 82

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

dependent child referenced parent

referenced parent

dependent child dependent child NOT NULL

4055_02_C02 Page 57 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

58 copy Eacuteditions Eyrolles

Contraintes cocircteacute laquo fils raquo

Indeacutependamment de lrsquoeacutecriture de la table laquo pegravere raquo plusieurs eacutecritures sont possibles au niveaude la table laquo fils raquo selon qursquoon creacuteeacute les index ou qursquoon laisse MySQL le faire et selon qursquoonnomme ou pas la contrainte de cleacute eacutetrangegravere

La premiegravere eacutecriture nomme la contrainte mais ne preacutecise rien agrave propos de lrsquoindex Ladeuxiegraveme ne nomme pas la contrainte mais deacutefinit lrsquoindex (sans option toutefois) Lrsquoeacutecritureagrave adopter est un meacutelange des deux agrave savoir nommer les contraintes et deacutecrire les index

Cleacutes composites et nulles

Les cleacutes eacutetrangegraveres ou primaires peuvent ecirctre deacutefinies sur plusieurs colonnes (16 au maxi-mum) on parle de composite keys

Des cleacutes eacutetrangegraveres peuvent ecirctre nulles (si elles ne font pas partie drsquoune cleacute primaire) siaucune contrainte NOT NULL nrsquoest deacuteclareacutee

Deacutecrivons agrave preacutesent le script SQL qui convient agrave notre exemple (la syntaxe de creacuteation desdeux premiegraveres tables a eacuteteacute discuteacutee plus haut) et eacutetudions ensuite les meacutecanismes program-meacutes par ces contraintes Deacutecidons qursquoun avion aura toujours un proprieacutetaire (NOT NULL)

Tableau 2-13 Eacutecritures des contraintes de la table laquo pegravere raquo

Cleacute primaire Cleacute candidate

CREATE TABLE Compagnie(comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) nomComp CHAR(15) CONSTRAINT pk_Compagnie PRIMARY KEY(comp))

CREATE TABLE Compagnie(comp CHAR(4) NOT NULL nrue INTEGER(3) rue CHAR(20) ville CHAR(15) nomComp CHAR(15) CONSTRAINT un_Compagnie UNIQUE(comp) CONSTRAINT pk_Compagnie PRIMARY KEY(nomComp))

Tableau 2-14 Eacutecritures des contraintes de la table laquo fils raquo

Contrainte nommeacutee sans index Contrainte pas nommeacutee et index

CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))

CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) INDEX (compa) FOREIGN KEY (compa) REFERENCESCompagnie(comp))

4055_02_C02 Page 58 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 59

chapitre ndeg 2 Manipulation des donneacutees

CREATE TABLE Avion

(immat CHAR(6) typeAvion CHAR(15) nbhVol DECIMAL(102)

proprio CHAR(4) NOT NULL CONSTRAINT pk_Avion PRIMARY KEY(immat)

INDEX (proprio)

CONSTRAINT fk_Avion_comp_Compag

FOREIGN KEY(proprio) REFERENCES Compagnie(comp))

CREATE TABLE Affreter

(compAff CHAR(4) immat CHAR(6) dateAff DATE nbPax INTEGER(3)

CONSTRAINT pk_Affreter PRIMARY KEY (compAff immat dateAff)

INDEX (immat)

CONSTRAINT fk_Aff_na_Avion

FOREIGN KEY(immat) REFERENCES Avion(immat)

INDEX (compAff)

CONSTRAINT fk_Aff_comp_Compag

FOREIGN KEY(compAff) REFERENCES Compagnie(comp))

Coheacuterence du fils vers le pegravere

Si la cleacute eacutetrangegravere est deacuteclareacutee NOT NULL lrsquoinsertion drsquoun enregistrement laquo fils raquo nrsquoest possibleque srsquoil est rattacheacute agrave un enregistrement laquo pegravere raquo existant Dans le cas inverse lrsquoinsertion drsquounenregistrement laquo fils raquo rattacheacute agrave aucun laquo pegravere raquo est possible

Le tableau suivant deacutecrit des insertions correctes et une incorrecte Le message drsquoerreur est icien anglais (il y est question de ne pouvoir ajouter un enregistrement laquo fils raquo)

Pour inseacuterer un affregravetement il faut donc avoir ajouteacute au preacutealable au moins une compagnie etun avion Le chargement de la base de donneacutees est conditionneacute par la hieacuterarchie des contrain-tes reacutefeacuterentielles Ici il faut inseacuterer drsquoabord les compagnies puis les pilotes (ou les avions)enfin les affregravetements

Tableau 2-15 Insertions correctes et incorrectes

Insertions correctes Insertion incorrecte

-- fils avec pegravere INSERT INTO Pilote VALUES (PL-3 Paul Soutou 1000 SING)-- fils sans pegravereINSERT INTO Pilote VALUES (PL-4 Un Connu 0 NULL)-- fils avec pegraveresINSERT INTO Avion VALUES (F-WTSS Concorde 6570 SING)INSERT INTO Affreter VALUES(AF F-WTSS 15-05-2003 82)

-- avec pegravere inconnumysqlgt INSERT INTO Pilote VALUES (PL-5 Pb de Compagnie 0 )

ERROR 1452 (23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT`fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))

Web

4055_02_C02 Page 59 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

60 copy Eacuteditions Eyrolles

Il suffit de relire le script de creacuteation de vos tables pour en deacuteduire lrsquoordre drsquoinsertion des enre-gistrements

Coheacuterence du pegravere vers le fils

En fonction des options choisies au niveau de la contrainte reacutefeacuterentielle se trouvant dans latable laquo fils raquo

CONSTRAINT nomContrainte FOREIGN KEY hellip REFERENCES hellip

plusieurs sceacutenarios sont possibles pour assurer la coheacuterence de la table laquo pegravere raquo vers la table laquo fils raquo

Preacutevenir la modification ou la suppression drsquoune cleacute primaire (ou candidate) de la tablelaquo pegravere raquo Cette alternative est celle par deacutefaut Soit vous nrsquoajoutez pas drsquooption agrave la clauseREFERENCES ndash dans notre exemple toutes les cleacutes eacutetrangegraveres sont ainsi composeacutees ndash soitvous utilisez NO ACTION pour les directives ON DELETE et ON UPDATE La suppressiondrsquoun avion nrsquoest donc pas possible si ce dernier est reacutefeacuterenceacute dans un affregravetement

Propager la suppression des enregistrements laquo fils raquo associeacutes agrave lrsquoenregistrement laquo pegravere raquosupprimeacute Ce meacutecanisme est reacutealiseacute par la directive ON DELETE CASCADE Dans notre exem-ple nous pourrions ainsi deacutecider de supprimer tous les affregravetements degraves qursquoon retire un avion

Eacutetendre la modification de la cleacute primaire de lrsquoenregistrement laquo pegravere raquo aux enregistrementslaquo fils raquo associeacutes Ce meacutecanisme est reacutealiseacute par la directive ON UPDATE CASCADE Dansnotre exemple nous pourrions ainsi deacutecider de mettre agrave jour tous les affregravetements degravesqursquoon modifie lrsquoimmatriculation drsquoun avion

Propager lrsquoaffectation de la valeur nulle aux cleacutes eacutetrangegraveres des enregistrements laquo fils raquoassocieacutes agrave lrsquoenregistrement laquo pegravere raquo supprimeacute ou modifieacute Ce meacutecanisme est reacutealiseacute par ladirective ON DELETE SET NULL (ou ON UPDATE SET NULL en cas de modification dela cleacute primaire du laquo pegravere raquo) Dans ces deux cas il ne faut pas poser de contrainte NOTNULL sur la cleacute eacutetrangegravere Dans notre exemple nous pourrions ainsi deacutecider de mettreNULL dans la colonne compa de la table Pilote pour chaque pilote drsquoune compagniesupprimeacutee Nous ne pourrions pas appliquer ce meacutecanisme agrave la table Affreter quidispose de contraintes NOT NULL sur ses cleacutes eacutetrangegraveres (car composant la cleacute primaire)

RESTRICT est une directive de la norme SQL qui nrsquoest pas encore mise en œuvre sousMySQL Elle concerne les SGBD compatibles avec les contraintes diffeacutereacutees Pour lrsquoheure NOACTION (qui en principe diffegravere les contraintes) et RESTRICT (qui ne diffegravere pas les contraintes)jouent le mecircme rocircle

Les options DELETE CASCADE et DELETE SET NULL sont disponibles depuis laversion 32350 celles relatives agrave ON UPDATE sont disponibles depuis la version 408

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

4055_02_C02 Page 60 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 61

chapitre ndeg 2 Manipulation des donneacutees

Le tableau suivant deacutecrit quelques alternatives de coheacuterence agrave notre base de donneacutees exempleentre les tables Avion et Affreter puis Pilote et Compagnie

Pour lrsquoheure aucun deacuteclencheur ne peut ecirctre activeacute suite agrave la modification drsquoune colonneinduite drsquoune action de reacutepercussion (CASCADE ou SET NULL)

MySQL ne permet pas encore de propager une valeur par deacutefaut (set default) comme la normeSQL le preacutevoit

Tableau 2-16 Alternatives de coheacuterence du laquo pegravere raquo vers les laquo fils raquo

Alternatives Syntaxe Message drsquoerreur

Preacutevenir la modification de lrsquoimmatriculation drsquoun avion ou la suppression drsquoun avion

--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON DELETE NO ACTION ON UPDATE NO ACTION

mysqlgt DELETE FROM AvionERROR 1451 (23000) Cannot delete or update a parent row a foreign key constraint fails (`bdsoutouaffreter` CONSTRAINT `fk_Aff_na_Avion` FOREIGN KEY (`immat`) REFERENCES `avion` (`immat`)ON DELETE NO ACTION ON UPDATE NO ACTION)

Propager la suppression drsquoun avion

--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON DELETE CASCADE

Propager la modification de lrsquoimmatriculation drsquoun avion

--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON UPDATE CASCADE

Propager la modification du code de la compagnie dansles tables Pilote Avion et Affreter Affecter la valeur nulle dans la table Pilote suite agrave la suppression drsquoune compagnie tout en preacuteservant lrsquointeacutegriteacute avec la table Avion

--dans AffreterCONSTRAINT fk_Aff_comp_Compag FOREIGN KEY(compAff) REFERENCES Compagnie(comp) ON UPDATE CASCADE--dans AvionCONSTRAINT fk_Avion_comp_Compag FOREIGN KEY(proprio) REFERENCES Compagnie(comp) ON UPDATE CASCADE--dans PiloteCONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp) ON DELETE SET NULL ON UPDATE CASCADE

Web

4055_02_C02 Page 61 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

62 copy Eacuteditions Eyrolles

En reacutesumeacute

Le tableau suivant reacutesume les conditions requises pour modifier lrsquoeacutetat de la base de donneacutees enrespectant lrsquointeacutegriteacute reacutefeacuterentielle

Insertions agrave partir drsquoun fichier

Lrsquoimportation de donneacutees (au format fichier texte) dans une table peut ecirctre programmeacutee agravelrsquoaide de la directive LOAD DATA INFILE Un tel meacutecanisme lit un fichier dans un reacuteper-toire du serveur et insegravere tout ou partie des informations dans une table La syntaxe simplifieacuteede cette directive est la suivante

LOAD DATA INFILE nomEtCheminFichiertxt

[REPLACE | IGNORE] INTO TABLE nomTable

[FIELDS [TERMIATED BY string]

[[OPTIONALLY] ENCLOSED BY char]

[ESCAPED BY char ] ]

[LINES [STARTING BY string] [TERMINATED BY string] ]

[IGNORE number LINES]

REPLACE option agrave utiliser pour remplacer systeacutematiquement les anciens enregistrementspar les nouveaux (valeur de cleacute primaire ou drsquoindex unique)

IGNORE fait en sorte de ne pas inseacuterer des enregistrements de cleacute primaire ou drsquoindexunique deacutejagrave preacutesents dans la table

Tableau 2-17 Instructions SQL sur les cleacutes

Instructions Table laquo pegravere raquo Table laquo fils raquo

INSERT Correcte si la cleacute primaire (ou candidate) est unique

Correcte si la cleacute eacutetrangegravere est reacutefeacuterenceacutee dans la table laquo pegravere raquo ou est nulle (partiellement ou en totaliteacute)

UPDATE Correcte si lrsquoinstruction ne laisse pas drsquoenregistrements dans la table laquo fils raquo ayant une cleacute eacutetrangegravere non reacutefeacuterenceacutee

Correcte si la nouvelle cleacute eacutetrangegravere reacutefeacuterence un enregistrement laquo pegravere raquo existant

DELETE Correcte si aucun enregistrement de la table laquo fils raquo ne reacutefeacuterence le ou les enregistrements deacutetruits

Correcte sans condition

DELETE Cascade Correcte sans condition Sans objet

DELETE SET NULL Correcte sans condition Sans objet

UPDATE Cascade Correcte sans condition Sans objet

UPDATE SET NULL Correcte srsquoil nrsquoy a pas de NOT NULL dans la table laquo fils raquo

Sans objet

4055_02_C02 Page 62 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 63

chapitre ndeg 2 Manipulation des donneacutees

FIELDS deacutecrit comment sont formateacutees dans le fichier les valeur agrave inseacuterer dans la tableEn lrsquoabsence de cette clause TERMINATED BY vaut t ENCLOSED BY vaut etESCAPED BY vaut

ndash FIELDS TERMINATED BY deacutecrit le caractegravere qui seacutepare deux valeurs de colonnes

ndash FIELDS ENCLOSED BY permet de controcircler le caractegravere qui encadrera chaque valeurde colonne

ndash FIELDS ESCAPED BY permet de controcircler les caractegraveres speacuteciaux

LINES deacutecrit comment seront eacutecrites dans le fichier les lignes extraites de(s) table(s) Enlrsquoabsence de cette clause TERMINATED BY vaut n et STARTING BY vaut

IGNORE permet de ne pas importer les nb premiegraveres lignes du fichier (contenant des eacuteven-tuelles deacuteclarations)

Lisons le fichier laquo pilotestxt raquo situeacute dans le reacutepertoire laquo Ddev raquo (ouvert agrave lrsquoaide du Word-Pad dans la figure suivante) en important la totaliteacute des donneacutees dans la table Pilote2 creacuteeacutee agravecet effet (brevet VARCHAR(6) nom VARCHAR(16) nbHVol DECIMAL(72)compa CHAR(4) et PRIMARY KEY(brevet)) Notez lrsquoutilisation du double laquo raquo pour deacutesi-gner une arborescence Windows Le caractegravere NULL est importeacute par le caractegravere laquo N raquo

Une fois la table creacuteeacutee il est possible de lrsquointerroger

mysqlgt SELECT FROM Pilote2 ORDER BY compa nom

+--------+------------------+---------+-------+

| brevet | nom | nbHVol | compa |

+--------+------------------+---------+-------+

| PL-5 | Daniel Vielle | NULL | AF |

| PL-2 | Didier Donsez | 000 | AF |

| PL-1 | Gratien Viel | 45000 | AF |

| PL-4 | Placide Fresnais | 245000 | CAST |

| PL-3 | Richard Grin | 100000 | SING |

+--------+------------------+---------+-------+

Figure 2-12 Importation de donneacutees

LOAD DATA INFILE Ddevpilotestxt REPLACE INTO TABLE Pilote2FIELDS TERMINATED BY ENCLOSED BY LINES STARTING BY import -Pilote TERMINATED BY $ n

4055_02_C02 Page 63 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

64 copy Eacuteditions Eyrolles

Exercices

Les objectifs de ces exercices sont

drsquoinseacuterer des donneacutees dans les tables du scheacutema Parc Informatique

de creacuteer une seacutequence et drsquoinseacuterer des donneacutees en utilisant une seacutequence

de modifier des donneacutees

21 Insertion de donneacutees

Eacutecrire puis exeacutecuter le script SQL (que vous appellerez insParcsql) afin drsquoinseacuterer les donneacuteesdans les tables suivantes

Tableau 2-18 Donneacutees des tables

Table Donneacutees

Segment INDIP NOMSEGMENT ETAGE----------- -------------------- ----------13012080 Brin RDC13012081 Brin 1er eacutetage13012082 Brin 2e eacutetage

Salle NSALLE NOMSALLE NBPOSTE INDIP------- -------------------- ---------- -----------s01 Salle 1 3 13012080s02 Salle 2 2 13012080s03 Salle 3 2 13012080s11 Salle 11 2 13012081s12 Salle 12 1 13012081s21 Salle 21 2 13012082s22 Salle 22 0 13012083s23 Salle 23 0 13012083

Poste NPOSTE NOMPOSTE INDIP AD TYPEPOSTE NSALLE------- -------------------- ----------- --- --------- -------p1 Poste 1 13012080 01 TX s01p2 Poste 2 13012080 02 UNIX s01p3 Poste 3 13012080 03 TX s01p4 Poste 4 13012080 04 PCWS s02p5 Poste 5 13012080 05 PCWS s02p6 Poste 6 13012080 06 UNIX s03p7 Poste 7 13012080 07 TX s03p8 Poste 8 13012081 01 UNIX s11p9 Poste 9 13012081 02 TX s11p10 Poste 10 13012081 03 UNIX s12p11 Poste 11 13012082 01 PCNT s21p12 Poste 12 13012082 02 PCWS s21

4055_02_C02 Page 64 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 65

chapitre ndeg 2 Manipulation des donneacutees

22 Gestion drsquoune seacutequence

Dans ce mecircme script geacuterer la seacutequence associeacutee agrave la colonne numIns commenccedilant agrave la valeur 1 demaniegravere agrave inseacuterer les enregistrements suivants

Logiciel NLOG NOMLOG DATEACH VERSION TYPELOG PRIX ----- -------------------- ---------- ------- --------- --------log1 Oracle 6 1995-05-13 62 UNIX 3000log2 Oracle 8 1999-09-15 8i UNIX 5600log3 SQL Server 1998-04-12 7 PCNT 2700log4 Front Page 1997-06-03 5 PCWS 500log5 WinDev 1997-05-12 5 PCWS 750log6 SQLNet 20 UNIX 500log7 I I S 2002-04-12 2 PCNT 810log8 DreamWeaver 2003-09-21 20 BeOS 1400

Types TYPELP NOMTYPE--------- --------------------TX Terminal X-WindowUNIX Systegraveme UnixPCNT PC Windows NTPCWS PC WindowsNC Network Computer

Tableau 2-18 Donneacutees des tables (suite)

Table Donneacutees

Tableau 2-19 Donneacutees de la table Installer

Table Donneacutees

Installer NPOSTE NLOG NUMINS DATEINS DELAI------- --------- ------- -------- -------------------------p2 log1 1 2003-05-15p2 log2 2 2003-09-17p4 log5 3 p6 log6 4 2003-05-20p6 log1 5 2003-05-20p8 log2 6 2003-05-19p8 log6 7 2003-05-20p11 log3 8 2003-04-20p12 log4 9 2003-04-20p11 log7 10 2003-04-20p7 log7 11 2002-04-01

4055_02_C02 Page 65 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

Partie I SQL de base

66 copy Eacuteditions Eyrolles

23 Modification de donneacutees

Eacutecrire le script modificationsql qui permet de modifier (avec UPDATE) la colonne etage (pourlrsquoinstant nulle) de la table Segment afin drsquoaffecter un numeacutero drsquoeacutetage correct (0 pour le segment13012080 1 pour le segment 13012081 2 pour le segment 13012082)

Diminuer de 10 le prix des logiciels de type PCNT

Veacuterifier

SELECT FROM SegmentSELECT nLog typeLog prix FROM Logiciel

4055_02_C02 Page 66 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

67

Chapitre 3

Eacutevolution drsquoun scheacutema

Lrsquoeacutevolution drsquoun scheacutema est un aspect tregraves important agrave prendre en compte car il reacutepond auxbesoins de maintenance des applicatifs qui utilisent la base de donneacutees Nous verrons qursquoil estpossible de modifier une base de donneacutees drsquoun point de vue structurel (colonnes et index) maisaussi comportemental (contraintes)

Lrsquoinstruction principalement utiliseacutee est

ALTER TABLE

(commande du LDD) qui permetdrsquoajouter de renommer de modifier et de supprimer des colonnes drsquoune table Ellepermet aussi drsquoajouter et de supprimer des contraintes Avant de deacutetailler ces meacutecanis-mes eacutetudions la commande qui permet de renommer une table

Renommer une table (

RENAME

)

Lrsquoinstruction

RENAME

renomme une ou plusieurs tables ou vues Il faut posseacuteder le privilegravege

ALTER

et

DROP

sur la table drsquoorigine et

CREATE

sur la base

RENAME

[

nomBase

]

ancienNomTable

TO [

nomBase

]

nouveauNomTable

[[

nomBase

]

ancienNom2

TO [

nomBase

]

nouveauNom2

]]

Les contraintes drsquointeacutegriteacute index et preacuterogatives associeacutes agrave lrsquoancienne table sont automatique-ment transfeacutereacutes sur la nouvelle En revanche les vues et proceacutedures catalogueacutees sont invali-deacutees et doivent ecirctre recreacuteeacutees

Il est aussi possible drsquoutiliser lrsquooption

RENAME TO

de lrsquoinstruction

ALTER TABLE

pourrenommer une table existante Le tableau suivant deacutecrit comment renommer la table

Pilote

sans perturber lrsquointeacutegriteacute reacutefeacuterentielle

Tableau 3-1 Renommer une table

Commande RENAME Commande ALTER TABLE

RENAME

Pilote

TO

Naviguant

ALTER TABLE

Pilote

RENAME

TO

Naviguant

4055_03_C03 Page 67 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

68

copy Eacuteditions Eyrolles

Modifications structurelles (

ALTER TABLE

)

Consideacuterons la table suivante que nous allons faire eacutevoluer

Ajout de colonnes

La directive

ADD

de lrsquoinstruction

ALTER TABLE

permet drsquoajouter une nouvelle colonne agrave unetable Cette colonne est initialiseacutee agrave

NULL

pour tous les enregistrements (agrave moins de speacutecifierune contrainte

DEFAULT

auquel cas tous les enregistrements de la table sont mis agrave jour avecune valeur non nulle)

Il est possible drsquoajouter une colonne en ligne

NOT NULL

seulement si la table est vide ou si unecontrainte

DEFAULT

est deacutefinie sur la nouvelle colonne (dans le cas inverse il faudra utiliser

MODIFY

agrave la place de

ADD

)

Le script suivant ajoute trois colonnes agrave la table

Pilote

La premiegravere instruction insegravere lacolonne

nbHVol

en lrsquoinitialisant agrave

NULL

pour tous les pilotes (ici il nrsquoen existe qursquoune seule)La deuxiegraveme commande ajoute deux colonnes initialiseacutees agrave une valeur non nulle La colonne

ville

ne sera jamais nulle

ALTER TABLE

Pilote

ADD

(nbHVol DECIMAL(72))

ALTER TABLE

Pilote

ADD

(compa VARCHAR(4) DEFAULT AF

ville VARCHAR(30) DEFAULT Paris NOT NULL)

La table est deacutesormais la suivante

Figure 3-1

Table agrave modifier

CREATE TABLE Pilote (brevet VARCHAR(4) nom VARCHAR(20))

INSERT INTO Pilote VALUES (PL -1 Agnegraves Labat)

Pilote

brevet nom

PL-1 Agnegraves Labat

Figure 3-2

Table apregraves lrsquoajout de colonnes

Web

Pilote

brevet nom nbHVol compa ville

PL-1 Agnegraves Labat AF Paris

4055_03_C03 Page 68 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

69

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Renommer des colonnes

Il faut utiliser lrsquooption

CHANGE

de lrsquoinstruction

ALTER TABLE

pour renommer une colonneexistante Le nouveau nom de colonne ne doit pas ecirctre deacutejagrave utiliseacute dans la table Le type (avecune eacuteventuelle contrainte) doit ecirctre repreacuteciseacute La position de la colonne peut aussi ecirctre modi-fieacutee en mecircme temps La syntaxe geacuteneacuterale de cette option est la suivante

ALTER TABLE

[

nomBase

]

nomTable

CHANGE

[COLUMN]

ancienNom

nouveauNom

typeMySQL

[NOT NULL | NULL] [DEFAULT

valeur

]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT

chaine

] [REFERENCES ]

[FIRST|AFTER

nomColonne

]

Lrsquoinstruction suivante permet de renommer la colonne

ville

en

adresse

en la positionnantavant la colonne

compa

ALTER TABLE Pilote CHANGE ville adresse VARCHAR(30) AFTER nbHVol

Modifier le type des colonnes

Lrsquooption MODIFY de lrsquoinstruction ALTER TABLE modifie le type drsquoune colonne existantesans pour autant la renommer La syntaxe geacuteneacuterale de cette instruction est la suivante lesoptions sont les mecircmes que pour CHANGE

ALTER TABLE [nomBase]nomTable MODIFY [COLUMN] nomColonneAmodifier

typeMySQL [NOT NULL | NULL] [DEFAULT valeur]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT chaine] [REFERENCES ]

[FIRST|AFTER nomColonne]

Il est possible drsquoaugmenter la taille drsquoune colonne numeacuterique (largeur ou preacutecision) ndash ou drsquounechaicircne de caractegraveres (CHAR et VARCHAR) ndash ou de la diminuer si toutes les donneacutees preacutesentesdans la colonne peuvent srsquoadapter agrave la nouvelle taille

Attention agrave ne pas reacuteduire les colonnes indexeacutees agrave une taille infeacuterieure agrave celle deacuteclareacutee lors dela creacuteation de lrsquoindex

Les contraintes en ligne peuvent ecirctre aussi modifieacutees par cette instruction Une fois la colonnechangeacutee les nouvelles contraintes srsquoappliqueront aux mises agrave jour ulteacuterieures de la table et lesdonneacutees preacutesentes devront toutes veacuterifier cette nouvelle contrainte

4055_03_C03 Page 69 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

70 copy Eacuteditions Eyrolles

Le tableau suivant preacutesente diffeacuterentes modifications de colonnes

La table est deacutesormais la suivante

Valeurs par deacutefaut

Lrsquooption ALTER COLUMN de lrsquoinstruction ALTER TABLE modifie la valeur par deacutefaut drsquounecolonne existante La syntaxe geacuteneacuterale de cette instruction est la suivante

ALTER TABLE [nomBase]nomTable ALTER [COLUMN] nomColonneAmodifier

SET DEFAULT lsquochainersquo | DROP DEFAULT

Le script suivant deacutefinit une valeur par deacutefaut pour la colonne adresse puis supprime cellerelative agrave la colonne compa

ALTER TABLE Pilote ALTER COLUMN adresse SET DEFAULT Blagnac

ALTER TABLE Pilote ALTER COLUMN compa DROP DEFAULT

Supprimer des colonnes

Lrsquooption DROP de lrsquoinstruction ALTER TABLE permet de supprimer une colonne (aussi unindex ou une cleacute que nous eacutetudierons plus loin) La possibiliteacute de supprimer une colonne eacuteviteaux administrateurs drsquoexporter les donneacutees de recreacuteer une nouvelle table drsquoimporter les

Tableau 3-2 Modifications de colonnes

Instructions SQL Commentaires

ALTER TABLE Pilote MODIFY compa VARCHAR(6) DEFAULT SINGINSERT INTO Pilote (brevet nom) VALUES (PL-2 Laurent Boutrand)

Augmente la taille de la colonne compa et changela contrainte de valeur par deacutefaut puis insegravere unnouveau pilote

ALTER TABLE Pilote MODIFY compa CHAR(4) NOT NULL

Diminue la colonne et modifie eacutegalement son typede VARCHAR en CHAR tout en le deacuteclarant NOTNULL (possible car les donneacutees contenues dans lacolonne ne deacutepassent pas quatre caractegraveres)

ALTER TABLE Pilote MODIFY compa CHAR(4)

Rend possible lrsquoinsertion de valeur nulle dans lacolonne compa

Figure 3-3 Apregraves modification des colonnes

Pilote

brevet nom nbHVol adresse compa

PL-1 Agnegraves Labat Paris AF

PL-2 Laurent Boutrand Paris SING

CHAR(4)NULL possibleDeacutefaut lsquoSINGrsquo

4055_03_C03 Page 70 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 71

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

donneacutees et de recreacuteer les eacuteventuels index et contraintes Lorsqursquoune colonne est supprimeacutee lesindex qui lrsquoutilisent sont mis agrave jour voire eacutelimineacutes si toutes les colonnes qui le composent sonteffaceacutees La syntaxe des ces options est la suivante

ALTER TABLE [nomBase]nomTable DROP [COLUMN] nomColonne | PRIMARY KEY

| INDEX nomIndex | FOREIGN KEY nomContrainte

Il nrsquoest pas possible de supprimer avec cette instruction

bull toutes les colonnes drsquoune table

bull les colonnes qui sont cleacutes primaires (ou candidates par UNIQUE) reacutefeacuterenceacutees par des cleacuteseacutetrangegraveres

La suppression de la colonne adresse de la table Pilote est programmeacutee par lrsquoinstructionsuivante

ALTER TABLE Pilote DROP COLUMN adresse

Modifications comportementales

Nous eacutetudions dans cette section les meacutecanismes drsquoajout de suppression drsquoactivation et dedeacutesactivation de contraintes

Faisons eacutevoluer le scheacutema suivant Les seules contraintes existantes sont les cleacutes primairesnommeacutees pk_Compagnie pour la table Compagnie et pk_Avion pour la table Avion

Ajout de contraintes

Jusqursquoagrave preacutesent nous avons creacuteeacute les contraintes en mecircme temps que les tables Il est possiblede creacuteer des tables sans contraintes (dans ce cas lrsquoordre de geacuteneacuteration nrsquoest pas important et on

Figure 3-4 Scheacutema agrave faire eacutevoluer

Web

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85 SING F-GAFU 2003-02-05 155 AF F-WTSS 2003-05-15 82

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

4055_03_C03 Page 71 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

72 copy Eacuteditions Eyrolles

peut mecircme les eacutelaborer par ordre alphabeacutetique) puis drsquoajouter les contraintes Les outils deconception (WinrsquoDesign Designer ou PowerAMC) adoptent cette deacutemarche lors de la geacuteneacutera-tion automatique de scripts SQL

La directive ADD CONSTRAINT de lrsquoinstruction ALTER TABLE permet drsquoajouter une contrainteagrave une table Il est aussi possible drsquoajouter un index La syntaxe geacuteneacuterale est la suivante

ALTER TABLE [nomBase]nomTable ADD INDEX [nomIndex] [typeIndex] (nomColonne1) | CONSTRAINT nomContrainte typeContrainte

Trois types de contraintes sont possibles

UNIQUE (colonne1 [colonne2])

PRIMARY KEY (colonne1 [colonne2])

FOREIGN KEY (colonne1 [colonne2])

REFERENCES nomTablePegravere (col1 [col2])

[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]

[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]

Uniciteacute

Ajoutons la contrainte drsquouniciteacute portant sur la colonne du nom de la compagnie Un index estautomatiquement geacuteneacutereacute sur cette colonne agrave preacutesent

ALTER TABLE Compagnie ADD CONSTRAINT un_nomC UNIQUE (nomComp)

Cleacute eacutetrangegravere

Ajoutons la cleacute eacutetrangegravere (indexeacutee) agrave la table Avion au niveau de la colonne proprio en luiassignant une contrainte NOT NULL

ALTER TABLE Avion ADD INDEX (proprio)

ALTER TABLE Avion ADD CONSTRAINT fk_Avion_comp_Compag

FOREIGN KEY(proprio) REFERENCES Compagnie(comp)

ALTER TABLE Avion MODIFY proprio CHAR(4) NOT NULL

Cleacute primaire

Ajoutons agrave la table Affreter en une seule instruction sa cleacute primaire et deux cleacutes eacutetrangegrave-res (une vers la table Avion et lrsquoautre vers Compagnie)

ALTER TABLE Affrete ADD (CONSTRAINT pk_Affreter PRIMARY KEY (compAff immat dateAff)CONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES

Avion(immat)CONSTRAINT fk_Aff_comp_Compag FOREIGN KEY(compAff)

REFERENCES Compagnie(comp))

4055_03_C03 Page 72 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 73

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Pour que lrsquoajout ou la modification drsquoune contrainte soient possibles il faut que les donneacuteespreacutesentes dans la table concerneacutee ou reacutefeacuterenceacutee respectent la nouvelle contrainte

Les tables contiennent agrave preacutesent les contraintes suivantes

Suppression de contraintes

Il nrsquoexiste pas encore lrsquooption DROP CONSTRAINT agrave lrsquoinstruction ALTER TABLE poursupprimer une contrainte de nom donneacutee (peut-ecirctre parce que les contraintes CHECK ne sontpas encore consideacutereacutees et car la prise en compte des contraintes a eacuteteacute eacutetaleacutee au fil des versionssuccessives de MySQL) Il faut donc utiliser une directive diffeacuterente de lrsquoinstruction ALTERTABLE pour supprimer chaque type de contrainte

Contrainte NOT NULL

Il faut utiliser la directive MODIFY de lrsquoinstruction ALTER TABLE pour supprimer unecontrainte NOT NULL existant sur une colonne Dans notre exemple deacutetruisons la contrainteNOT NULL de la cleacute eacutetrangegravere proprio dans la table Avion

ALTER TABLE Avion MODIFY proprio CHAR(4) NULL

Contrainte UNIQUE

Il faut utiliser la directive DROP INDEX de lrsquoinstruction ALTER TABLE pour supprimer unecontrainte drsquouniciteacute Dans notre exemple effaccedilons la contrainte portant sur le nom de lacompagnie Lrsquoindex est eacutegalement deacutetruit

ALTER TABLE Compagnie DROP INDEX un_nomC

Figure 3-5 Apregraves ajout de contraintes

Web Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85 SING F-GAFU 2003-02-05 155 AF F-WTSS 2003-05-15 82

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

referenced parent

referenced parent

dependent child dependent child NOT NULL

4055_03_C03 Page 73 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

74 copy Eacuteditions Eyrolles

Cleacute eacutetrangegravere

Lrsquooption DROP FOREIGN KEY de lrsquoinstruction ALTER TABLE permet de supprimer une cleacuteeacutetrangegravere drsquoune table La syntaxe geacuteneacuterale est la suivante

ALTER TABLE [nomBase]nomTable DROP FOREIGN KEY nomContrainte

Le nom de la contrainte est celui qui a eacuteteacute deacuteclareacute lors de la creacuteation de la table soit lors de samodification (dans CREATE TABLE ou ALTER TABLE)

Si la contrainte a eacuteteacute deacutefinie sans ecirctre nommeacutee son nom est geacuteneacutereacute par le moteur InnoDB etlrsquoinstruction SHOW CREATE TABLE [nomBase]nomTable permet de le deacutecouvrir

Deacutetruisons la cleacute eacutetrangegravere de la colonne proprio

ALTER TABLE Avion DROP FOREIGN KEY fk_Avion_comp_Compag

Cleacute primaire

Lrsquooption DROP PRIMARY KEY de lrsquoinstruction ALTER TABLE permet de supprimer une cleacuteprimaire Dans des versions preacuteceacutedentes de MySQL si aucune cleacute primaire nrsquoexistait lapremiegravere contrainte UNIQUE disparaissait agrave la place Ce nrsquoest plus le cas depuis la version 51

Si la colonne cleacute primaire agrave supprimer contient des cleacutes eacutetrangegraveres il faut drsquoabord retirer lescontraintes de cleacute eacutetrangegravere Si la cleacute primaire agrave supprimer est reacutefeacuterenceacutee par des cleacutes eacutetran-gegraveres drsquoautres tables il faut drsquoabord ocircter les contraintes de cleacute eacutetrangegravere de ces autres tables

Ainsi pour supprimer la cleacute primaire de la table Affreter il faut drsquoabord enlever les deuxcontraintes de cleacute eacutetrangegravere concernant des colonnes composant la cleacute primaire

ALTER TABLE Affreter DROP FOREIGN KEY fk_Aff_na_Avion

ALTER TABLE Affreter DROP FOREIGN KEY fk_Aff_comp_Compag

ALTER TABLE Affreter DROP PRIMARY KEY

La figure suivante illustre les contraintes qui restent actives les cleacutes primaires des tablesCompagnie et Avion et une contrainte de non nulliteacute

Aucun ordre particulier nrsquoest neacutecessaire pour supprimer ces trois contraintes car il nrsquoy a plusde contrainte reacutefeacuterentielle active

4055_03_C03 Page 74 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 75

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Concernant tout scheacutema il faut eacuteliminer drsquoabord les contraintes de cleacute eacutetrangegravere des tableslaquo fils raquo puis laquo pegravere raquo puis les contraintes de cleacute primaire Il suffit pour eacuteviter toute incoheacuterencede deacutetruire les contraintes dans lrsquoordre inverse drsquoapparition dans le script de creacuteation

Deacutesactivation des contraintes

La deacutesactivation des contraintes reacutefeacuterentielles peut ecirctre inteacuteressante pour acceacuteleacuterer des proceacute-dures de chargement drsquoimportation et drsquoexportation massives de donneacutees externes Ce meacuteca-nisme ameacuteliore aussi les performances de programmes batchs qui ne modifient pas desdonneacutees concerneacutees par lrsquointeacutegriteacute reacutefeacuterentielle ou pour lesquelles on veacuterifie la coheacuterence dela base agrave la fin En effet les index ne sont pas mis agrave jour pour chaque insertion ou modificationet aucun ordre nrsquoest requis pour inseacuterer ou supprimer des enregistrements

Syntaxe

Lrsquoinstruction SET FOREIGN_KEY_CHECKS=0 permet de deacutesactiver temporairement(jusqursquoagrave la reacuteactivation) toutes les contraintes reacutefeacuterentielles drsquoune base

Nrsquoessayez pas de deacutesactiver lrsquointeacutegriteacute reacutefeacuterentielle avec lrsquooption DISABLE KEYS de lrsquoinstruc-tion ALTER TABLE Cette option concerne les tables MyISAM et speacutecifie seulement de ne pasmettre agrave jour les index non uniques

Exemple

En consideacuterant lrsquoexemple suivant deacutesactivons les contraintes drsquointeacutegriteacute reacutefeacuterentielle ettentons drsquoinseacuterer des enregistrements ne respectant aucune contrainte (drsquointeacutegriteacute reacutefeacuterentielleet autres)

Figure 3-6 Apregraves suppression de contraintes

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85SING F-GAFU 2003-02-05 155

AF F-WTSS 2003-05-15 82

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING

NULL

4055_03_C03 Page 75 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

76 copy Eacuteditions Eyrolles

On remarque bien que seules les cleacutes eacutetrangegraveres ne sont plus veacuterifieacutees Toute autre contrainte(UNIQUE PRIMARY KEY et NOT NULL) reste active Lrsquoeacutetat de la base est deacutesormais commesuit

Bien qursquoil semble incoheacuterent de reacuteactiver les contraintes sans srsquooccuper au preacutealable desvaleurs ne respectant pas lrsquointeacutegriteacute reacutefeacuterentielle (donneacutees noteacutees en gras) nous verrons qursquoilest possible de le faire

Figure 3-7 Avant la deacutesactivation de contraintes

Web Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING

referenced parent

referenced parent

dependent child dependent child NOT NULL

UNIQUE

Tableau 3-3 Insertions apregraves la deacutesactivation de lrsquointeacutegriteacute reacutefeacuterentielle

Instructions valides Instructions non valides

mysqlgt SET FOREIGN_KEY_CHECKS=0

mysqlgt INSERT INTO Avion VALUES ( TB-22 500 Toto)Query OK 1 row affected (004 sec)

mysqlgt INSERT INTO Avion VALUES (Bidon1 TB-21 1000 AF)Query OK 1 row affected (010 sec)

mysqlgt INSERT INTO Affreter VALUES (AF Toto 2005-05-13 0)Query OK 1 row affected (010 sec)

mysqlgt INSERT INTO Affreter VALUES (GTI F-WTSS 2005-11-0710)Query OK 1 row affected (002 sec)

mysqlgt INSERT INTO Affreter VALUES (GTI Toto 2005-11-0740)Query OK 1 row affected (003 sec)

mysqlgt INSERT INTO Compagnie VALUES (GTR 1 Brassens Blagnac

)ERROR 1062 (23000) Duplicate entry Air France for key 2

mysqlgt INSERT INTO Avion VALUES (Bidon1 TB-20 2000 NULL)ERROR 1048 (23000) Column proprio cannot be null

mysqlgt INSERT INTO Avion VALUES ( TB-21 1000 AF)ERROR 1062 (23000) Duplicate entry F-GLFS for key 1

Web

F-GLFS AirFrance

F-GLFS

4055_03_C03 Page 76 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 77

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Reacuteactivation des contraintes

Lrsquoinstruction SET FOREIGN_KEY_CHECKS=1 permet de reacuteactiver toutes les contraintesreacutefeacuterentielles drsquoune base

Nrsquoessayez pas de deacutesactiver lrsquointeacutegriteacute reacutefeacuterentielle avec lrsquooption ENABLE KEYS de lrsquoinstructionALTER TABLE Cette option concerne les tables MyISAM et speacutecifie de mettre agrave jour les indexnon uniques

Syntaxe

La reacuteactivation totale de lrsquointeacutegriteacute reacutefeacuterentielle de la base se programme ainsi

mysqlgt SET FOREIGN_KEY_CHECKS=1

Lrsquointeacutegriteacute est assureacutee de nouveau mais ne concerne que les mises agrave jour agrave venir (ajoutsdrsquoenregistrements modifications de colonnes et suppressions drsquoenregistrements) Les eacuteven-tuelles donneacutees preacutesentes dans les tables qui ne veacuterifient pas lrsquointeacutegriteacute sont toujours en base

Reacutecupeacuteration de donneacutees erroneacutees

Il nrsquoexiste pas pour lrsquoheure de meacutethode de reacutecupeacuteration automatique comme Oracle lepropose par exemple avec la directive EXCEPTIONS INTO de lrsquoinstruction ALTER TABLEEn conseacutequence il faut programmer des requecirctes drsquoextraction (eacutetudieacutees au chapitre 4) quipermettent des recherches drsquoenregistrements sous critegraveres

Le tableau suivant deacutecrit les deux requecirctes agrave programmer afin drsquoextraire les enregistrementsposant problegraveme Ici nous extrayons les avions qui reacutefeacuterencent une compagnie inexistante etles affregravetements qui reacutefeacuterencent une compagnie inexistante ou un avion inexistant Une fois

Figure 3-8 Apregraves la deacutesactivation des contraintes reacutefeacuterentielles

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

Affreter

compAff immat dateAff nbPax

AF F-WTSS 2003-05-13 82 AF Toto 2005-05-13 0GTI F-WTSS 2005-11-07 10GTI Toto 2005-11-07 40

Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GLFS TB-22 500 Toto

4055_03_C03 Page 77 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

78 copy Eacuteditions Eyrolles

extraits il faudra statuer pour chacun drsquoeux entre une modification de telle ou telle colonne oubien une suppression Il apparaicirct que quatre enregistrements ne respectent pas des contraintes

Deacutesactivez de nouveau lrsquointeacutegriteacute reacutefeacuterentielle avant de modifier les enregistrements ne veacuteri-fiant pas les contraintes car sinon certaines modifications coheacuterentes ne pourraient avoir lieuagrave cause de la veacuterification reacutefeacuterentielle sur des valeurs erroneacutees (dans notre exemple si on veutmodifier la compagnie GTI du dernier affregravetement lrsquoerreur portera sur la colonne immat)

Dans notre exemple choisissons

Drsquoaffecter la compagnie AF aux avions appartenant agrave des compagnies non reacutefeacuterenceacuteesdans la table Avion Notez qursquoil faut compleacuteter par deux espaces le code compagnie(CHAR inutile srsquoil avait eacuteteacute VARCHAR) et qursquoon utilise la mecircme requecircte que preacuteceacutedem-ment

SET FOREIGN_KEY_CHECKS=0

UPDATE Avion SET proprio =

WHERE proprio

De modifier la compagnie GTI par la compagnie SING dans la table Affreter et touteimmatriculation drsquoavion inexistant en F-GLFS

UPDATE Affreter SET compAff =SING WHERE compAff =

UPDATE Affreter SET immat=F-GLFS

WHERE immat

Maintenant il conviendra de reacuteactiver lrsquointeacutegriteacute reacutefeacuterentielle Lrsquoeacutetat de la base avec lescontraintes reacuteactiveacutees est le suivant (les mises agrave jour sont en gras)

Tableau 3-4 Enregistrements posant problegraveme

Table Avion Table Affreter

mysqlgt SELECT immatproprio FROM Avion WHERE proprio NOT IN (SELECT comp FROM Compagnie)

+--------+---------+| immat | proprio |+--------+---------+| F-GLFS | Toto |+--------+---------+

mysqlgt SELECT compAffimmatdateAff FROM Affreter WHERE compAff NOT IN (SELECT comp FROM Compagnie) OR immat NOT IN (SELECT immat FROM Avion)+---------+--------+------------+| compAff | immat | dateAff |+---------+--------+------------+| GTI | F-WTSS | 2005-11-07 || AF | Toto | 2005-05-13 || GTI | Toto | 2005-11-07 |+---------+--------+------------+

AF

NOT IN (SELECT comp FROM Compagnie)

GTI

NOT IN (SELECT immat FROM Avion)

4055_03_C03 Page 78 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 79

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Contraintes diffeacutereacutees

Les contraintes que nous avons eacutetudieacutees jusqursquoagrave maintenant sont des contraintes immeacutediates(immediate) qui sont controcircleacutees apregraves chaque instruction Une contrainte est dite laquo diffeacutereacutee raquo(deferred) si elle deacuteclenche sa veacuterification seulement agrave la fin de la transaction (premiegravereinstruction commit rencontreacutee) Pour lrsquoheure MySQL avec InnoDB ne propose pas ce modede programmation

Figure 3-9 Tables apregraves modifications et reacuteactivation des contraintes

Compagnie

comp nrue rue ville nomComp

AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL

AffretercompAff immat dateAff nbPax

AF F-WTSS 2003-05-13 85 AF F-GLFS 2005-05-13 0SING F-WTSS 2005-11-07 10SING F-GLFS 2005-11-07 40

referenced parent

dependent child

NOT NULL Avion

immat typeAvion nbHVol proprio

F-WTSS Concorde 6570 SING F-GLFS TB-22 500 AF

dependent child

4055_03_C03 Page 79 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

80 copy Eacuteditions Eyrolles

Exercices

Les objectifs de ces exercices sont

drsquoajouter et de modifier des colonnes

drsquoajouter des contraintes

de traiter les erreurs

31 Ajout de colonnes

Eacutecrire le script eacutevolutionsql qui contient les instructions neacutecessaires pour ajouter les colonnessuivantes (avec ALTER TABLE) Le contenu de ces colonnes sera modifieacute ulteacuterieurement

Veacuterifier la structure et le contenu de chaque table avec DESCRIBE et SELECT

32 Modification de colonnes

Dans ce mecircme script rajouter les instructions neacutecessaires pour

bull augmenter la taille dans la table Salle de la colonne nomSalle (passer agrave VARCHAR(30))

bull diminuer la taille dans la table Segment de la colonne nomSegment agrave VARCHAR(15)

bull tenter de diminuer la taille dans la table Segment de la colonne nomSegment agrave VARCHAR(14)Pourquoi la commande nrsquoest-elle pas possible

Veacuterifier la structure et le contenu de chaque table avec DESCRIBE et SELECT

33 Ajout de contraintes

Ajouter la contrainte afin de srsquoassurer qursquoon ne puisse installer plusieurs fois le mecircme logiciel sur unposte de travail donneacute

Ajouter les contraintes de cleacutes eacutetrangegraveres pour assurer lrsquointeacutegriteacute reacutefeacuterentielle (avec ALTER TABLEhellipADD CONSTRAINThellip) entre les tables suivantes Adopter les conventions recommandeacutees dans lechapitre 1 (comme indiqueacute pour la contrainte entre Poste et Types)

Si lrsquoajout drsquoune contrainte reacutefeacuterentielle renvoie une erreur veacuterifier les enregistrements des tableslaquo pegraveres raquo et laquo fils raquo (notamment au niveau de la casse des chaicircnes de caractegraveres Tx est diffeacuterent deTX par exemple)

Tableau 3-5 Donneacutees de la table Installer

Table Nom type et signification des nouvelles colonnes

Segment nbSalle TINYINT(2) nombre de salles par deacutefaut = 0nbPoste TINYINT(2) nombre de postes par deacutefaut = 0

Logiciel nbInstall TINYINT(2) nombre drsquoinstallations par deacutefaut = 0

Poste nbLog TINYINT(2) nombre de logiciels installeacutes par deacutefaut = 0

4055_03_C03 Page 80 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 81

chapitre ndeg 3 Eacutevolution drsquoun scheacutema

Modifier le script SQL de destruction des tables (dropParcsql) en fonction des nouvelles contrain-tes Lancer ce script puis tous ceux eacutecrits jusqursquoici

34 Traitements des erreurs

Tentez drsquoajouter les contraintes de cleacutes eacutetrangegraveres entre les tables Salle et Segment et entreLogiciel et Types (en gras dans le scheacutema suivant)

Figure 3-10 Contraintes reacutefeacuterentielles agrave creacuteer

SegmentindIP nomSegment etage nbSalle nbPoste

SallenSalle nomSalle nbPoste indIP

PostenPoste nomPoste indIP ad typePoste nSalle nbLog

LogicielnLog nomLog dateAch version typeLog prix nbInstall

InstallernPoste nLog numIns dateIns delai

TypestypeLP nomType

fk_Poste_typePoste_Types

Figure 3-11 Contraintes reacutefeacuterentielles agrave creacuteer

SegmentindIP nomSegment etage nbSalle nbPoste

SallenSalle nomSalle nbPoste indIP

PostenPoste nomPoste indIP ad typePoste nSalle nbLog

LogicielnLog nomLog dateAch version typeLog prix nbInstall

InstallernPoste nLog numIns dateIns delai

TypestypeLP nomType

4055_03_C03 Page 81 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

Partie I SQL de base

82 copy Eacuteditions Eyrolles

La mise en place de ces contraintes doit renvoyer une erreur car

bull Il existe des salles (s22 et s23) ayant un numeacutero de segment inexistant dans la table Segment

bull Il existe un logiciel (log8) dont le type nrsquoest pas reacutefeacuterenceacute dans la table Types

Extraire les enregistrements qui posent problegraveme (numeacutero des salles pour le premier cas numeacutero delogiciel pour le second) Supprimer les enregistrements de la table Salle qui posent problegraveme Ajou-ter le type de logiciel (BeOS Systegraveme Be) dans la table Types

Exeacutecuter agrave nouveau lrsquoajout des deux contraintes de cleacute eacutetrangegravere Veacuterifier que les instructions nerenvoient plus drsquoerreur et que les deux requecirctes drsquoextraction ne renvoient aucune donneacutee

4055_03_C03 Page 82 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

83

Chapitre 4

Interrogation des donneacutees

Ce chapitre traite de lrsquoaspect le plus connu du langage SQL qui concerne lrsquoextraction desdonneacutees par requecirctes (nom donneacute aux instructions

SELECT

) Une requecircte permet de rechercherdes donneacutees dans une ou plusieurs tables ou vues agrave partir de critegraveres simples ou complexes Lesinstructions

SELECT

peuvent ecirctre exeacutecuteacutees dans lrsquointerface de commande (voir les exemples dece chapitre) ou au sein drsquoun programme SQL (proceacutedure catalogueacutee) PHP Java C etc

Geacuteneacuteraliteacutes

Lrsquoinstruction

SELECT

est une commande deacuteclarative (elle deacutecrit ce que lrsquoon cherche sans expli-quer le moyen drsquoopeacuterer) Agrave lrsquoinverse une instruction proceacutedurale (comme un programme)deacutevelopperait le moyen pour reacutealiser lrsquoextraction de donneacutees (comme le chemin agrave emprunter

entre des tables ou une iteacuteration pour parcourir un ensemble drsquoenregistrements)

La figure suivante scheacutematise les principales fonctionnaliteacutes de lrsquoinstruction

SELECT

Celle-ciest composeacutee drsquoune directive

FROM

qui preacutecise la (les) table(s) interrogeacutee(s) et drsquoune directive

WHERE

qui contient les critegraveres

Figure 4-1

Possibiliteacutes de lrsquoinstruction

SELECT

Pilote

Compagnie

Air France

Jointure1 (WHERE )

Restriction (WHERE )Projection (SELECT )

Jointure2

Avion

4055_04_C04 Page 83 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

84

copy Eacuteditions Eyrolles

La restriction qui est programmeacutee dans le

WHERE

de la requecircte permet de restreindre larecherche agrave une ou plusieurs lignes Dans notre exemple une restriction reacutepond agrave laquestion laquo

Quels sont les avions de type A320

raquo

La projection qui est programmeacutee dans le

SELECT

de la requecircte permet drsquoextraire une ouplusieurs colonnes Dans notre exemple elle reacutepond agrave la question laquo

Quels sont les numeacute-ros de brevet et les nombres drsquoheures de vol de tous les pilotes

raquo

La jointure qui est programmeacutee dans le

WHERE

de la requecircte permet drsquoextraire des donneacuteesde diffeacuterentes tables en les reliant deux agrave deux (le plus souvent agrave partir de contraintes reacutefeacute-rentielles) Dans notre exemple la premiegravere jointure reacutepond agrave la question laquo

Quels sont lesnumeacuteros de brevet et nombres drsquoheures de vol des pilotes de la compagnie de nom AirFrance

raquo La deuxiegraveme jointure reacutepond agrave la question laquo

Quels sont les avions de lacompagnie de nom Air France

raquo

En combinant ces trois fonctionnaliteacutes toute question logique devrait trouver en theacuteorie unereacuteponse par une ou plusieurs requecirctes Les questions trop complexes peuvent ecirctre program-meacutees agrave lrsquoaide des vues (chapitre 5) ou par traitement (programmes meacutelangeant requecirctes etinstructions proceacutedurales)

Syntaxe (

SELECT

)

Pour pouvoir extraire des enregistrements drsquoune table il faut que celle-ci soit dans votre baseou que vous ayez reccedilu le privilegravege

SELECT

sur la table

La syntaxe SQL simplifieacutee de lrsquoinstruction

SELECT

est la suivante

SELECT

[ DISTINCT | DISTINCTROW | ALL ]

listeColonnes

FROM

nomTable1

[

nomTable2

]

[ WHERE

condition

]

[

clauseRegroupement

]

[ HAVING

condition

]

[

clauseOrdonnancement

]

[ LIMIT [

rangDeacutepart

]

nbLignes

]

Nous deacutetaillerons chaque option agrave lrsquoaide drsquoexemples au cours de ce chapitre

Pseudotable

La pseudotable est une table qui nrsquoa pas de nom et qui est utile pour eacutevaluer une expression dela maniegravere suivante

laquo SELECT

expression

raquo

Les reacutesultats fournis seront uniques (siaucune jointure ou opeacuterateur ensembliste ne sont employeacutes dans lrsquointerrogation)

4055_04_C04 Page 84 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

85

chapitre ndeg 4 Interrogation des donneacutees

Projection (eacuteleacutements du

SELECT

)

Eacutetudions la partie de lrsquoinstruction

SELECT

qui permet de programmer lrsquoopeacuterateur de projec-tion (surligneacute dans la syntaxe suivante)

SELECT

FROM

nomTable

[

aliasTable

]

[

clauseOrdonnancement

]

[ LIMIT [

rangDeacutepart

]

nbLignes

]

DISTINCT

et

DISTINCTROW

jouent le mecircme rocircle agrave savoir ne pas inclure les duplicatas

ALL

prend en compte les duplicatas (option par deacutefaut)

listeColonnes

|

expression1

[[AS]

alias1

] [

expression2

[[AS]

alias2

]

ndash

extrait toutes les colonnes de la table

ndash

expression

nom de colonne fonction SQL constante ou calcul

ndash

alias

renomme lrsquoexpression (nom valable pendant la dureacutee de la requecircte)

FROM

deacutesigne la table (qui porte un alias ou non) agrave interroger

Tableau 4-1 Extraction drsquoexpressions

Besoin Requecircte et reacutesultat

Aucun utilisation proba-blement la plus superflue

mysqlgt SELECT Il reste encore beaucoup de pages+------------------------------------+| Il reste encore beaucoup de pages |+------------------------------------+| Il reste encore beaucoup de pages |+------------------------------------+

Jrsquoai oublieacute ma montre

mysqlgt SELECT SYSDATE() Maintenant +---------------------+| Maintenant |+---------------------+| 2005-11-07 091546 |+---------------------+

Pour les matheux qui vou-draient retrouver le reacutesul-tat de 2

14

le carreacute du cosi-nus de 3

π

sur 2 et e

1

mysqlgt SELECT POWER(214) POWER(COS(135314159265359180)2) Environ EXP(1)+-------------+------------------+----------------+| POWER(214) | Environ | EXP(1) |+-------------+------------------+----------------+| 16384 | 050000000000015 | 2718281828459 |+-------------+------------------+----------------+

[ DISTINCT | DISTINCTROW | ALL ] listeColonnes

4055_04_C04 Page 85 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

86

copy Eacuteditions Eyrolles

clauseOrdonnancement tri sur une ou plusieurs colonnes ou expressions

LIMIT pour limiter le nombre de lignes apregraves reacutesultat

Interrogeons la table suivante en utilisant chaque option

Extraction de toutes les colonnes

Lrsquoextraction de toutes les colonnes drsquoune table requiert lrsquoutilisation du symbole laquo raquo

Extraction de certaines colonnes

La liste des colonnes agrave extraire se trouve dans la clause SELECT

Figure 4-2 Table Pilote

VARCHAR(6) VARCHAR(16) DECIMAL(72) CHAR(4)

Pilote

brevet nom nbHVol compa

PL-1 Gratien Viel 450 AF PL-2 Didier Donsez 0 AF PL-3 Richard Grin 1000 SING PL-4 Placide Fresnais 2450 CAST PL-5 Daniel Vielle AF

Tableau 4-2 Utilisation de laquo raquo

Requecircte SQL Reacutesultat

mysqlgt SELECT FROM Pilote

+--------+------------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+------------------+---------+-------+| PL-1 | Gratien Viel | 45000 | AF || PL-2 | Didier Donsez | 000 | AF || PL-3 | Richard Grin | 100000 | SING || PL-4 | Placide Fresnais | 245000 | CAST || PL-5 | Daniel Vielle | NULL | AF |+--------+------------------+---------+-------+

Web

Tableau 4-3 Liste de colonnes

Requecircte SQL Reacutesultat

SELECT compa brevet FROM Pilote

+-------+--------+| compa | brevet |+-------+--------+| AF | PL-1 || AF | PL-2 || SING | PL-3 || CAST | PL-4 || AF | PL-5 |+-------+--------+

Web

4055_04_C04 Page 86 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 87

chapitre ndeg 4 Interrogation des donneacutees

Alias

Les alias permettent de renommer des colonnes agrave lrsquoaffichage ou des tables dans la requecircte Lesalias de colonnes sont utiles pour les calculs

Lrsquoutilisation de la directive AS est facultative (pour se rendre conforme agrave SQL2)

Il faut preacutefixer les colonnes par lrsquoalias de la table lorsqursquoil existe

Il semble preacutefeacuterable drsquoutiliser la directive AS afin qursquoil nrsquoy ait pas drsquoambiguiumlteacute dans lrsquoexpression(oubli drsquoune virgule) SELECT col1 col2 FROM nomTable ougrave MySQL interpreacutetera la secondecolonne comme un alias de la premiegravere

Duplicatas

Les directives DISTINCT ou DISTINCTROW eacuteliminent les eacuteventuels duplicatas Pour ladeuxiegraveme requecircte les eacutecritures laquo DISTINCT compa raquo laquo DISTINCTROW(compa) raquo etlaquo DISTINCTROW compa raquo sont eacutequivalentes La notation entre parenthegraveses est neacutecessairelorsque lrsquoon deacutesire eacuteliminer des duplicatas par paires triplets etc

Tableau 4-4 Alias (colonnes et tables)

Alias de colonnes Alias de table

SELECT compa AS c1 nom AS NometPrenom brevet c3 FROM Pilote

+------+------------------+------+| c1 | NometPrenom | c3 |+------+------------------+------+| AF | Gratien Viel | PL-1 || AF | Didier Donsez | PL-2 || SING | Richard Grin | PL-3 || CAST | Placide Fresnais | PL-4 || AF | Daniel Vielle | PL-5 |+------+------------------+------+

SELECT aliasPilotescompa AS c1 aliasPilotesnom FROM Pilote aliasPilotes

+------+------------------+| c1 | nom |+------+------------------+| AF | Gratien Viel || AF | Didier Donsez || SING | Richard Grin || CAST | Placide Fresnais || AF | Daniel Vielle |+------+------------------+

Web

4055_04_C04 Page 87 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

88 copy Eacuteditions Eyrolles

Expressions et valeurs nulles

Il est possible drsquoeacutevaluer et drsquoafficher simultaneacutement des expressions dans la clause SELECT(types numeacuteriques DATE et DATETIME)

Les opeacuterateurs arithmeacutetiques sont eacutevalueacutes par ordre de prioriteacute ( + et -)

Le reacutesultat drsquoune expression comportant une valeur NULL est eacutevalueacute agrave NULL

Nous avons deacutejagrave eacutetudieacute les opeacuterations sur les dates et intervalles (chapitre 2) Dans lrsquoexemplesuivant lrsquoexpression 10nbHVol+52 est calculeacutee en multipliant par 10 le nombre drsquoheuresde vol puis en ajoutant le reacutesulat de 5 diviseacute par 2 Dans le second exemple on convertit lemoment actuel (anneacutee mois jour heures minutes et secondes) en un entier

Tableau 4-5 Gestion des duplicatas

Avec duplicata Sans duplicata

SELECT compa FROM Pilote

+-------+| compa |+-------+| AF || AF || SING || CAST || AF |+-------+

SELECT DISTINCT(compa) FROM Pilote

+-------+| compa |+-------+| AF || SING || CAST |+-------+

Web

Tableau 4-6 Expressions numeacuteriques

Requecircte Reacutesultat

SELECT brevet nbHVol nbHVolnbHVol AS auCarre 10nbHVol+52 FROM Pilote

+--------+---------+--------------+---------------+| brevet | nbHVol | auCarre | 10nbHVol+52 |+--------+---------+--------------+---------------+| PL-1 | 45000 | 2025000000 | 45025000 || PL-2 | 000 | 00000 | 25000 || PL-3 | 100000 | 10000000000 | 100025000 || PL-4 | 245000 | 60025000000 | 245025000 || PL-5 | NULL | NULL | NULL |+--------+---------+--------------+---------------+

SELECT SYSDATE()+0 +----------------+| SYSDATE()+0 |+----------------+| 20051107145522 |+----------------+

Web

4055_04_C04 Page 88 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 89

chapitre ndeg 4 Interrogation des donneacutees

Ordonnancement

Pour trier le reacutesultat drsquoune requecircte il faut speacutecifier la clause drsquoordonnancement par ORDERBY de la maniegravere suivante

ORDER BY

expression1 | position1 | alias1 [ASC | DESC]

[expr2 | position2 | alias2 [ASC | DESC]

expression nom de colonne fonction SQL constante calcul

position entier qui deacutesigne lrsquoexpression (au lieu de la nommer) dans son ordre drsquoappa-rition dans la clause SELECT

ASC ou DESC tri ascendant ou descendant (par deacutefaut ASC)

Dans lrsquoexemple suivant on remarque que la valeur NULL est consideacutereacutee comme plus petiteque 0

Concateacutenation

Lrsquoopeacuterateur de concateacutenation se programme agrave lrsquoaide de la fonction CONCAT qui admet deuxchaicircnes de caractegraveres en paramegravetre Cette fonction permet de concateacutener diffeacuterentes expres-sions (colonnes calculs reacutesultats de fonctions SQL ou constantes) sous reacuteserve drsquoeacuteventuellesconversions (casting) La colonne reacutesultante est consideacutereacutee comme une chaicircne de caractegraveres

Lrsquoexemple suivant preacutesente un alias dans lrsquoen-tecircte de colonne (Embauche) qui met enforme les reacutesultats La concateacutenation concerne deux colonnes et la constante vole pour

Tableau 4-7 Ordonnancement

Options par deacutefaut Ordre deacutecroissant (et NULL)

mysqlgt SELECT brevet nom FROM Pilote

+--------+------------------+| brevet | nom |+--------+------------------+| PL-5 | Daniel Vielle || PL-2 | Didier Donsez || PL-1 | Gratien Viel || PL-4 | Placide Fresnais || PL-3 | Richard Grin |+--------+------------------+

mysqlgt SELECT brevetnbHVol FROM Pilote

+--------+---------+| brevet | nbHVol |+--------+---------+| PL-4 | 245000 || PL-3 | 100000 || PL-1 | 45000 || PL-2 | 000 || PL-5 | |+--------+---------+

WebORDER BY nom ORDER BY nbHvol DESC

NULL

4055_04_C04 Page 89 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

90 copy Eacuteditions Eyrolles

Insertion multiligne

Nous pouvons maintenant deacutecrire lrsquoinsertion multiligne eacutevoqueacutee au chapitre preacuteceacutedent Danslrsquoexemple suivant il srsquoagit drsquoinseacuterer tous les pilotes de la table Pilote (en consideacuterant lenom le nombre drsquoheures de vol et la compagnie) dans la table NomsetHVoldesPilotes

Notez que les instructions (CREATE TABLE et INSERT) peuvent ecirctre programmeacutees en uneinstruction (option AS SELECT de la commande CREATE TABLE)

CREATE TABLE NomsetHVoldesPilotes AS SELECT nom nbHVol compa

FROM Pilote

Limitation du nombre de lignes

Pour limiter le nombre de lignes agrave extraire agrave partir du reacutesultat drsquoune requecircte il faut speacutecifier laclause LIMIT de la maniegravere suivante

LIMIT [rangDeacutepart] nbLignes

Tableau 4-8 Concateacutenation

Requecircte Reacutesultat

SELECT brevet AS Embauche FROM Pilote

+--------+---------------------------------+| brevet | Embauche |+--------+---------------------------------+| PL-1 | Gratien Viel vole pour AF || PL-2 | Didier Donsez vole pour AF || PL-3 | Richard Grin vole pour SING || PL-4 | Placide Fresnais vole pour CAST || PL-5 | Daniel Vielle vole pour AF |+--------+---------------------------------+

Web

CONCAT(nom vole pour compa)

Tableau 4-9 Insertion multiligne

Creacuteation et insertion Requecircte et reacutesultat

CREATE TABLE NomsetHVoldesPilotes (nom VARCHAR(16) nbHVol DECIMAL(72) compa CHAR(4))

INSERT INTO NomsetHVoldesPilotes

mysqlgt SELECT FROM NomsetHVoldesPilotes+------------------+---------+-------+| nom | nbHVol | compa |+------------------+---------+-------+| Gratien Viel | 45000 | AF || Didier Donsez | 000 | AF || Richard Grin | 100000 | SING || Placide Fresnais | 245000 | CAST || Daniel Vielle | NULL | AF |+------------------+---------+-------+

Web

SELECT nomnbHVolcompaFROM Pilote

4055_04_C04 Page 90 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 91

chapitre ndeg 4 Interrogation des donneacutees

Le premier entier preacutecise le rang de la premiegravere ligne seacutelectionneacutee (en fonction du tri du reacutesul-tat) Le second entier indique le nombre maximum de lignes agrave extraire La premiegravere ligne estconsideacutereacutee comme preacutesente au rang 0 Ainsi laquo LIMIT n raquo eacutequivaut agrave laquo LIMIT 0n raquoLrsquoexemple suivant illustre deux utilisations de la clause LIMIT

Restriction (WHERE)

Les eacuteleacutements de la clause WHERE drsquoune requecircte permettent de programmer lrsquoopeacuterateur derestriction Cette clause limite la recherche aux enregistrements qui respectent une conditionsimple ou complexe Cette section srsquointeacuteresse agrave la partie surligneacutee de lrsquoinstruction SELECTsuivante

SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes

FROM nomTable [aliasTable]

condition composeacutee de colonnes drsquoexpressions de constantes lieacutees deux agrave deux entredes opeacuterateurs

ndash de comparaison (gt = lt gt= lt= ltgt)

ndash logiques (NOT AND ou OR)

ndash inteacutegreacutes (BETWEEN IN LIKE IS NULL)

Interrogeons la table suivante en utilisant chaque cateacutegorie drsquoopeacuterateur

Tableau 4-10 Limitation des reacutesultats

Requecircte Reacutesultat

Deuxiegraveme et troisiegraveme (ordre de cleacute) pilote

SELECT FROM Pilote

+--------+---------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+---------------+---------+-------+| PL-2 | Didier Donsez | 000 | AF || PL-3 | Richard Grin | 100000 | SING |+--------+---------------+---------+-------+

Les deux pilotes les plus expeacuterimenteacutes (par ordre du nombre drsquoheures de vol)

SELECT FROM Pilote ORDER BY nbHvol DESC

+--------+------------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+------------------+---------+-------+| PL-4 | Placide Fresnais | 245000 | CAST || PL-3 | Richard Grin | 100000 | SING |+--------+------------------+---------+-------+

Web

LIMIT 12

LIMIT 2

[ WHERE condition ]

4055_04_C04 Page 91 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

92 copy Eacuteditions Eyrolles

Opeacuterateurs de comparaison

Le tableau suivant deacutecrit des requecirctes pour lesquelles la clause WHERE contient des opeacuterateursde comparaison

Les eacutecritures laquo prime=500 raquo et laquo (prime=500) raquo sont eacutequivalentes Les eacutecritureslaquo primeltgt500 raquo et laquo NOT (prime=500) raquo sont eacutequivalentes Les parenthegraveses sont utilespour composer des conditions

Notez lrsquoutilisation du simple guillemet pour comparer des chaicircnes de caractegraveres

Figure 4-3 Table Pilote

Web

Pilote

brevet nom nbHVol prime compa

PL-1 Gratien Viel 450 500 AF PL-2 Didier Donsez 0 AF PL-3 Richard Grin 1000 90 SING PL-4 Placide Fresnais 2450 500 CAST PL-5 Daniel Vielle 400 600 SING PL-6 Francoise Tort 0 CAST

Tableau 4-11 Eacutegaliteacute ineacutegaliteacute et comparaison

Eacutegaliteacute Comparaison et ineacutegaliteacute

SELECT brevet nom AS Prime 500 FROM Pilote WHERE +--------+------------------+| brevet | Prime 500 |+--------+------------------+| PL-1 | Gratien Viel || PL-4 | Placide Fresnais |+--------+------------------+

SELECT brevet nom de Air-France FROM Pilote WHERE +--------+---------------+| brevet | de Air-France |+--------+---------------+| PL-1 | Gratien Viel || PL-2 | Didier Donsez |+--------+---------------+

SELECT brevet nom prime FROM Pilote WHERE

+--------+----------------+-------+| brevet | nom | prime |+--------+----------------+-------+| PL-3 | Richard Grin | 90 || PL-6 | Francoise Tort | 0 |+--------+----------------+-------+

SELECT brevet nom prime FROM Pilote WHERE +--------+----------------+-------+| brevet | nom | prime |+--------+----------------+-------+| PL-3 | Richard Grin | 90 || PL-5 | Daniel Vielle | 600 || PL-6 | Francoise Tort | 0 |+--------+----------------+-------+

Webprime = 500

compa = AF

prime lt= 400

prime ltgt 500

4055_04_C04 Page 92 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 93

chapitre ndeg 4 Interrogation des donneacutees

Opeacuterateurs logiques

bull Lrsquoordre de prioriteacute des opeacuterateurs logiques est NOT AND et OR

bull Les opeacuterateurs de comparaison (gt = lt gt= lt= ltgt) sont prioritaires par rapport agrave NOT

bull Les parenthegraveses permettent de modifier ces regravegles de prioriteacute

La premiegravere requecircte de lrsquoexemple suivant contient une condition composeacutee de trois preacutedicatsqui sont eacutevalueacutes par ordre de prioriteacute (drsquoabord AND puis OR) La conseacutequence est lrsquoaffichagedes pilotes de la compagnie SING avec les pilotes de AF ayant moins de 500 heures de vol

La deuxiegraveme requecircte force la prioriteacute avec les parenthegraveses (AND et OR sur le mecircme pieddrsquoeacutegaliteacute) La conseacutequence est lrsquoaffichage des pilotes ayant moins de 500 heures de vol descompagnies SING et AF

Opeacuterateurs inteacutegreacutes

Les opeacuterateurs inteacutegreacutes sont BETWEEN IN LIKE et IS NULL

Tableau 4-12 Opeacuterateurs logiques

Requecircte Reacutesultat sous SQLPlus

SELECT brevet nom compa FROM Pilote WHERE (

+--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-3 | Richard Grin | SING || PL-5 | Daniel Vielle | SING |+--------+---------------+-------+

SELECT brevet nom compa FROM Pilote WHERE (( ) AND nbHVol lt 500)

+--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-5 | Daniel Vielle | SING |+--------+---------------+-------+

Web

compa = SING OR compa = AF AND nbHVol lt 500)

compa = SING OR compa = AF

4055_04_C04 Page 93 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

94 copy Eacuteditions Eyrolles

Tableau 4-13 Opeacuterateurs inteacutegreacutes

Opeacuterateur Exemple

BETWEEN limiteInf AND limiteSup teste lrsquoappartenance agrave un intervalle de valeurs

SELECT brevet nom nbHVol FROM Pilote WHERE nbHVol +--------+---------------+---------+| brevet | nom | nbHVol |+--------+---------------+---------+| PL-1 | Gratien Viel | 45000 || PL-3 | Richard Grin | 100000 || PL-5 | Daniel Vielle | 40000 |+--------+---------------+---------+

IN (listeValeurs) compare une expres-sion avec une liste de valeurs

SELECT brevet nom compa FROM Pilote WHERE compa +--------+------------------+-------+| brevet | nom | compa |+--------+------------------+-------+| PL-3 | Richard Grin | SING || PL-4 | Placide Fresnais | CAST || PL-5 | Daniel Vielle | SING || PL-6 | Francoise Tort | CAST |+--------+------------------+-------+

LIKE (expression) compare de maniegravere geacuteneacuterique des chaicircnes de caractegraveres agrave une expressionLe symbole remplace un ou plusieurs caractegraveresLe symbole _ remplace un caractegravereCes symboles peuvent se combinerUtilisez de preacutefeacuterence des colonnes VARCHAR ou compleacutetez si neacutecessaire par des blancs jusqursquoagrave la taille maximale pour des CHAR

SELECT brevet nom compa FROM Pilote WHERE compa +--------+------------------+-------+| brevet | nom | compa |+--------+------------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-4 | Placide Fresnais | CAST || PL-6 | Francoise Tort | CAST |+--------+------------------+-------+SELECT brevet nom compa FROM Pilote WHERE compa +--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF |+--------+---------------+-------+

IS NULL compare une expression (colonne calcul constante) agrave la valeur NULLLa neacutegation srsquoeacutecrit soit laquo expression IS NOT NULL raquo soit laquo NOT (expression IS NULL) raquo

SELECT nom prime nbHVol FROM Pilote WHERE prime OR nbHVol +----------------+-------+--------+| nom | prime | nbHVol |+----------------+-------+--------+| Didier Donsez | NULL | 000 || Francoise Tort | 0 | NULL |+----------------+-------+--------+

WebBETWEEN 399 AND 1000

IN (CAST SING)

LIKE (A)

LIKE (A_)

IS NULL IS NULL

4055_04_C04 Page 94 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 95

chapitre ndeg 4 Interrogation des donneacutees

Alias

Il nrsquoest pas permis drsquoutiliser un alias de colonne dans la clause WHERE Cette recommandationde la norme srsquoexplique par le fait que certaines expressions pourraient ne pas ecirctre deacutetermineacuteespendant que la condition WHERE est eacutevalueacutee

Ainsi la requecircte suivante renvoie une erreur alors qursquoelle ne contient pourtant pas drsquoexpres-sion litigieuse Il faudra ici remplacer laquo c1 raquo par laquo aliasDesPilotescompa raquo

mysqlgt SELECT aliasDesPilotescompa AS c1 aliasDesPilotesnom

FROM Pilote aliasDesPilotes WHERE c1 = AF

ERROR 1054 (42S22) Unknown column c1 in where clause

Fonctions

MySQL propose un grand nombre de fonctions qui srsquoappliquent dans les clauses SELECT ouWHERE drsquoune requecircte La syntaxe geacuteneacuterale drsquoune fonction est la suivante

nomFonction(colonne1 | expression1 [colonne2 | expression2 hellip])

bull Une fonction monoligne agit sur une ligne agrave la fois et ramegravene un reacutesultat par ligne On distin-gue quatre familles de fonctions monolignes caractegraveres numeacuteriques dates et conversionsde types de donneacutees Ces fonctions peuvent se combiner entre elles (exemple MAX(COS(ABS(n))) deacutesigne le maximum des cosinus de la valeur absolue de la colonne n)

bull Une fonction multiligne (fonction drsquoagreacutegat) agit sur un ensemble de lignes pour ramener unreacutesultat (voir la section Regroupements)

Caractegraveres

Interrogeons la table suivante en utilisant des fonctions pour les caractegraveres

Figure 4-4 Table Pilote

Pilote

brevet prenom nom surnom compa

PL-1 Gratien viel dba AF PL-2 Didier donsez smith AFPL-3 richard Grin Faucon SING

PL-4 placide Fresnais cool CASTPL-5 Daniel vielle jones SINGPL-6 Francoise tort NormaleSup CAST

4055_04_C04 Page 95 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

96 copy Eacuteditions Eyrolles

La plupart des fonctions pour les caractegraveres acceptent une chaicircne de caractegraveres en paramegravetrede nature CHAR ou VARCHAR Le tableau suivant deacutecrit les principales fonctions

Tableau 4-14 Fonctions pour les caractegraveres

Fonction Objectif Exemple

ASCII(c) Retourne le carac-tegravere ASCII eacutequiva-lent

(A) donne 65

CHAR(n) Retourne le carac-tegravere eacutequivalent dans le jeu de caractegraveres en cours

(161) || (162) donne iacuteoacute

CONCAT(c1c2) Concategravene deux chaicircnes

SELECT Personnel FROM Pilote+------------------------------+| Personnel |+------------------------------+| viel travaille pour AF || |

FIELD(cc1c2hellip) Retourne lrsquoindex qui correspond agrave la premiegravere eacutegaliteacute entre c et c1 c et c2 etc 0 si aucune eacutegaliteacute nrsquoest trouveacutee

SELECT Attention agrave la casse

+-----------------------+| Attention agrave la casse |+-----------------------+| 1 |+-----------------------+

INSERT(c1postc2) Modifie la chaicircne c1 en inseacuterant t caractegraveres de la sous-chaicircne c2 agrave partir de la posi-tion pos

SELECT Qui

+---------------------+| Qui |+---------------------+| Compagnie Airbus |+---------------------+

INSTR(c1c2) Premier indice drsquoune sous-chaicircne c1 dans une chaicircne c2Exemple indice de Air dans la chaicircne

SELECT Indice

+--------+| Indice |+--------+| 7 |+--------+

ASCII

CHR CHR

CONCAT(CONCAT(nom vole pour ) compa)

FIELD(Air air AirbusAir)

INSERT(Compxxxie Airbus 5 3 agn)

INSTR(Infos-Air AirBus pourAir-FranceAir)

4055_04_C04 Page 96 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 97

chapitre ndeg 4 Interrogation des donneacutees

LOWER(c) Tout en minuscu-les

SELECT CONCAT( ) Etat civil FROM Pilote WHERE compa = SING+---------------+| Etat civil |+---------------+| richard grin || daniel vielle |

LOCATE(c1c2pos) Premier indice drsquoune sous-chaicircne c1 dans une chaicircne c2 agrave partir de la position posExemple indice de Air dans la chaicircne agrave partir du 9e caractegravere

SELECT Indice apregraves 9

+----------------+| Indice apregraves 9 |+----------------+| 13 |+----------------+

LENGTH(c) Longueur de la chaicircne

SELECT Taille

+-------+| Taille |+--------+| 35 |+--------+

LEFT(cn) Extrait les n pre-miers caractegraveres agrave c en partant de la gauche

SELECT Bye les Jumbo+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+

LPAD(c1nc2) Insertion agrave gauche de c2 dans c1 sur n caractegraveres

SELECT sur 20+----------------------+| sur 20 |+----------------------+| -----------Rien |+----------------------+

REPLACE(c1c2c3) Recherche les c2 preacutesentes dans c1 et les remplace par c3

SELECT Changement+----------------------+| Changement |+----------------------+| EADS et Aerospatiale |+----------------------+

Tableau 4-14 Fonctions pour les caractegraveres (suite)

Fonction Objectif Exemple

LOWER(prenom)LOWER(nom)

LOCATE(AirInfos-Air AirBuspour Air-France9)

LENGTH(Infos-Air AirBus pourAir-France)

LEFT(A380 agrave BlagnacB747B74714)

LPAD(Rien20--)

REPLACE(Matra et AerospatialeMatraEADS)

4055_04_C04 Page 97 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

98 copy Eacuteditions Eyrolles

REVERSE(c) Retourne la chaicircne renverseacutee

SELECT Miroir+----------------+| Miroir |+----------------+| A380 agrave Blagnac |+----------------+

RIGHT(cn) Extrait les n der-niers caractegraveres agrave c en partant de la droite

SELECT Bye les Jumbo+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+

RPAD(c1nc2) Insertion agrave droite de c2 dans c1 sur n caractegraveres

SELECT sur 19+---------------------+| sur 19 |+---------------------+| Rien---------- |+---------------------+

SOUNDEX(c) Extrait la phoneacuteti-que drsquoune expres-sion (in english only )

SELECT nom surnom compa FROM Pilote WHERE IN ( )+--------+--------+-------+| nom | surnom | compa |+--------+--------+-------+| donsez | smith | AF || vielle | jone | SING |+--------+--------+-------+

SUBSTR(cn[t]) Extraction de la sous-chaicircne c commenccedilant agrave la position n sur t caractegraveres

SELECT

Ougrave ccedila +-----------+| Ougrave ccedila |+-----------+| agrave Blagnac |+-----------+

Tableau 4-14 Fonctions pour les caractegraveres (suite)

Fonction Objectif Exemple

REVERSE(cangalB agrave 083A)

RIGHT(B747B747A380 agrave Blagnac14)

RPAD(Rien19--)

SOUNDEX(surnom)SOUNDEX(SMYTHE) SOUNDEX(John)

SUBSTR(Air France agrave Blagnac Con129)

4055_04_C04 Page 98 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 99

chapitre ndeg 4 Interrogation des donneacutees

Numeacuteriques

En plus des opeacuterateurs arithmeacutetiques disponibles dans les langages de programmation (+ - et DIV pour la division entiegravere) MySQL supporte un grand nombre de fonctions numeacuteriques

TRIM(c1 FROM c2) Enlegraveve les carac-tegraveres c1 agrave la chaicircne c2 (options LEADING et TRAILING pour preacuteciser le sens du deacutecoupage) Existent aussi LTRIM et RTRIM qui enlegravevent des espaces respecti-vement au deacutebut ou agrave la fin drsquoune chaicircne

SELECT

Bye les Jumbo

+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+

UPPER Tout en majuscu-les

SELECT CONCAT( ) Pilotes de CAST

FROM Pilote WHERE compa = CAST+------------------+| Pilotes de CAST |+------------------+| PLACIDE FRESNAIS || FRANCOISE TORT |+------------------+

Tableau 4-14 Fonctions pour les caractegraveres (suite)

Fonction Objectif Exemple

TRIM(B FROM BA380 agrave BlagnacBBBBB)

UPPER(prenom)UPPER(nom)

Tableau 4-15 Fonctions numeacuteriques

Fonction Objectif Exemple

ABS(n) Valeur absolue de n

ACOS(n) Arc cosinus (n de -1 agrave 1) retour exprimeacute en radians (de 0 agrave pi)

ATAN(n) Arc tangente (forall n) retour exprimeacute en radians ( de -pi2 agrave pi2)

CEIL(n) Plus petit entier ge agrave n retourne 16

COS(n) Cosinus de n exprimeacute en radians de 0 agrave 2 pi

retourne 05

COT(n) Cotangente de n exprimeacutee en radians retourne 17320508075689

DEGREES(n) Conversion de radians en degreacutes retourne 90

CEIL(157)

COS(60PI()180)

COT(30PI()180)

DEGREES(PI()2)

4055_04_C04 Page 99 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

100 copy Eacuteditions Eyrolles

Fonction pour les bits

Les opeacuterateurs suivants sont disponibles jusqursquoagrave 64 bits (BIGINT) On peut en utiliser certainsen passant des paramegravetres en base 10 en binaire ou de type chaicircne de caractegraveres

EXP(n) e (271828183) agrave la puissance n

FLOOR(n) Plus grand entier le agrave n retourne 15

LN(n) Logarithme neacutepeacuterien de n

LOG(n)(mn) Logarithme de n dans une base m

MOD(mn) Reste de la division entiegravere de m par n

POW(mn) m puissance n

RADIANS(n) Conversion de degreacutes en radians retourne 15707963267949

RAND() Flottant aleacuteatoire (agrave 14 deacutecimales) entre 0 et 1

retourne 1757

ROUND(mn) Arrondi agrave une ou plusieurs deacutecimales retourne 1757

SIGN(n) Retourne le signe drsquoun nombre (-1 0 ou 1)

SIN(n) Sinus de n exprimeacute en radians de 0 agrave 2 pi retourne 05

SINH(n) Sinus hyperbolique de n

SQRT(n) Racine carreacutee de n

TAN(n) Tangente de n exprimeacutee en radians de 0 agrave 2 pi

TRUNCATE(nm) Coupure de n agrave m deacutecimales retourne 157

Tableau 4-15 Fonctions numeacuteriques (suite)

Fonction Objectif Exemple

FLOOR(157)

RADIANS(90)

ROUND(175672)

ROUND(175672)

SIN(30PI()180)

TRUNC(15791)

Tableau 4-16 Fonctions pour les bits

Fonction Objectif Exemple

OR | OU bits agrave bits b0100 b1100 retourne 12

AND amp ET bits agrave bits b0100 b1100 retourne 4

XOR ^ OU exclusif bits agrave bits b0100 b1100 retourne 8

SHL ltlt Deacutecalage agrave gauche de n posi-tions

3 2 retourne 12

SHR gtgt Deacutecalage agrave droite de n positions b0100 2 retourne 1

Compleacutement agrave 1 ~ Inversion de chaque bit 3+(~3+1) retourne 1 (ici on pro-gramme le compleacutement agrave 2)

BIN(n) Chaicircne qui repreacutesente la valeur binaire de n

retourne 1100

|

amp

^

ltlt

gtgt

BIN(12)

4055_04_C04 Page 100 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 101

chapitre ndeg 4 Interrogation des donneacutees

Dates

Le tableau suivant deacutecrit les principales fonctions pour les dates

BIT_LENGTH(c) Taille de la chaicircne en bits retourne 24 (3 octets)

HEX(ns) Chaicircne en hexadeacutecimal repreacute-sentant ns (nombre ou chaicircne)

retourne FE

OCT(n) Chaicircne en octal repreacutesentant n retourne 14

OCTET_LENGTH(c) Synonyme de LENGTH()

UNHEX(c) Fonction inverse de HEX retourne SQL

Tableau 4-16 Fonctions pour les bits (suite)

Fonction Objectif Exemple

BIT_LENGTH(GTR)

HEX(254)

OCT(12)

UNHEX(53514C)

Tableau 4-17 Fonctions pour les dates

Fonction Objectif Retour

ADDDATE(daten) Ajoute n jours agrave une date (heure) DATE ou DATETIME

ADDTIME(date1date2) Ajoute les deux dates avec date1 TIME ou DATETIME et date2 TIME

TIME ou DATETIME

CURDATE() CURRENT_DATE ou CURRENT_DATE()

Date courante (YYYY-MM-DD ou YYYYM-MDD)

INT ou DATE

CURTIME() CURRENT_TIME ou CURRENT_TIME()

Heure courante (HHMMSS or HHMMSS) INT ou DATE

CURRENT_TIMESTAMP CURRENT_TIMES-TAMP()ou NOW()

Date et heure courantes (YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMS)

INT ou DATETIME

DATE(datet) Extrait une date agrave partir drsquoune expression de type DATETIME

DATE

DATEDIFF(date1date2) Nombre entier de jours entre les 2 dates INT

DATE_ADD(dateINTERVAL expr type) Ajoute un intervalle agrave une date (heure) expr deacutesigne un intervalle type indique comment interpreacuteter le format de lrsquoexpres-sion (voir tableau suivant)

DATE ou DATETIME

DATE_FORMAT(dateformat) Preacutesente la date selon un format (voir tableau suivant)

VARCHAR

DATE_SUB(dateINTERVAL expr type) Soustrait un intervalle agrave une date (heure) Mecircmes paramegravetres que DATE_ADD

DATE ou DATETIME

DAYNAME(date) Nom du jour en anglais VARCHAR

DAY(date) ou DAYOFMONTH(date) Numeacutero du jour dans le mois (0 agrave 31) INT

DAYOFYEAR(date) Numeacutero du jour dans lrsquoanneacutee (0 agrave 366) INT

4055_04_C04 Page 101 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

102 copy Eacuteditions Eyrolles

EXTRACT(type FROM date) Extrait une partie drsquoune date selon un type drsquointervalle (comme pour DATE_ADD)

INT

FROM_DAYS(n) Retourne une date agrave partir drsquoun nombre de jours (le calendrier anneacutee 0 deacutebute agrave n=365)

DATE

FROM_UNIXTIME(nunix[format]) Retourne une date (heure) agrave partir drsquoune estampille Unix (nombre de jours depuis le 111970) Utilisation possible drsquoun format

INT ou DATETIME

HOUR(time) Extrait lrsquoheure drsquoun temps INT

LAST_DAY(date) Dernier jour du mois drsquoune date (heure) DATE

LOCALTIME LOCALTIME() LOCALTI-MESTAMP LOCALTIMESTAMP()

Synonymes de NOW()

MAKEDATE(anneenjour) Construit une date agrave partir drsquoune anneacutee et drsquoun nombre de jours (gt0 si njourgt365 lrsquoanneacutee srsquoincreacutemente automatiquement)

DATE

MAKETIME(heureminuteseconde) Construit une heure TIME

MICROSECOND(date) Extrait les microsecondes drsquoune date-heure

INT

MINUTE(time) Extrait les minutes drsquoun temps INT

MONTH(date) MONTHNAME(date) Retourne respectivement le numeacutero et le nom du mois drsquoune date-heure

INTVARCHAR

NOW() Date et heure courantes au format YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMSS

DATETIME ou INT

PERIOD_DIFF(int1int2) Nombre de mois seacuteparant les deux dates au format YYMM or YYYYMM

INT

SECOND(time) Extrait les secondes drsquoun temps INT

SEC_TO_TIME(secondes) Construit une heure au format HHMMSS ou HHMMSS

TIME ouINT

STR_TO_DATE(cformat) Construit une date (heure) selon un certain format Crsquoest lrsquoinverse de DATE_FORMAT()

DATE ou DATETIME ou TIME

SUBDATE(daten) Retranche n jours agrave une date (heure) DATE ou DATETIME

SUBTIME(date1date2) Retranche date2 (TIME) agrave date1 (TIME ou DATETIME)

TIME ou DATETIME

SYSDATE() Date et heure courantes au format YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMSS (diffeacuterence avec NOW voir chapitre 1)

DATETIME ou INT

TIME(datetime) Extrait le temps drsquoune date-heure TIME

Tableau 4-17 Fonctions pour les dates (suite)

Fonction Objectif Retour

4055_04_C04 Page 102 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 103

chapitre ndeg 4 Interrogation des donneacutees

TIMEDIFF(tdate1tdate2) Temps entre 2 temps ou 2 dates ou 2 dates-heure

TIME

TIMESTAMP(date) Construit une estampille agrave partir drsquoune date (heure)

TIMESTAMP

TIMESTAMPADD(intervalleintdate) Ajoute agrave la date (heure) un intervalle (int) du type FRAC_SECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER ou YEAR

TIMESTAMP

TIMESTAMPDIF(intervalleintdate) Retranche agrave la date (heure) un intervalle du type (idem preacuteceacutedent)

TIMESTAMP

TIME_TO_SEC(time) Retourne le nombre de secondes eacutequiva-lent au temps

INT

TO_DAYS(date) Retourne un nombre de jours agrave partir drsquoune date (YYYY-MM-DD ou YYYYMMDD) Inverse de FROM_DAYS()

INT

UNIX_TIMESTAMP(date) Retourne le nombre de secondes depuis le 111970 jusqursquoagrave la date (heure) passeacutee en paramegravetre (ou entier au format YYMMDD YYYYMMDD) Inverse de FROM_UNIX-TIME()

INT

UTC_DATE() UTC_TIME() UTC_TIMES-TAMP()

Retournent respectivement la date lrsquoheure et lrsquoestampille au meacuteridien de Greenwich

DATETIMEDATETIME

WEEKDAY(date) Numeacutero du jour (0 lundi 1 mardi 6 dimanche) drsquoune date (heure)

INT

WEEKOFYEAR(date) Numeacutero de la semaine en cours (1 agrave 53) INT

Tableau 4-17 Fonctions pour les dates (suite)

Fonction Objectif Retour

4055_04_C04 Page 103 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

104 copy Eacuteditions Eyrolles

Tableau 4-18 Paramegravetres drsquointervalles pour les fonctions DATE_ADD et DATE_SUB

Paramegravetre type Paramegravetre expr

MICROSECOND nSECOND n

MINUTE n

HOUR nn

DAY nn

WEEK n

MONTH nn

YEAR nnnn

SECOND_MICROSECOND ssmicrosec

MINUTE_MICROSECOND mimicrosec

MINUTE_SECOND missS

HOUR_MICROSECOND hhmicrosec

HOUR_SECOND hhmiss

HOUR_MINUTE hhmi

DAY_MICROSECOND ddmicrosec

DAY_SECOND dd hhmiss

DAY_MINUTE dd hhmi

DAY_HOUR dd hh

YEAR_MONTH yyyy-mm

Tableau 4-19 Principaux formats pour les fonctions DATE_FORMAT et STR_TO_DATE

Format Description

a Nom du jour en anglais abreacutevieacute (SunSat)

b Nom du mois en anglais abreacutevieacute (JanDec)

c Mois (012)

e Jour du mois (031)

f Microsecondes (000000999999)

H Heures (0023)

i Minutes (0059)

j Jour de lrsquoanneacutee (001366)

M Nom du mois en anglais (JanuaryDecember)

s Secondes (0059)

T Time sur 24 heures (hhmmss)

u Numeacutero de semaine (0053)

W Nom du jour en anglais (SundaySaturday)

w Jour de la semaine (0=Sunday6=Saturday)

Y Anneacutee sur 4 positions

4055_04_C04 Page 104 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 105

chapitre ndeg 4 Interrogation des donneacutees

Quelques exemples drsquoutilisation (date du jour mercredi 9 novembre 2005) sont donneacutes dansle tableau suivant

Conversions

MySQL autorise des conversions de types implicites ou explicites

Implicites

Il est possible drsquoaffecter dans une expression ou dans une instruction SQL (INSERTUPDATE) une donneacutee de type numeacuterique (ou date-heure) agrave une donneacutee de type VARCHAR(ou CHAR) Il en va de mecircme pour lrsquoaffectation drsquoune colonne VARCHAR par une donneacutee de typedate-heure (ou numeacuterique) On parle ainsi de conversions implicites

Tableau 4-20 Exemples de fonctions pour les dates

Besoin et fonction Reacutesultat

Date dans 31 joursSELECT

+--------------------------+| ADDDATE(2005-11-9 31) |+--------------------------+| 2005-12-10 |+--------------------------+

1 jour et 1 microseconde apregraves le 9112005 11 heures 1 microsecondeSELECT

exemple ADDTIME

+----------------------------+| exemple ADDTIME |+----------------------------+| 2005-11-10 230000000000 |+----------------------------+

Rendez-vous dans 4 moisSELECT DATE_ADD(CURRENT_TIMESTAMP INTERVAL 4 MONTH) RDV

+---------------------+| RDV |+---------------------+| 2006-03-09 170733 |+---------------------+

Rendez-vous dans 7 jours 1 heure et 30 minutesSELECT

RDV 1sem 1h30

+---------------------+| RDV 1sem 1h30 |+---------------------+| 2005-11-16 185303 |+---------------------+

Aujourdrsquohui en anglaisSELECT

Y) Today in English

+----------------------------+| Today in English |+----------------------------+| Wednesday 09 November 2005 |+----------------------------+

Extraction au format numeacuterique du jour heures et minutesSELECT

DAY_MINUTE

+------------+| DAY_MINUTE |+------------+| 90102 |+------------+

WebADDDATE(2005-11-9 31)

ADDTIME(2005-11-092259599999991 000000001)

DATE_ADD(CURRENT_TIMESTAMPINTERVAL 7 013000 DAY_SECOND)

DATE_FORMAT(SYSDATE() W d MY)

EXTRACT(DAY_MINUTE FROM 2005-11-09010203)

4055_04_C04 Page 105 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

106 copy Eacuteditions Eyrolles

Pour preuve le script suivant ne renvoie aucune erreur

CREATE TABLE Test (c1 DECIMAL(63) c2 DATE c3 VARCHAR(1) c4

CHAR)

INSERT INTO Test VALUES (54845 20060116 3 5)

Explicites

Une conversion est dite laquo explicite raquo quand on utilise une fonction agrave cet effet Les fonctions deconversion les plus connues sont CAST et CONVERT (qui respectent la syntaxe de la normeSQL)

Les fonctions de conversion sont deacutecrites dans le tableau suivant

Comparaisons

MySQL compare deux variables entre elles en suivant les regravegles suivantes

bull Si lrsquoune des deux valeurs est NULL la comparaison retourne NULL (sauf pour lrsquoopeacuterateurlt=gt qui renvoie vrai si les deux valeurs sont NULL)

bull Si les deux valeurs sont des chaicircnes elles sont compareacutees en tant que telles

bull Si les deux valeurs sont des numeacuteriques elles sont compareacutees en tant que telles

bull Les valeurs hexadeacutecimales sont traiteacutees comme des chaicircnes de bits si elles ne sont pascompareacutees agrave des numeacuteriques

bull Si lrsquoune des valeurs est TIMESTAMP ou DATETIME et si lrsquoautre est une constante cette der-niegravere est convertie en TIMESTAMP

bull Dans les autres cas les valeurs sont compareacutees comme des numeacuteriques (flottants)

Tableau 4-21 Fonctions de conversion

Fonction Conversion Exemple

BINARY(expr) Lrsquoexpression en bits Pour le premier pilote de notre dernier exemple le test =

renverra faux

CAST(expression AS typeMySQL )

Lrsquoexpression dans le type en para-megravetre (BINARY CHAR DATE DATETIME DECIMAL SIGNED TIME UNSIGNED)

retourne 2

CONVERT(c jeu-car)

La chaicircne c dans le jeu de caractegrave-res passeacute en paramegravetre jeu de caractegravere DOS retourne

Ecirc Iacute

BINARY(brevet)BINARY(pl-1)

CAST(2 AS CHAR)

CONVERT(Auml Ecirc Iacute Oslash USINGcp850)

4055_04_C04 Page 106 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 107

chapitre ndeg 4 Interrogation des donneacutees

Eacutenumeacuterations

Nous avons vu au chapitre 2 comment manipuler les deux types drsquoeacutenumeacuterations que MySQLpropose (ENUM et SET) Eacutetudions agrave preacutesent quelques fonctions relatives agrave ces types

Type ENUM

Chaque valeur de lrsquoeacutenumeacuteration est associeacutee agrave un indice commenccedilant agrave 1 Ainsi il est possiblede retrouver la position drsquoune valeur au sein de son eacutenumeacuteration comme lrsquoillustre lrsquoexemplesuivant deacutecrit au chapitre 2

Lrsquoindice drsquoune valeur vide (colonne valueacutee agrave () ou dans lrsquoINSERT) est 0 celui drsquounevaleur NULL est NULL

Type SET

Il est possible drsquoextraire des enregistrements en comparant des ensembles entre eux ou entestant lrsquoappartenance drsquoeacuteleacutements au sein drsquoune eacutenumeacuteration SET Lrsquoexemple suivant (deacutecritau chapitre 2) illustre deux possibiliteacutes drsquoextraction

Tableau 4-22 Exemples drsquoextraction drsquoindices drsquoune eacutenumeacuteration ENUM

Table et donneacutees Extraction

Figure 4-5 Table et donneacutees colonne ENUM mysqlgt SELECT nom diplome FROM UnCursus

+-------------+---------+-----------+| nom | diplome | diplome+0 |+-------------+---------+-----------+| F Brouard | BTS | 1 || F Degrelle | Licence | 3 |+-------------+---------+-----------+

Web

UnCursus

num nom diplome

E1 F Brouard BTS E2 F Degrelle Licence

ENUM

BTS DUT Licence INSA

diplome+0

4055_04_C04 Page 107 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

108 copy Eacuteditions Eyrolles

Il est possible drsquoeacutecrire des extractions baseacutees sur lrsquoopeacuterateur LIKE (exemple laquo SELECT hellipFROM Cursus WHERE diplomes LIKE (Licence) raquo) Cela nrsquoest cependant pasrecommandeacute car le mot Licence peut ecirctre preacutesent dans lrsquoensemble non pas en tant qursquoeacuteleacute-ment mais en tant que sous-chaicircne drsquoun eacuteleacutement

Autres fonctions

Drsquoautres fonctions nrsquoappartenant pas agrave la classification preacuteceacutedente sont preacutesenteacutees dans letableau suivant

Tableau 4-23 Exemples drsquoextration drsquoune eacutenumeacuteration SET

Table et donneacutees Extraction

Figure 4-6 Table et donneacutees colonne SET SELECT nom diplomes FROM Cursus WHERE

+-------------+------------------+| nom | diplomes |+-------------+------------------+| F Brouard | BTSLicence || F Degrelle | DUTLicenceINSA |+-------------+------------------+

SELECT nom diplomes FROM Cursus WHERE diplomes = +------------+-------------+| nom | diplomes |+------------+-------------+| F Brouard | BTSLicence |+------------+-------------+

Web

Cursus

num nom diplomes

E1 F Brouard BTS Licence E2 F Degrelle Licence INSA DUT E0 F Peyrard INSA DUT

SET

BTS DUT Licence INSA

FIND_IN_SET(Licencediplomes)gt0

BTSLicence

Tableau 4-24 Autres fonctions

Fonction Objectif Exemple

DEFAULT(colonne) Valeur par deacutefaut drsquoune colonne (NULL si aucune)

FORMAT(numeri-quenb)

Formate un nombre arrondi agrave nb deacutecimales de la maniegravere suivante

retourne 12345679

GREATEST(expres-sion[ expres-sion])

Retourne la plus grande des expressions retourne X-Men

FORMAT(12345678901 1)

GREATEST(RaffarinChiracX-Men)

4055_04_C04 Page 108 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 109

chapitre ndeg 4 Interrogation des donneacutees

Regroupements

Cette section traite agrave la fois des regroupements de lignes (agreacutegats) et des fonctions de groupe(ou multilignes) Nous eacutetudierons les parties surligneacutees de lrsquoinstruction SELECT suivante

SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes

FROM nomTable [ WHERE condition ]

[ clauseOrdonnancement ]

[ LIMIT [rangDeacutepart] nbLignes ]

listeColonnes peut inclure des expressions (preacutesentes dans la clause de regroupe-ment) ou des fonctions de groupe

clauseRegroupement GROUP BY (expression1[expression2]) permetde regrouper des lignes selon la valeur des expressions (colonnes fonction constante calcul)

HAVING condition pour inclure ou exclure des lignes aux groupes (la condition nepeut faire intervenir que des expressions du GROUP BY)

ClauseOrdonnancement deacutejagrave eacutetudieacute (ORDER BY dans la section ProjectionOrdon-nancement)

Interrogeons la table suivante en composant des regroupements et en appliquant des fonctionsde groupe

LEAST(expression[ expression])

Retourne la plus petite des expressions retourne Sarkozy

NULLIF(expr1expr2) Si expr1 = expr2 retourne NULL sinon retourne expr1

retourne Raffarine

IFNULL(expr1expr2) Convertit expr1 susceptible drsquoecirctre nul en une valeur reacuteelle (expr2)

retourne Aucun si diplome est NULL

Tableau 4-24 Autres fonctions (suite)

Fonction Objectif Exemple

LEAST(VillepinSarkozyX-Men)

NULLIF(RaffarineParafine)

IFNULL(diplomeAucun )

Figure 4-7 Table Pilote

[ clauseRegroupement ]

[ HAVING condition ]

Web

Pilote

brevet nom nbHVol prime embauche typeAvion compa

PL-1 Gratien Viel 450 500 1965-02-05 A320 AF PL-2 Didier Donsez 0 1995-05-13 A320 AFPL-3 Richard Grin 1000 2001-09-11 A320 SING

PL-4 Placide Fresnais 2450 500 2001-09-21 A330 SING PL-5 Daniel Vielle 400 600 1965-01-16 A340 AF PL-6 Francoise Tort 0 2000-12-24 A340 CAST

4055_04_C04 Page 109 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

110 copy Eacuteditions Eyrolles

Fonctions de groupe

Nous eacutetudions dans cette section les fonctions usuelles Drsquoautres sont proposeacutees pour manipu-ler des cubes (datawarehouse)

Le tableau suivant preacutesente les principales fonctions Lrsquooption DISTINCT eacutevite les duplicatas(pris en compte sinon par deacutefaut) Agrave lrsquoexception de COUNT toutes les fonctions ignorent lesvaleurs NULL (il faudra utiliser IFNULL pour contrer cet effet)

Utiliseacutees sans GROUP BY ces fonctions srsquoappliquent agrave la totaliteacute ou agrave une seule partie drsquounetable comme le montrent les exemples suivants

Tableau 4-25 Fonctions de groupe

Fonction Objectif

AVG([DISTINCT] expr) Moyenne de expr (nombre)

COUNT( | [DISTINCT ] expr) Nombre de lignes ( toutes les lignes expr pour les colonnes non nulles)

GROUP_CONCAT(expr) Composition drsquoun ensemble de valeurs

MAX([DISTINCT] expr) Maximum de expr (nombre date chaicircne)

MIN([DISTINCT] expr) Minimum de expr (nombre date chaicircne)

STDDEV(expr) Eacutecart type de expr (nombre)

SUM([DISTINCT] expr) Somme de expr (nombre)

VARIANCE(expr) Variance de expr (nombre)

Tableau 4-26 Exemples de fonctions de groupe

Fonction Exemples

AVG Moyenne des heures de vol et des primes des pilotes de la compagnie AFSELECT FROM Pilote WHERE compa = AF+-------------+------------+| AVG(nbHVol) | AVG(prime) |+-------------+------------+| 283333333 | 5500000 |+-------------+------------+

COUNT Nombre de pilotes drsquoheures de vol et de primes (toutes et distinctes) recenseacutees dans la tableSELECT

FROM Pilote+----------+---------------+--------------+-----------------------+| COUNT() | COUNT(nbHVol) | COUNT(prime) | COUNT(DISTINCT prime) |+----------+---------------+--------------+-----------------------+| 6 | 5 | 4 | 3 |+----------+---------------+--------------+-----------------------+

WebAVG(nbHVol) AVG(prime)

COUNT() COUNT(nbHVol) COUNT(prime)COCOUNT(DISTINCT prime)

4055_04_C04 Page 110 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 111

chapitre ndeg 4 Interrogation des donneacutees

Eacutetudions agrave preacutesent ces fonctions dans le cadre de regroupements de lignes

Eacutetude du GROUP BY et HAVINGLe groupement de lignes dans une requecircte se programme au niveau surligneacute de lrsquoinstructionSQL suivante

SELECT col1[ col2hellip] fonction1Groupe(hellip)[fonction2Groupe(hellip)hellip]

FROM nomTable [ WHERE condition ]

[ORDER BY col1 | expr1 | position1 [ASC | DESC] [col1 ] ]

GROUP_CONCAT

Nom des pilotes de la compagnie AFSELECT compa FROM Pilote GROUP BY compa+-------+------------------------------------------+| compa | GROUP_CONCAT(nom) |+-------+------------------------------------------+| AF | Gratien VielDidier DonsezDaniel Vielle || CAST | Francoise Tort || SING | Richard GrinPlacide Fresnais |+-------+------------------------------------------+

MAX ndash MIN

Nombre drsquoheures de vol le plus eacuteleveacute date drsquoembauche la plus reacutecente Nombre drsquoheures de vol le moins eacuteleveacute date drsquoembauche la plus ancienneSELECT Date+

Date- FROM Pilote+-------------+------------+------------+------------+| MAX(nbHVol) | Date+ | MIN(prime) | Date- |+-------------+------------+------------+------------+| 245000 | 2001-09-21 | 0 | 1965-02-05 |+-------------+------------+------------+------------+

STDEV ndash SUM ndash VARIANCE

Eacutecart type des primes somme des heures de vol variance des primes des pilotes de la compagnie AFSELECT FROM Pilote WHERE compa = AF+---------------+-------------+-----------------+| STDDEV(prime) | SUM(nbHVol) | VARIANCE(prime) |+---------------+-------------+-----------------+| 500000 | 85000 | 25000000 |+---------------+-------------+-----------------+

Tableau 4-26 Exemples de fonctions de groupe (suite)

Fonction Exemples

GROUP_CONCAT(nom)

MAX(nbHVol) MAX(embauche) MIN(prime)MIN(embauche)

STDDEV(prime) SUM(nbHVol) VARIANCE(prime)

GROUP BY col1 | expr1 | position1 [col2 ]

[ HAVING condition ]

4055_04_C04 Page 111 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

112 copy Eacuteditions Eyrolles

La clause WHERE de la requecircte permet drsquoexclure des lignes pour chaque groupement ou derejeter des groupements entiers Elle srsquoapplique donc agrave la totaliteacute de la table

La clause GROUP BY liste les colonnes du groupement

La clause HAVING permet de poser des conditions sur chaque groupement

La clause ORDER BY permet de trier le reacutesultat (deacutejagrave eacutetudieacutee)

Les colonnes preacutesentes dans le SELECT doivent apparaicirctre dans le GROUP BY Seules desfonctions ou expressions peuvent exister en plus dans le SELECT

Les alias de colonnes ne peuvent pas ecirctre utiliseacutes dans la clause GROUP BY

Dans lrsquoexemple suivant en groupant sur la colonne compa trois ensembles de lignes (groupe-ments) sont composeacutes Il est alors possible drsquoappliquer des fonctions de groupe agrave chacun deces ensembles (dont le nombre nrsquoest pas preacuteciseacute dans la requecircte ni limiteacute par le systegraveme quiparcourt toute la table)

Il est aussi possible de grouper sur plusieurs colonnes (par exemple ici sur les colonnes compaet typeAvion pour classifier les pilotes selon ces deux critegraveres)

Utiliseacutees avec GROUP BY les fonctions srsquoappliquent deacutesormais agrave chaque regroupementcomme le montrent les exemples suivants

Figure 4-8 Groupement sur la colonne compa

Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY

Fonction Exemples

AVG Moyenne des heures de vol et des primes pour chaque compagnieSELECT compa AVG(nbHVol) AVG(prime) FROM Pilote +-------+-------------+------------+| compa | AVG(nbHVol) | AVG(prime) |+-------+-------------+------------+| AF | 283333333 | 5500000 || CAST | NULL | 00000 || SING | 1725000000 | 5000000 |+-------+-------------+------------+

Pilote

brevet nom nbHVol prime embauche typeAvion compa

PL-1 Gratien Viel 450 500 1965-02-05 A320 AF

PL-2 Didier Donsez 0 1995-05-13 A320 AF

PL-5 Daniel Vielle 400 600 1965-01-16 A340 AF

PL-6 Francoise Tort 0 2000-12-24 A340 CAST

PL-3 Richard Grin 1000 2001-09-11 A320 SING

PL-4 Placide Fresnais 2450 500 2001-09-21 A330 SING

Web

GROUP BY(compa)

4055_04_C04 Page 112 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 113

chapitre ndeg 4 Interrogation des donneacutees

COUNT Nombre de pilotes (et ceux qui ont de lrsquoexpeacuterience du vol) par compagnieSELECT compa COUNT() COUNT(nbHVol) FROM Pilote +-------+----------+---------------+| compa | COUNT() | COUNT(nbHVol) |+-------+----------+---------------+| AF | 3 | 3 || CAST | 1 | 0 || SING | 2 | 2 |+-------+----------+---------------+

MAX Nombre drsquoheures de vol le plus eacuteleveacute date drsquoembauche la plus reacutecente pour cha-que compagnieSELECT compa MAX(nbHVol) MAX(embauche) Date+ FROM Pilote +-------+-------------+------------+| compa | MAX(nbHVol) | Date+ |+-------+-------------+------------+| AF | 45000 | 1995-05-13 || CAST | NULL | 2000-12-24 || SING | 245000 | 2001-09-21 |+-------+-------------+------------+

STDEV ndash SUM (avec WHERE)

Eacutecarts types des primes et sommes des heures de vol des pilotes volant sur A320 de chaque compagnieSELECT compa STDDEV(prime) SUM(nbHVol) FROM Pilote WHERE typeAvion = A320 +-------+---------------+-------------+| compa | STDDEV(prime) | SUM(nbHVol) |+-------+---------------+-------------+| AF | 00000 | 45000 || SING | NULL | 100000 |+-------+---------------+-------------+

Plusieurs colonnes dans le GROUP BY

Nombre de pilotes qualifieacutes par type drsquoappareil et par compagnieSELECT compatypeAvion COUNT(brevet) FROM Pilote +-------+-----------+---------------+| compa | typeAvion | COUNT(brevet) |+-------+-----------+---------------+| AF | A320 | 2 || AF | A340 | 1 || CAST | A340 | 1 || SING | A320 | 1 || SING | A330 | 1 |+-------+-----------+---------------+

Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY (suite)

Fonction Exemples

GROUP BY(compa)

GROUP BY(compa)

GROUP BY(compa)

GROUP BY compatypeAvion

4055_04_C04 Page 113 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

114 copy Eacuteditions Eyrolles

Opeacuterateurs ensemblistes

Une des forces du modegravele relationnel repose sur le fait qursquoil est fondeacute sur une base matheacutema-tique (theacuteorie des ensembles) Le langage SQL devrait programmer les opeacuterations binaires(entre deux tables) suivantes

intersection qui extrait des donneacutees preacutesentes simultaneacutement dans les deux tables

union par les opeacuterateurs UNION et UNION ALL qui fusionnent des donneacutees des deuxtables

diffeacuterence qui extrait des donneacutees preacutesentes dans une table sans ecirctre preacutesentes dans ladeuxiegraveme table

produit carteacutesien par le fait de disposer de deux tables dans la clause FROM ce qui permetde composer des combinaisons agrave partir des donneacutees des deux tables

Restrictions

Seules des colonnes de mecircme type (CHAR VARCHAR DATE numeacuteriques etc) doivent ecirctrecompareacutees avec des opeacuterateurs ensemblistes

Lrsquointersection et la diffeacuterence ne sont pas encore disponibles sous MySQL La diffeacuterence seprogramme agrave lrsquoaide de DISTINCT et NOT IN lrsquointersection agrave lrsquoaide de DISTINCT et IN

Attention pour les colonnes CHAR agrave veiller agrave ce que la taille soit identique entre les deuxtables pour que la comparaison fonctionnne Le nom des colonnes nrsquoa pas drsquoimportance Il estpossible de comparer plusieurs colonnes de deux tables

GROUP BY et HAVING

Compagnies (et nombre de leurs pilotes) ayant plus drsquoun piloteSELECT compa COUNT(brevet) FROM Pilote +-------+---------------+| compa | COUNT(brevet) |+-------+---------------+| AF | 3 || SING | 2 |+-------+---------------+

Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY (suite)

Fonction Exemples

GROUP BY(compa)HAVING COUNT(brevet)gt=2

4055_04_C04 Page 114 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 115

chapitre ndeg 4 Interrogation des donneacutees

Exemple

Eacutetudions agrave preacutesent chaque opeacuterateur agrave partir de lrsquoexemple composeacute des deux tables suivantes

AvionsdeAF(immat CHAR(6) typeAvion CHAR(10) nbHVol DECIMAL(102))

AvionsdeSING(immatriculation CHAR(6) typeAv CHAR(10) prixAchatDECIMAL(142))

Il est vraisemblable que seules les deux premiegraveres colonnes doivent ecirctre compareacutees Bien quepermises par MySQL la programmation de lrsquounion lrsquointersection ou la diffeacuterence entre lesprix des avions et les heures de vol (deux colonnes numeacuteriques) ne seraient pas valides drsquounpoint de vue seacutemantique

Intersection

Lrsquointersection entre deux ensembles homogegravenes se programme agrave lrsquoaide drsquoune requecircte du typeSELECT DISTINCT ensemble1 FROM Table1 WHERE ensemble1 IN (SELECT ensemble2FROM Table2) Comme lrsquoopeacuterateur drsquointersection cette requecircte est commutative (Table1 peutjouer le rocircle de Table2 et ensemble1 celui drsquoensemble2)

Notez qursquoagrave lrsquoaffichage le nom des colonnes est donneacute par la premiegravere requecircte La deuxiegravemefait apparaicirctre deux colonnes dans le SELECT

Figure 4-9 Tables pour les opeacuterateurs ensemblistes

Web

AviondeAF

immat typeAvion nbHVol

F-WTSS Concorde 6570 F-GLFS A320 3500 F-GTMP A340

AviondeSING

immatriculation typeAv PrixAchat

S-ANSI A320 104 500 S-AVEZ A320 156 000 S-SMILE A330 198 000 F-GTMP A340 204 500

Tableau 4-28 Exemples drsquointersections

Besoin Requecircte

Quels sont les types drsquoavions que lesdeux compagnies exploitent en com-mun

SELECT FROM AvionsdeAF WHERE typeAvion IN (SELECT typeAv FROM AvionsdeSING)+-----------+| typeAvion |+-----------+| A320 || A340 |+-----------+

WebDISTINCT typeAvion

4055_04_C04 Page 115 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

116 copy Eacuteditions Eyrolles

Si vous voulez continuer ce raisonnement en vous basant sur trois compagnies il suffit drsquoajou-ter une clause WHERE dans les requecirctes imbriqueacutees qui interrogera la troisiegraveme compagnie Ceprincipe se geacuteneacuteralise et pour n compagnies il faudra n imbrications de requecirctes

Opeacuterateurs UNION et UNION ALL

Les opeacuterateurs UNION et UNION ALL sont commutatifs Lrsquoopeacuterateur UNION permet drsquoeacuteviter lesduplicatas (comme DISTINCT dans un SELECT) UNION ALL ne les eacutelimine pas

Quels sont les avions qui sont exploi-teacutes par les deux compagnies en com-mun

SELECT FROM AvionsdeSING WHERE immatriculation IN (SELECT immat FROM AvionsdeAF) AND typeAv IN (SELECT typeAvion FROM AvionsdeAF)+-----------------+--------+| immatriculation | typeAv |+-----------------+--------+| F-GTMP | A340 |+-----------------+--------+

Tableau 4-28 Exemples drsquointersections (suite)

Besoin Requecircte

DISTINCT immatriculation typeAv

Tableau 4-29 Exemples avec les opeacuterateurs UNION

Besoin Requecircte

Quels sont tous les types drsquoavions que les deux compagnies exploitent

SELECT typeAvion FROM AvionsdeAF UNIONSELECT typeAv FROM AvionsdeSING+-----------+| typeAvion |+-----------+| A320 || A340 || Concorde || A330 |+-----------+

Web

4055_04_C04 Page 116 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 117

chapitre ndeg 4 Interrogation des donneacutees

Ce principe se geacuteneacuteralise agrave lrsquounion de n ensembles par n requecirctes relieacutees avec n-1 clausesUNION ou UNION ALL

Diffeacuterence

La diffeacuterence entre deux ensembles homogegravenes se programme agrave lrsquoaide drsquoune requecircte du typeSELECT DISTINCT ensemble1 FROM Table1 WHERE ensemble1 NOT IN (SELECT ensemble2FROM Table2) Comme lrsquoopeacuterateur ensembliste cette requecircte nrsquoest pas commutative car elleprogramme ensemble1-ensemble2

Mecircme requecircte avec les duplicatas On extraitles types de la compagnie AF suivis des typesde la compagnie SING

SELECT typeAvion FROM AvionsdeAF UNION ALLSELECT typeAv FROM AvionsdeSING+-----------+| typeAvion |+-----------+| A320 || A340 || Concorde || A340 || A320 || A320 || A330 |+-----------+

Tableau 4-29 Exemples avec les opeacuterateurs UNION (suite)

Besoin RequecircteWeb

Tableau 4-30 Exemples de diffeacuterences

Besoin Requecircte

Quels sont les types drsquoavions exploiteacutes par lacompagnie AF mais pas par SING

SELECT DISTINCT typeAvion FROM AvionsdeAF WHERE typeAvion NOT IN (SELECT typeAv FROM AvionsdeSING)+-----------+| typeAvion |+-----------+| Concorde |+-----------+

Quels sont les types drsquoavions exploiteacutes par lacompagnie SING mais pas par AF

SELECT DISTINCT typeAv FROM AvionsdeSING WHERE typeAv NOT IN (SELECT typeAvion FROM AvionsdeAF)+--------+| typeAv |+--------+| A330 |+--------+

Web

4055_04_C04 Page 117 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

118 copy Eacuteditions Eyrolles

Ce principe se geacuteneacuteralise agrave la diffeacuterence entre n ensembles par imbrication de n requecirctes (dansle bon ordre)

La directive NOT IN doit ecirctre utiliseacutee avec prudence car elle retourne faux si un membrerameneacute par la sous-interrogation est NULL

Ordonner les reacutesultats

Le reacutesultat drsquoune requecircte contenant des opeacuterateurs ensemblistes est trieacute par deacutefaut par ordrecroissant sauf avec lrsquoopeacuterateur UNION ALL

La clause ORDER BY nrsquoest utilisable qursquoune fois en fin drsquoune requecircte incluant des opeacuterateursensemblistes Cette clause accepte le nom des colonnes de la premiegravere requecircte ou la positionde ces colonnes

Le tableau suivant preacutesente trois eacutecritures diffeacuterentes de la mecircme requecircte ensembliste conte-nant une clause ORDER BY Le besoin est de connaicirctre tous les types drsquoavions que les deuxcompagnies exploitent (classement par ordre deacutecroissant)

Notez que la troisiegraveme requecircte produit le mecircme reacutesultat en faisant intervenir un SELECT(aliaseacute) dans le FROM Ce meacutecanisme permet de construire dynamiquement la table agrave interroger

Tableau 4-31 Exemples avec la clause ORDER BY

Technique Requecircte

Nom de la colonne SELECT typeAvion FROM AvionsdeAF UNIONSELECT typeAv FROM AvionsdeSING

Position de la colonne hellip

SELECT dans le FROM SELECT TtypeAvion FROM T ORDER BY TtypeAvion DESC

+-----------+| typeAvion |+-----------+| Concorde || A340 || A330 || A320 |+-----------+

Web

ORDER BY typeAvion DESC

ORDER BY 1 DESC

(SELECT typeAvion FROM AvionsdeAF UNION SELECT typeAv FROM AvionsdeSING)

4055_04_C04 Page 118 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 119

chapitre ndeg 4 Interrogation des donneacutees

Il faut affecter des alias aux expressions de la premiegravere requecircte pour pouvoir les utiliser dansle ORDER BY final

Pour illustrer cette restriction supposons que nous deacutesirions faire la liste des avions avec leurprix drsquoachat augmenteacute de 20 liste trieacutee en fonction de cette derniegravere hausse Le problegravemeest que la table AvionsdeAF ne possegravede pas une telle colonne Ajoutons donc au SELECT decette table dans le tableau suivant la valeur 0 pour rendre possible lrsquoopeacuterateur UNION

Produit carteacutesien

En matheacutematiques le produit carteacutesien de deux ensembles E et F est lrsquoensemble des couples(x y) ougrave x isin E et y isin F En transposant au modegravele relationnel le produit carteacutesien de deuxtables T1 et T2 est lrsquoensemble des enregistrements (x y) ougrave x isin T1 et y isin T2

Le produit carteacutesien total entre deux tables T1 et T2 se programme sous SQL en positionnantles deux tables dans la clause FROM sans ajouter de conditions dans la clause WHERE Si les conditions sont de la forme c1 opeacuterateur c2 avec c1 isin T1 et c2 isin T2 on parlera dejointure Si les conditions sont de la forme c1 opeacuterateur valeur1 ou c2 opeacuterateur valeur2on parlera de produit carteacutesien restreint

Le produit carteacutesien restreint illustreacute par lrsquoexemple suivant exprime les combinaisons drsquoeacutequi-pages qursquoil est possible de reacutealiser en consideacuterant les pilotes de la compagnie AF et les avionsde la table AviondeAF

Tableau 4-32 Alias pour ORDER BY

Requecircte Reacutesultat

SELECT immatriculation FROM Avions-deSINGUNION SELECT immat 0 FROM AvionsdeAF ORDER BY px DESC

+-----------------+------------+| immatriculation | px |+-----------------+------------+| F-GTMP | 245400000 || S-MILE | 237600000 || S-AVEZ | 187200000 || S-ANSI | 125400000 || F-GLFS | 0000 || F-GTMP | 0000 || F-WTSS | 0000 |+-----------------+------------+

Web12prixAchat px

4055_04_C04 Page 119 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

120 copy Eacuteditions Eyrolles

Le nombre drsquoenregistrements reacutesultant drsquoun produit carteacutesien est eacutegal au produit du nombredrsquoenregistrements des deux tables mises en relation

Dans le cadre de notre exemple le nombre drsquoenregistrements du produit carteacutesien sera de2 pilotes x 3 avions = 6 enregistrements Le tableau suivant deacutecrit la requecircte SQL permettantde construire le produit carteacutesien restreint de notre exemple Les alias distinguent les colonnessrsquoil advenait qursquoil en existe de mecircme nom entre les deux tables

Bilan

Seules les colonnes de mecircme type et repreacutesentant la mecircme seacutemantique peuvent ecirctre compareacuteesagrave lrsquoaide de termes ensemblistes Il est possible drsquoajouter des expressions (constantes oucalculs) agrave une requecircte pour rendre homogegravenes les deux requecirctes et permettre ainsi lrsquoutilisationdrsquoun opeacuterateur ensembliste

Parce qursquoil faut utiliser NOT IN avec prudence diffeacuterentes alternatives aux opeacuterateurs ensem-blistes existent sur la base de jointures de type SQL2 (qui sont deacutetailleacutees dans la prochainesection) elles sont deacutetailleacutees par Pierre Caboche et mises en ligne sur le site Web associeacute agravelrsquoouvrage

Figure 4-10 Produit carteacutesien drsquoenregistrements de tables

AviondeAF

immat typeAvion nbHVol

F-WTSS Concorde 6570 F-GLFS A320 3500 F-GTMP A340

Pilote

brevet nom nbHVol compa

PL-1 Gratien Viel 450 AF PL-2 Richard Grin 1000 SING PL-3 Placide Fresnais 2450 CAST PL-4 Daniel Vielle 5000 AF

Tableau 4-33 Produit carteacutesien

Besoin Requecircte

Quels sont les couples possibles (avion pilote)en consideacuterant les avions et les pilotes de lacompagnie AF

6 lignes extraites

SELECT pbrevet avAFimmat FROM WHERE pcompa = AF+--------+--------+| brevet | immat |+--------+--------+| PL-1 | F-GLFS || PL-1 | F-GTMP || PL-1 | F-WTSS || PL-4 | F-GLFS || PL-4 | F-GTMP || PL-4 | F-WTSS |+--------+--------+

WebPilote p AvionsdeAF avAF

4055_04_C04 Page 120 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 121

chapitre ndeg 4 Interrogation des donneacutees

Jointures

Les jointures permettent drsquoextraire des donneacutees issues de plusieurs tables Le processus denormalisation du modegravele relationnel est baseacute sur la deacutecomposition et a pour conseacutequencedrsquoaugmenter le nombre de tables drsquoun scheacutema Ainsi la majoriteacute des requecirctes utilisent desjointures neacutecessaires pour pouvoir extraire des donneacutees de tables distinctes

Une jointure met en relation deux tables sur la base drsquoune clause de jointure (comparaison decolonnes) Geacuteneacuteralement cette comparaison fait intervenir une cleacute eacutetrangegravere drsquoune table avecune cleacute primaire drsquoune autre table (car le modegravele relationnel est fondamentalement baseacute surles valeurs)

En consideacuterant les tables suivantes les seules jointures logiques doivent se faire sur lrsquoeacutegaliteacutesoit des colonnes comp et compa soit des colonnes brevet et chefPil Ces jointurespermettront drsquoafficher des donneacutees drsquoune table (ou des deux tables) tout en posant des condi-tions sur une table (ou les deux) Par exemple lrsquoaffichage du nom des compagnies (colonne dela table Compagnie) qui ont embaucheacute un pilote ayant moins de 500 heures de vol (conditionsur la table Pilote)

Classification

Une jointure peut srsquoeacutecrire dans une requecircte SQL de diffeacuterentes maniegraveres

laquo relationnelle raquo (aussi appeleacutee laquo SQL89 raquo pour rappeler la version de la norme SQL) laquo SQL2 raquo (aussi appeleacutee laquo SQL92 raquo) laquo proceacutedurale raquo (qui qualifie la structure de la requecircte) laquo mixte raquo (combinaison des trois approches preacuteceacutedentes)

Figure 4-11 Deux tables agrave mettre en jointure

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF

4055_04_C04 Page 121 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

122 copy Eacuteditions Eyrolles

Nous allons principalement eacutetudier les deux premiegraveres eacutecritures qui sont les plus utiliseacuteesNous parlerons en fin de section des deux derniegraveres

Jointure relationnelle

La forme la plus courante de la jointure est la jointure dite laquo relationnelle raquo (aussi appeleacuteeSQL89) caracteacuteriseacutee par une seule clause FROM contenant les tables et alias agrave mettre en join-ture deux agrave deux La syntaxe geacuteneacuterale suivante deacutecrit une jointure relationnelle

SELECT [alias1]col1 [alias2]col2hellip

FROM [nomBase]nomTable1 [alias1] [nomBase]nomTable2 [alias2]hellip

WHERE (conditionsDeJointure)

Cette forme est la plus utiliseacutee car elle est la plus simple agrave eacutecrire Un autre avantage de ce typede jointure est qursquoelle laisse le soin au SGBD drsquoeacutetablir la meilleure strateacutegie drsquoaccegraves (choix dupremier index agrave utiliser puis du deuxiegraveme etc) pour optimiser les performances

Afin drsquoeacuteviter les ambiguiumlteacutes concernant le nom des colonnes on utilise en geacuteneacuteral des alias detables pour suffixer les tables dans la clause FROM et preacutefixer les colonnes dans les clausesSELECT et WHERE

Jointures SQL2

Afin de se rendre conforme agrave la norme SQL2 MySQL propose aussi des directives qui permet-tent de programmer drsquoune maniegravere plus verbale les diffeacuterents types de jointures

SELECT [ALL | DISTINCT | DISTINCTROW ] listeColonnes

FROM [nomBase]nomTable1 [ INNER | LEFT | RIGHT [OUTER] ]

JOIN [nomBase]nomTable2 ON condition | USING ( colonne1 [ colonne2] )

| CROSS JOIN | NATURAL [ LEFT | RIGHT [OUTER] ]

JOIN [nomBase]nomTable2 hellip

[ WHERE condition ]

Cette eacutecriture est moins utiliseacutee que la syntaxe relationnelle Bien que plus concise pour desjointures agrave deux tables elle se complique pour des jointures plus complexes

4055_04_C04 Page 122 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 123

chapitre ndeg 4 Interrogation des donneacutees

Types de jointures

Bien que dans le vocabulaire courant on ne parle que de laquo jointures raquo en fonction de la naturede lrsquoopeacuterateur utiliseacute dans la requecircte de la clause de jointure et des tables concerneacutees ondistingue

Les jointures internes (inner joins)

ndash Lrsquoeacutequijointure (equi join) est la plus connue elle utilise lrsquoopeacuterateur drsquoeacutegaliteacute dans laclause de jointure La jointure naturelle est conditionneacutee en plus par le nom des colon-nes La non eacutequijointure utilise lrsquoopeacuterateur drsquoineacutegaliteacute dans la clause de jointure

ndash Lrsquoautojointure (self join) est un cas particulier de lrsquoeacutequijointure qui met en œuvre deuxfois la mecircme table (des alias de tables permettront de distinguer les enregistrementsentre eux)

La jointure externe (outer join) la plus compliqueacutee qui favorise une table (ditelaquo dominante raquo) par rapport agrave lrsquoautre (dite laquo subordonneacutee raquo) Les lignes de la table domi-nante sont retourneacutees mecircme si elles ne satisfont pas aux conditions de jointure

Le tableau suivant illustre cette classification sous la forme de quelques conditions appliqueacuteesagrave notre exemple

Pour mettre trois tables T1 T2 et T3 en jointure il faut utiliser deux clauses de jointures (uneentre T1 et T2 et lrsquoautre entre T2 et T3) Pour n tables il faut n-1 clauses de jointures Si vousoubliez une clause de jointure un produit carteacutesien restreint est geacuteneacutereacute

Eacutetudions agrave preacutesent chaque type de jointure avec les syntaxes laquo relationnelle raquo et laquo SQL2 raquo

Eacutequijointure

Une eacutequijointure utilise lrsquoopeacuterateur drsquoeacutegaliteacute dans la clause de jointure et compare geacuteneacuterale-ment des cleacutes primaires avec des cleacutes eacutetrangegraveres

En consideacuterant les tables suivantes les eacutequijointures se programment soit sur les colonnescomp et compa soit sur les colonnes brevet et chefPil Extrayons par exemple

Tableau 4-34 Exemples de conditions

Type de jointure Syntaxe de la condition

Eacutequijointure hellipWHERE comp compa

Autojointure hellipWHERE chefPil = brevet

Jointure externe hellipFROM Compagnie Pilote ON comp = compa

=

alias1 alias2

LEFT OUTER JOIN

4055_04_C04 Page 123 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

124 copy Eacuteditions Eyrolles

lrsquoidentiteacute des pilotes de la compagnie de nom Air France ayant plus de 500 heures de vol(requecircte R1)

les coordonneacutees des compagnies qui embauchent des pilotes de moins de 500 heures devol (requecircte R2)

La jointure qui reacutesoudra la premiegravere requecircte est illustreacutee dans la figure par les donneacutees griseacuteestandis que la deuxiegraveme jointure est repreacutesenteacutee par les donneacutees en gras

Eacutecriture laquo relationnelle raquo

bull MySQL recommande drsquoutiliser des alias de tables pour ameacuteliorer les performances

bull Les alias sont obligatoires quand des colonnes de diffeacuterentes tables portent le mecircme nomou dans le cas drsquoautojointures

Eacutecriture laquo SQL2 raquo

bull La clause JOIN hellip ON condition permet de programmer une eacutequijointure

bull Lrsquoutilisation de la directive INNER devant JOINhellip est optionnelle et est appliqueacutee par deacutefaut

Le tableau suivant deacutetaille ces requecirctes avec les deux syntaxes Les clauses de jointures sontgriseacutees

Figure 4-12 Eacutequijointures

Web

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF

4055_04_C04 Page 124 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 125

chapitre ndeg 4 Interrogation des donneacutees

Autojointure

Cas particulier de lrsquoeacutequijointure lrsquoautojointure relie une table agrave elle mecircme

Extrayons par exemple

lrsquoidentiteacute des pilotes placeacutes sous la responsabiliteacute des pilotes de nom Alquieacute(requecircte R3)

la somme des heures de vol des pilotes placeacutes sous la responsabiliteacute des chefs pilotes de lacompagnie de nom Air France (requecircte R4)

Ces requecirctes doivent ecirctre programmeacutees agrave lrsquoaide drsquoune autojointure car elles imposent deparcourir deux fois la table Pilote (examen de chaque pilote en le comparant agrave un autre)Les autojointures sont reacutealiseacutees entre les colonnes brevet et chefPil

La jointure de la premiegravere requecircte est illustreacutee dans la figure par les donneacutees surligneacutees enclair tandis que la deuxiegraveme jointure est mise en valeur par les donneacutees surligneacutees en fonceacute

Tableau 4-35 Exemples drsquoeacutequijointures

Requecircte Jointure relationnelle Jointure SQL2

R1 SELECT brevet nom FROM Pilote Compagnie AND nomComp = Air France AND nbHVol gt 500

SELECT brevet nom FROM Compagnie WHERE nomComp = Air France AND nbHVol gt 500

+--------+--------------+| brevet | nom |+--------+--------------+| PL-2 | Didier Linxe || PL-4 | Henri Alquieacute |+--------+--------------+

R2 SELECT cpgnomComp cpgnrue cpgrue cpgville FROM Pilote pil Compagnie cpg AND pilnbHVol lt 500

SELECT nomComp nrue rue ville FROM Compagnie WHERE nbHVol lt 500

+------------+------+------------+-------+| nomComp | nrue | rue | ville |+------------+------+------------+-------+| Air France | 124 | Port Royal | Paris |+------------+------+------------+-------+

Web

WHERE comp = compa JOIN Pilote ON comp = compa

WHERE cpgcomp = pilcompaINNER JOIN Pilote ON comp = compa

4055_04_C04 Page 125 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

126 copy Eacuteditions Eyrolles

Le tableau suivant deacutetaille ces requecirctes les clauses drsquoautojointures sont surligneacutees Dans lesdeux syntaxes il est impeacuteratif drsquoutiliser un alias de table Concernant lrsquoeacutecriture laquo SQL2 raquo onremarque que les clauses JOIN srsquoimbriquent (pour joindre plus de deux tables)

Figure 4-13 Autojointures

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF

Tableau 4-36 Exemples drsquoautojointures

Requecircte Jointure relationnelle Jointure SQL2

R3 SELECT p1brevet p1nom FROM Pilote p1 Pilote p2 AND p2nom LIKE Alquieacute

SELECT p1brevet p1nom FROM Pilote p1 WHERE p2nom LIKE Alquieacute

+--------+----------------+| brevet | nom |+--------+----------------+| PL-1 | Pierre Lamothe || PL-2 | Didier Linxe |+--------+----------------+

R4 SELECT SUM(p1nbHVol) FROM Pilote p1 Pilote p2 Compagnie cpg AND cpgnomComp = Air France

SELECT SUM(p1nbHVol) FROM Pilote p1 WHERE nomComp = Air France

+----------------+| SUM(p1nbHVol) |+----------------+| 135000 |+----------------+

Web

WHERE p1chefPil = p2brevet JOIN Pilote p2ON p1chefPil = p2brevet

WHERE p1chefPil = p2brevetAND cpgcomp = p2compa

JOIN Pilote p2ON p1chefPil = p2brevet

JOIN CompagnieON comp = p2compa

4055_04_C04 Page 126 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 127

chapitre ndeg 4 Interrogation des donneacutees

Ineacutequijointure

Les requecirctes drsquoineacutequijointures font intervenir tout type drsquoopeacuterateur (ltgt gt lt gt= lt= BETWEENLIKE IN) Agrave lrsquoinverse des eacutequijointures la clause drsquoune ineacutequijointure nrsquoest pas baseacutee surlrsquoeacutegaliteacute de cleacutes primaires (ou candidates) et de cleacutes eacutetrangegraveres

En consideacuterant les tables suivantes extrayons par exemple

les pilotes ayant plus drsquoexpeacuterience que le pilote de numeacutero de brevet PL-2 (requecircte R5)

le titre de qualification des pilotes en raisonnant sur la comparaison des heures de vol avecun ensemble de reacutefeacuterence ici la table HeuresVol (requecircte R6) Dans notre exemple ilsrsquoagit par exemple de retrouver le fait que le premier pilote est deacutebutant

La jointure qui reacutesoudra la deuxiegraveme requecircte est illustreacutee par les niveaux de gris

Le tableau suivant deacutetaille ces requecirctes les clauses drsquoineacutequijointures sont surligneacutees

Figure 4-14 Ineacutequijointures

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-4PL-2 Didier Linxe 900 AF PL-4PL-3 Christian Soutou 1000 SINGPL-4 Henri Alquieacute 3400 AF

HeuresVol

titre basnbHVol hautnbHVol

Deacutebutant 0 500Initieacute 501 1000Expert 1001 20000

Tableau 4-37 Exemples drsquoineacutequijointures

Requecircte Jointure relationnelle Jointure SQL2

R5 SELECT p1brevet p1nomp1nbHVol p2nbHVol Reacutefeacuterence FROM Pilote p1 Pilote p2

AND p2brevet = PL-2

SELECT p1brevet p1nom p1nbHVol p2nbHVol Reacutefeacuterence FROM Pilote p1 WHERE p2brevet = PL-2

+--------+------------------+---------+-----------+| brevet | nom | nbHVol | Reacutefeacuterence |+--------+------------------+---------+-----------+| PL-3 | Christian Soutou | 100000 | 90000 || PL-4 | Henri Alquieacute | 340000 | 90000 |+--------+------------------+---------+-----------+

Web

WHERE p1nbHVol gt p2nbHVolJOIN

Pilote p2 ON p1nbHVolgtp2nbHVol

4055_04_C04 Page 127 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

128 copy Eacuteditions Eyrolles

Jointures externes

Les jointures externes permettent drsquoextraire des enregistrements qui ne reacutepondent pas aux cri-tegraveres de jointure Lorsque deux tables sont en jointure externe une table est laquo dominante raquo parrapport agrave lrsquoautre (qui est dite laquo subordonneacutee raquo) Ce sont les enregistrements de la table domi-nante qui sont retourneacutes (mecircme srsquoils ne satisfont pas aux conditions de jointure)

Comme les jointures internes les jointures externes sont geacuteneacuteralement baseacutees sur les cleacutesprimaires et eacutetrangegraveres On distingue les jointures unilateacuterales qui considegraverent une table domi-nante et une table subordonneacutee et les jointures bilateacuterales pour lesquelles les tables jouent unrocircle symeacutetrique (pas de dominant)

Jointures unilateacuterales

En consideacuterant les tables suivantes une jointure externe unilateacuterale permet drsquoextraire

la liste des compagnies et leurs pilotes mecircme les compagnies nrsquoayant pas de pilote(requecircte R7) Sans une jointure externe la compagnie CAST ne peut ecirctre extraite

la liste des pilotes et leurs qualifications mecircme les pilotes nrsquoayant pas encore de qualifica-tion (requecircte R8)

La figure illustre les tables dominantes et subordonneacutees

R6 SELECT pilbrevet pilnom pilnbHVol hvtitre FROM Pilote pil HeuresVol hv

SELECT brevet nom nbHVol titre FROM Pilote

+--------+------------------+---------+----------+| brevet | nom | nbHVol | titre |+--------+------------------+---------+----------+| PL-1 | Pierre Lamothe | 45000 | Deacutebutant || PL-2 | Didier Linxe | 90000 | Initieacute || PL-3 | Christian Soutou | 100000 | Initieacute || PL-4 | Henri Alquieacute | 340000 | Expert |+--------+------------------+---------+----------+

Tableau 4-37 Exemples drsquoineacutequijointures (suite)

Requecircte Jointure relationnelle Jointure SQL2

WHERE pilnbHVol BETWEENhvbasnbHVol AND hvhautnbHVol

JOIN HeuresVol ON nbHVolBETWEEN basnbHVol AND hautnbHVol

4055_04_C04 Page 128 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 129

chapitre ndeg 4 Interrogation des donneacutees

Eacutecriture laquo SQL2 raquo

Le sens de la directive de jointure externe LEFT ou RIGHT de la clause OUTER JOIN deacutesignela table dominante

Le tableau suivant deacutetaille les requecirctes de notre exemple les clauses de jointures externesunilateacuterales sont griseacutees Les tables dominantes sont noteacutees en gras (Compagnie pour lapremiegravere requecircte et Pilote pour la deuxiegraveme)

Figure 4-15 Jointures externes unilateacuterales

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alqu ieacute 3400 AF

Qualifs

brevet typeAv validite

PL-4 A320 2005-06-24 PL-4 A340 2005-06-24 PL-2 A320 2006-04-04 PL-3 A330 2006-05-13

dominantedominante

subordonneacutee

subordonneacutee

Tableau 4-38 Eacutecritures eacutequivalentes de jointures externes unilateacuterales

Requecircte Jointures relationnelles Jointures SQL2

R7 Sans objet SELECT nomComp brevet nom FROM Compagnie --eacutequivalent agraveSELECT nomComp brevet nom FROM Pilote

+--------------+--------+------------------+| nomComp | brevet | nom |+--------------+--------+------------------+| Air France | PL-1 | Pierre Lamothe || Air France | PL-2 | Didier Linxe || Air France | PL-4 | Henri Alquieacute || || Singapore AL | PL-3 | Christian Soutou |+--------------+--------+------------------+

WebLEFT OUTER JOIN Pilote ON comp = compa

RIGHT OUTER JOIN Compagnie ON comp = compa

Castanet AL | NULL | NULL

4055_04_C04 Page 129 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

130 copy Eacuteditions Eyrolles

Jointures bilateacuterales

Les deux tables jouent un rocircle symeacutetrique il nrsquoy a pas de table dominante Ce type de jointurepermet drsquoextraire des enregistrements qui ne reacutepondent pas aux critegraveres de jointure des deuxcocircteacutes de la clause de jointure

En consideacuterant les tables suivantes une jointure externe bilateacuterale permet drsquoextraire parexemple

la liste des compagnies et leurs pilotes incluant les compagnies nrsquoayant pas de pilote et lespilotes rattacheacutes agrave aucune compagnie (requecircte R9)

la liste des pilotes et leurs qualifications incluant les pilotes nrsquoayant pas encore drsquoexpeacute-rience et les qualifications associeacutees agrave des pilotes inconnus (requecircte R10)

R8 Sans objet SELECT quatypeAv pilbrevet pilnom FROM Qualifs qua --eacutequivalent agraveSELECT quatypeAv pilbrevet pilnom FROM Pilote pil

+--------+--------+------------------+| typeAv | brevet | nom |+--------+--------+------------------+| || A320 | PL-2 | Didier Linxe || A330 | PL-3 | Christian Soutou || A320 | PL-4 | Henri Alquieacute || A340 | PL-4 | Henri Alquieacute |+--------+--------+------------------+

Tableau 4-38 Eacutecritures eacutequivalentes de jointures externes unilateacuterales

Requecircte Jointures relationnelles Jointures SQL2

RIGHT OUTER JOIN Pilote pilON pilbrevet = quabrevet

LEFT OUTER JOIN Qualifs quaON pilbrevet = quabrevet

NULL | PL-1 | Pierre Lamothe

4055_04_C04 Page 130 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 131

chapitre ndeg 4 Interrogation des donneacutees

Eacutecriture laquo SQL2 raquo

La directive FULL OUTER JOIN permet drsquoignorer lrsquoordre (et donc le sens de la jointure) destables dans la requecircte

Le seul problegraveme crsquoest que

MySQL ne prend pas encore en charge en version 50 la directive FULL OUTER JOIN

Le tableau suivant deacutetaille les requecirctes de notre exemple les clauses de jointures externesbilateacuterales sont surligneacutees Les enregistrements qui ne respectent pas la condition de jointuresont surligneacutes

Figure 4-16 Jointures externes bilateacuterales

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

CAST 1 G Brassens Blagnac Castanet AL

Pilote

brevet nom nbHVol compa

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings

Qualifs

brevet typeAv validite

PL-4 A320 2005-06-24 PL-2 A320 2006-04-04 PL-3 A330 2006-05-13 PL-7 A380 2007-07-20

4055_04_C04 Page 131 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

132 copy Eacuteditions Eyrolles

Jointures proceacutedurales

Les jointures proceacutedurales sont eacutecrites par des requecirctes qui contiennent des sous-interroga-tions (SELECT imbriqueacute) Chaque clause FROM ne contient qursquoune seule table

SELECT colonnesTable1 FROM [nomBase]nomTable1 WHERE colonne(s) | expression(s) IN | = | opeacuterateur (SELECT colonne(s)delaTable2 FROM [nomBase]nomTable2 WHERE colonne(s) | expression(s) IN | = | opeacuterateur (SELECT hellip) [AND (conditionsTable2)] ) [AND (conditionsTable1)]

Tableau 4-39 Jointures externes bilateacuterales

Requecircte Jointure relationnelle Jointures (theacuteoriques) SQL2

R9 Sans objet SELECT nomComp brevet nom FROM Pilote --eacutequivalent agraveSELECT nomComp brevet nom FROM Compagnie

NOMCOMP BREVET NOM--------------- ------ --------------------Air France PL-4 Henri AlquieacuteAir France PL-1 Pierre LamotheAir France PL-2 Didier LinxeSingapore AL PL-3 Christian Soutou

R10 Sans objet SELECT quatypeAv pilbrevet pilnom FROM Pilote pil --eacutequivalent agraveSELECT quatypeAv pilbrevet pilnom FROM Qualifs qua

TYPE BREVET NOM---- ------ --------------------A320 PL-4 Henri AlquieacuteA320 PL-2 Didier LinxeA330 PL-3 Christian Soutou

WebFULL OUTER JOIN Compagnie ON comp = compa

FULL OUTER JOIN Pilote ON comp = compa

Castanet AL PL-5 Michel Castaings

FULL OUTER JOIN Qualifs quaON pilbrevet = quabrevet

FULL OUTER JOIN Pilote pilON pilbrevet = quabrevet

A380 PL-1 Pierre Lamothe PL-5 Michel Castaings

4055_04_C04 Page 132 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 133

chapitre ndeg 4 Interrogation des donneacutees

Cette forme drsquoeacutecriture nrsquoest pas la plus utiliseacutee mais elle permet de mieux visualiser certainesjointures Elle est plus complexe agrave eacutecrire car lrsquoordre drsquoapparition des tables dans les clausesFROM a son importance

Seules les colonnes de la table qui se trouve au niveau du premier SELECT peuvent ecirctreextraites

La sous-interrogation doit ecirctre placeacutee entre parenthegraveses Elle ne doit pas comporter de clauseORDER BY mais peut inclure GROUP BY et HAVING

Le reacutesultat drsquoune sous-interrogation est utiliseacute par la requecircte de niveau supeacuterieur Une sous-interrogation est exeacutecuteacutee avant la requecircte de niveau supeacuterieur

Une sous-interrogation peut ramener une ou plusieurs lignes Les opeacuterateurs = gt lt gt= lt=permettent drsquoen extraire une les opeacuterateurs IN ANY et ALL permettent drsquoen ramenerplusieurs

Sous-interrogations monolignes

Le tableau suivant deacutetaille quelques sous-interrogations monolignes Nous nous basons surcertaines requecirctes deacutejagrave eacutetudieacutees (forme relationnelle et SQL2)

Tableau 4-40 Sous-interrogations monolignes

Opeacuterateur Besoin Requecircte

= pour les eacutequi-jointures ou auto-jointures (= teste une ligne)

R1 (Pilotes de la compagnie de nom Air France ayant plus de 500 heures de vol)

SELECT brevet nom FROM Pilote WHERE compa AND nbHVolgt500

R3 (Pilotes sous la respon-sabiliteacute du pilote de nom Alquieacute)

SELECT brevet nom FROM Pilote WHERE chefPil =

gt pour les ineacutequi-jointures

R5 (Pilotes ayant plus drsquoexpeacuterience que le pilote de brevet PL-2)

SELECT brevet nom nbHVol FROM Pilote WHERE nbHVol gt

Web=

(SELECT compFROM CompagnieWHERE nomComp = Air France)

(SELECT brevet FROM PiloteWHERE nom LIKE Alquieacute)

(SELECT nbHVol FROM PiloteWHERE brevet = PL-2)

4055_04_C04 Page 133 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

134 copy Eacuteditions Eyrolles

Sous-interrogations multilignes (IN ALL et ANY)

Les opeacuterateurs multilignes sont les suivants

bull IN compare un eacuteleacutement agrave une donneacutee quelconque drsquoune liste rameneacutee par la sous-interro-gation Cet opeacuterateur est utiliseacute pour les eacutequijointures et les autojointures (et les intersec-tions) Lrsquoopeacuterateur NOT IN sera employeacute pour les jointures externes (et les diffeacuterences)

bull ANY compare lrsquoeacuteleacutement agrave chaque donneacutee rameneacutee par la sous-interrogation Lrsquoopeacuterateurlaquo =ANY raquo eacutequivaut agrave IN Lrsquoopeacuterateur laquo ltANY raquo signifie laquo infeacuterieur agrave au moins une desvaleurs raquo donc laquo infeacuterieur au maximum raquo Lrsquoopeacuterateur laquo gtANY raquo signifie laquo supeacuterieur agrave aumoins une des valeurs raquo donc laquo supeacuterieur au minimum raquo

bull ALL compare lrsquoeacuteleacutement agrave tous ceux rameneacutes par la sous-interrogation Lrsquoopeacuterateur laquo ltALL raquosignifie laquo infeacuterieur au minimum raquo et laquo gtALL raquo signifie laquo supeacuterieur au maximum raquo

Le tableau suivant deacutetaille quelques sous-interrogations multilignes Le dernier exempleprogramme une partie drsquoune jointure externe

La directive NOT IN doit ecirctre utiliseacutee avec prudence car elle retourne faux si un membrerameneacute par la sous-interrogation est NULL

Tableau 4-41 Sous-interrogations multilignes

Opeacuterateur Besoin Requecircte

IN R2 Coordonneacutees des compagnies qui embauchent des pilotes de moins de 500 heures de vol

SELECT nomComp nrue rue ville FROM Compagnie WHERE comp (

= et IN R4 Somme des heures de vol des pilotes placeacutes sous la responsabiliteacute des chefs pilotes de la compagnie de nom Air France

SELECT SUM(nbHVol) FROM Pilote WHERE chefPil ( )

NOT IN Compagnies nrsquoayant pas de pilote SELECT nomComp nrue rue ville FROM Compagnie WHERE comp

Web

INSELECT compa FROM Pilote

WHERE nbHVol lt 500)

INSELECT brevet FROM PiloteWHERE compa =

(SELECT comp FROM CompagnieWHERE nomComp = Air France)

NOT IN(SELECT compa FROM PiloteWHERE compa IS NOT NULL)

4055_04_C04 Page 134 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 135

chapitre ndeg 4 Interrogation des donneacutees

Afin drsquoillustrer les opeacuterateurs ANY et ALL consideacuterons la table suivante Nous avons indiqueacuteen gras les nombres drsquoheures minimal et maximal des A320 en griseacute les nombres drsquoheuresminimal et maximal des avions de la compagnie AF

Le tableau suivant deacutetaille quelques jointures proceacutedurales utilisant les opeacuterateurs ALL etANY

Figure 4-17 Table Avion

Avions

immat typeAv nbHVol compa

A1 A320 1000 AF A2 A330 1500 AF A3 A320 550 SING A4 A340 1800 SING A5 A340 200 AF A6 A330 100 AF

Tableau 4-42 Opeacuterateurs ALL et ANY

Opeacuterateur Besoin Requecircte et reacutesultat

ANY R11 Avions dont le nombre drsquoheures de vol est infeacuterieur agrave celui de nrsquoimporte quel A320

SELECT immat typeAv nbHVol FROM Avion WHERE nbHVol +-------+--------+--------+| immat | typeAv | nbHVol |+-------+--------+--------+| A3 | A320 | 55000 || A5 | A340 | 20000 || A6 | A330 | 10000 |+-------+--------+--------+

R12 Compagnies et leurs avions dont le nombre drsquoheures de vol est supeacute-rieur agrave celui de nrsquoimporte quel avion de la compagnie de code SING

SELECT immat typeAv nbHVol compa FROM Avion WHERE nbHVol +-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A1 | A320 | 100000 | AF || A2 | A330 | 150000 | AF || A4 | A340 | 180000 | SING |+-------+--------+---------+-------+

lt ANY(SELECT nbHVol FROM AvionWHERE typeAv=A320)

gt ANY(SELECT nbHVol FROM AvionWHERE compa = SING)

4055_04_C04 Page 135 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

136 copy Eacuteditions Eyrolles

Jointures mixtes

Une jointure mixte combine des clauses de jointures relationnelles proceacutedurales (avec dessous-interrogations) ou des clauses de jointures SQL2

Jointure relationnelle proceacutedurale

La jointure mixte suivante combine une clause de jointure relationnelle (en gras) avec unejointure proceacutedurale (en surligneacute) pour programmer la requecircte R4

SELECT SUM(p1nbHVol)

FROM Pilote p1 Pilote p2

WHERE p1chefPil = p2brevet

AND

Ce type drsquoeacutecriture peut ecirctre inteacuteressant srsquoil nrsquoest pas neacutecessaire drsquoafficher des colonnes destables preacutesentes dans les sous-interrogations ou si lrsquoon deacutesire appliquer des fonctions agrave desregroupements

ALL R13 Avions dont le nombre drsquoheures de vol est infeacuterieur agrave tous les A320

SELECT immat typeAv nbHVol FROM Avion WHERE nbHVol +-------+--------+--------+| immat | typeAv | nbHVol |+-------+--------+--------+| A5 | A340 | 20000 || A6 | A330 | 10000 |+-------+--------+--------+

R14 Compagnies et leurs avions dont le nombre drsquoheures de vol est supeacute-rieur agrave tous les avions de la compagnie de code AF

SELECT immat typeAv nbHVol compa FROM Avion WHERE nbHVol +-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A4 | A340 | 180000 | SING |+-------+--------+---------+-------+

Tableau 4-42 Opeacuterateurs ALL et ANY (suite)

Opeacuterateur Besoin Requecircte et reacutesultat

lt ALL(SELECT nbHVol FROM AvionWHERE typeAv=A320)

gt ALL(SELECT nbHVol FROM AvionWHERE compa = AF)

p2compa = (SELECT comp FROM Compagnie WHERE nomComp =

Air France)

4055_04_C04 Page 136 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 137

chapitre ndeg 4 Interrogation des donneacutees

Sous-interrogation dans la clause FROM

Introduite dans SQL2 la possibiliteacute de construire dynamiquement une table dans la clauseFROM drsquoune requecircte est opeacuterationnelle sous MySQL

SELECT listeColonnes

FROM table1 aliasTable1 (SELECThellip FROM table2 WHEREhellip) aliasTable2

[ WHERE (conditionsTable1etTable2) ]

Consideacuterons la table suivante Le but est drsquoextraire le pourcentage partiel de pilotes parcompagnie Dans notre exemple il y a 5 pilotes dont 3 deacutependent de AF Pour cette compa-gnie le pourcentage partiel de pilotes est de 35 soit 60

La requecircte suivante construit dynamiquement deux tables (alias a et b) dans la clause FROMpour reacutepondre agrave cette question

Sous-interrogations synchroniseacutees

Une sous-interrogation est synchroniseacutee si elle manipule des colonnes drsquoune table du niveausupeacuterieur Une sous-interrogation synchroniseacutee est exeacutecuteacutee une fois pour chaque enregistre-

Figure 4-18 Table Pilote

Pilote

brevet nom nbHVol compa

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings

Tableau 4-43 SELECT dans un FROM

Requecircte et tables eacutevalueacutees dans le FROM Reacutesultat

SELECT acompa Comp anbpilbtotal100 Pilote FROM a b +------+---------+

| Comp | Pilote |+------+---------+| NULL | 200000 || AF | 600000 || SING | 200000 |+------+---------+

(SELECT compa COUNT() nbpilFROM Pilote GROUP BY compa)

(SELECT COUNT() total FROM Pilote)

a

compa nbpil

AF 3

SING 1

1

b

total

5

4055_04_C04 Page 137 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

138 copy Eacuteditions Eyrolles

ment extrait par la requecircte de niveau supeacuterieur Cette technique peut ecirctre aussi utiliseacutee dans lesordres UPDATE et DELETE La forme geacuteneacuterale drsquoune sous-interrogation synchroniseacutee est lasuivante Les alias des tables sont utiles pour pouvoir manipuler des colonnes de tables dediffeacuterents niveaux

Une sous-interrogation synchroniseacutee peut ramener une ou plusieurs lignes Diffeacuterents opeacutera-teurs peuvent ecirctre employeacutes (= gt lt gt= lt= EXISTS)

Opeacuterateur matheacutematique

Le tableau suivant deacutetaille un exemple drsquoopeacuterateur matheacutematique appliqueacute agrave une sous-interro-gation synchroniseacutee

Opeacuterateur EXISTS

Lrsquoopeacuterateur EXISTS permet drsquointerrompre la sous-interrogation degraves le premier enregistrementtrouveacute La valeur FALSE est retourneacutee si aucun enregistrement nrsquoest extrait par la sous-interro-gation

SELECT alias1c

FROM nomTable1 alias1

WHERE colonne(s) opeacuterateur (SELECT alias2zhellip

FROM nomTable2 alias2

WHERE alias1x opeacuterateur alias2y )

[AND ( conditionsTable1 )]

Tableau 4-44 Sous-interrogation synchroniseacutee

Besoin Requecircte et reacutesultat

R15 Avions dont le nombre drsquoheures de vol est supeacuterieur au nombre drsquoheures de vol moyen des avions de leur compagnie (ici 700 heures pour AF et 1115 heures pour SING)

SELECT avi1 FROM Avion avi1 WHERE avi1nbHVol

+-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A1 | A320 | 100000 | AF || A2 | A330 | 150000 | AF || A4 | A340 | 180000 | SING |+-------+--------+---------+-------+

gt(SELECT AVG(avi2nbHVol) FROM Avion avi2WHERE avi2compa = avi1compa)

4055_04_C04 Page 138 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 139

chapitre ndeg 4 Interrogation des donneacutees

Utilisons la table suivante pour deacutecrire lrsquoutilisation de lrsquoopeacuterateur EXISTS

La sous-interrogation synchroniseacutee est surligneacutee dans le script suivant

Opeacuterateur NOT EXISTS

Lrsquoopeacuterateur NOT EXISTS retourne la valeur TRUE si aucun enregistrement nrsquoest extrait par lasous-interrogation Cet opeacuterateur peut ecirctre utiliseacute pour eacutecrire des jointures externes

Figure 4-19 Utilisation de EXISTS

Pilote

brevet nom nbHVol compa chefPil

PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings

Tableau 4-45 Opeacuterateur EXISTS

Besoin Requecircte et reacutesultat

R15 Pilotes ayant au moins un pilote sous leur responsabiliteacute

SELECT pil1brevet pil1nom pil1compa FROM Pilote pil1 WHERE

+--------+--------------+-------+| brevet | nom | compa |+--------+--------------+-------+| PL-4 | Henri Alquieacute | AF |+--------+--------------+-------+

WebEXISTS

(SELECT pil2 FROM Pilote pil2WHERE pil2chefPil = pil1brevet)

Tableau 4-46 Opeacuterateur NOT EXISTS

Besoin Requecircte et reacutesultat

Liste des compagnies nrsquoayant pas de pilote

SELECT cpg FROM Compagnie cpg WHERE NOT EXISTS

+------+------+-------------+---------+-------------+| comp | nrue | rue | ville | nomComp |+------+------+-------------+---------+-------------+| CAST | 1 | G Brassens | Blagnac | Castanet AL |+------+------+-------------+---------+-------------+

(SELECT compa FROM PiloteWHERE compa = cpgcomp)

4055_04_C04 Page 139 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

140 copy Eacuteditions Eyrolles

Autres directives SQL2

Eacutetudions enfin les autres options des jointures SQL2 (NATURAL JOIN USING et CROSSJOIN)

Consideacuterons le scheacutema suivant (des colonnes portent le mecircme nom) La colonne typeAvdans la table Navigant deacutesigne le type drsquoappareil sur lequel le pilote est instructeur

Opeacuterateur NATURAL JOIN

La jointure naturelle est programmeacutee par la clause NATURAL JOIN La clause de jointure estautomatiquement construite sur la base de toutes les colonnes portant le mecircme nom entre lesdeux tables

Les concepteurs devraient ainsi penser agrave nommer drsquoune maniegravere semblable cleacutes primaires etcleacutes eacutetrangegraveres Ce principe nrsquoest pas souvent appliqueacute aux bases volumineuses

Le tableau suivant deacutetaille deux eacutecritures possibles drsquoune jointure naturelle La clause de join-ture est baseacutee sur les colonnes (brevet typeAv) Une clause WHERE aurait pu aussi ecirctreprogammeacutee

Figure 4-20 Deux tables agrave mettre en jointure naturelle

Navigant

brevet nom nbHVol typeAv

PL-1 Pierre Lamothe 450 PL-2 Didier Linxe 900 A320 PL-3 Henri Alquieacute 3400 A380

VolsControle

brevet typeAv validite

PL-1 A320 2005-06-24 PL-2 A320 2006-04-04 PL-2 A330 2006-05-13 PL-3 A380 2007-07-20 PL-3 A320 2005-03-12

Tableau 4-47 Jointures naturelles

Besoin Jointures SQL2 et reacutesultat

Navigants qualifieacutes sur un type drsquoappareil et instructeurs sur ce mecircme type

SELECT brevet nom typeAv validite FROM Naviguant --eacutequivalent agraveSELECT brevet nom typeAv validite FROM VolsControle

NATURAL JOIN VolsControle

NATURAL JOIN Naviguant

4055_04_C04 Page 140 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 141

chapitre ndeg 4 Interrogation des donneacutees

Opeacuterateur USING

La directive USING(col1 col2hellip) de la clause JOIN programme une jointure naturelle res-treinte agrave un ensemble de colonnes Il ne faut pas utiliser drsquoalias de tables dans la liste descolonnes

Dans notre exemple on peut restreindre la jointure naturelle aux colonnes brevet outypeAv Si on les positionnait (brevet typeAv) dans la directive USING cela reviendraitagrave construire un NATURAL JOIN Le tableau suivant deacutetaille deux eacutecritures drsquoune jointurenaturelle restreinte

Opeacuterateur CROSS JOIN

La directive CROSS JOIN programme un produit carteacutesien qursquoon peut restreindre dans laclause WHERE

+--------+--------------+--------+------------+| brevet | nom | typeAv | validite |+--------+--------------+--------+------------+| PL-2 | Didier Linxe | A320 | 2006-04-04 || PL-3 | Henri Alquieacute | A380 | 2007-07-20 |+--------+--------------+--------+------------+

Tableau 4-47 Jointures naturelles (suite)

Besoin Jointures SQL2 et reacutesultat

Tableau 4-48 Jointures naturelles restreintes

Besoin Jointures SQL2 et reacutesultat

Nom des navigants avec leurs qualifications et dates de validiteacute

SELECT nom vtypeAv vvalidite FROM Naviguant

SELECT nom vtypeAv vvalidite FROM VolsControle v

+----------------+--------+------------+| nom | typeAv | validite |+----------------+--------+------------+| Pierre Lamothe | A320 | 2005-06-24 || Didier Linxe | A320 | 2006-04-04 || Didier Linxe | A330 | 2006-05-13 || Henri Alquieacute | A380 | 2007-07-20 || Henri Alquieacute | A320 | 2005-03-12 |+----------------+--------+------------+

WebJOIN VolsControle v USING(brevet)

JOIN Naviguant USING(brevet)

4055_04_C04 Page 141 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

142 copy Eacuteditions Eyrolles

Le tableau suivant preacutesente deux eacutecritures drsquoun produit carteacutesien (seul lrsquoordre drsquoaffichage descolonnes change)

Division

La division est un opeacuterateur algeacutebrique et non ensembliste Cet opeacuterateur est semblable sur leprincipe agrave lrsquoopeacuteration qursquoon apprend au CM2 (oublieacutee plus tard en terminale agrave cause descalculettes) La division est un opeacuterateur binaire comme la jointure car il srsquoagit de diviser unetable (ou partie de) par une autre table (ou partie de) Il est possible drsquoopeacuterer une division agravepartir drsquoune seule table en ce cas on divise deux parties de cette table (analogue aux autojoin-tures)

Lrsquoopeacuterateur de division nrsquoest pas fourni par MySQL (ni par aucun de ses concurrents drsquoailleurs)Il nrsquoexiste donc malheureusement pas drsquoinstruction DIVIDE

Est-ce la complexiteacute ou le manque drsquointeacuterecirct qui freinent les eacutediteurs de logiciels agrave programmerce concept La question reste en suspens alors si vous avez un avis agrave ce sujet faites-moi signe

Cet opeacuterateur permet de traduire le terme laquo pour tous les raquo des requecirctes qursquoon deacutesire pro-grammer en SQL

On peut aussi dire que lorsque vous voulez comparer un ensemble avec un groupe de reacutefeacute-rence il faut programmer une division

La division peut se programmer sous MySQL agrave lrsquoaide drsquoune diffeacuterence (NOT IN) et la fonctionNOT EXISTS

Tableau 4-49 Produit carteacutesien

Besoin Jointures SQL2 et reacutesultat

Combinaison de toutes les lignes des deux tables

SELECT FROM Naviguant -- eacutequivalent agraveSELECT FROM VolsControle

+--------+----------------+---------+--------+--------+--------+------------+| brevet | nom | nbHVol | typeAv | brevet | typeAv | validite |+--------+----------------+---------+--------+--------+--------+------------+| PL-1 | Pierre Lamothe | 45000 | NULL | PL-1 | A320 | 2005-06-24 || PL-2 | Didier Linxe | 90000 | A320 | PL-1 | A320 | 2005-06-24 || PL-3 | Henri Alquieacute | 340000 | A380 | PL-1 | A320 | 2005-06-24 || PL-1 | Pierre Lamothe | 45000 | NULL | PL-2 | A320 | 2006-04-04 |15 rows in set

WebCROSS JOIN VolsControle

CROSS JOIN Naviguant

4055_04_C04 Page 142 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 143

chapitre ndeg 4 Interrogation des donneacutees

La figure suivante illustre lrsquoopeacuterateur de division dans sa plus simple expression (je ne parlepas du contenu des tables bien sucircrhellip) Le scheacutema fait plus apparaicirctre le deuxiegraveme aspect reacuteveacute-lateur eacutenonceacute ci-avant agrave savoir comparer un ensemble (la table T1) avec un ensemble de reacutefeacute-rence (la table T2)

Deacutefinition

La division de la table T1[a1anb1bn] par la table T2[b1bn] (la structure de T2 estincluse dans la structure de T1) donne la table T3[a1an] qui contient les enregistrements tiveacuterifiant ti isin T3 (de structure [a1an]) tj isin T2 (tj de structure [b1bn]) et titj isin T1 (titj destructure [a1anb1bn])

Classification

Consideacuterons lrsquoexemple suivant pour deacutecrire la requecircte agrave construire Il srsquoagit de reacutepondre agrave laquestion laquo Quels sont les avions affreacuteteacutes par toutes les compagnies franccedilaises raquo Lrsquoensem-ble de reacutefeacuterence (A) est constitueacute des codes des compagnies franccedilaises Lrsquoensemble agrave compa-rer (B) est formeacute des codes des compagnies pour chaque avion

Deux cas sont agrave envisager suivant la maniegravere de comparer les deux ensembles

Division inexacte (le reste nrsquoest pas nul) un ensemble est seulement inclus dans un autre(A isin B) La question agrave programmer serait laquo Quels sont les avions affreacuteteacutes par toutes lescompagnies franccedilaises raquo sans preacuteciser si les avions ne doivent pas ecirctre aussi affreacuteteacutes pardes compagnies eacutetrangegraveres Lrsquoavion (A3 Mercure) reacutepondrait agrave cette question que laderniegravere ligne de la table Affretements soit preacutesente ou pas

Division exacte (le reste est nul) les deux ensembles sont eacutegaux (B=A) La question agraveprogrammer serait laquo Quels sont les avions affreacuteteacutes exactement (ou uniquement) partoutes les compagnies franccedilaises raquo Lrsquoavion (A3 Mercure) reacutepondrait agrave cette questionsi la derniegravere ligne de la table Affretements eacutetait inexistante Les lignes concerneacuteesdans les deux tables sont griseacutees

Figure 4-21 Division

T1

Jospin Juppeacute Juppeacute Baudis Baudis Baudis Chirac Chirac Chirac

T2

Quotient

Chirac

Quels sont les enregistrements de T1 qui sont associeacutes agrave laquo tous les raquo enregistrements de T2 Reacuteponse Chirac

Quotient=(T1ndashReste)T2(ici Reste nrsquoest pas nul)

4055_04_C04 Page 143 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

144 copy Eacuteditions Eyrolles

Lrsquoopeacuterateur de diffeacuterence (programmeacute avec NOT IN) combineacute agrave la fonction EXISTS permetde programmer ces deux comparaisons (un ensemble inclus dans un autre et une eacutegaliteacutedrsquoensembles) Il existe drsquoautres solutions agrave base de regroupements et de sous-interrogations(synchroniseacutees ou pas) que nous nrsquoeacutetudierons pas parce qursquoelles me semblent plus compli-queacutees Eacutecrivons agrave preacutesent ces deux divisions agrave lrsquoaide de requecirctes SQL

Division inexacte

Pour programmer le fait qursquoun ensemble est seulement inclus dans un autre (ici A sub B) il fautqursquoil nrsquoexiste pas drsquoeacuteleacutement dans lrsquoensemble A-B La diffeacuterence se programme agrave lrsquoaide delrsquoopeacuterateur NOT IN lrsquoinexistence drsquoeacuteleacutement se programme agrave lrsquoaide de la fonction NOTEXISTS comme le montre la requecircte suivante

Division exacte

Pour programmer le fait qursquoun ensemble est strictement eacutegal agrave un autre (ici A=B) il faut qursquoilnrsquoexiste ni drsquoeacuteleacutement dans lrsquoensemble A-B ni dans lrsquoensemble B-A La traduction matheacute-matique est la suivante A=BhArr(A-B=empty et B-A=empty) Les opeacuterateurs se programment de lamecircme maniegravere que pour la requecircte preacuteceacutedente Le laquo et raquo se programme avec un AND

Figure 4-22 Divisions agrave programmer

Web

Affretements

immat typeAv compa dateAff

A1 A320 SING 1965-05-13 A2 A340 AF 1968-06-22 A3 Mercure AF 1965-02-05A4 A330 ALIB 1965-01-16

A3 Mercure ALIB 1942-03-05 A3 Mercure SING 1987-03-01

Compagnie

comp nomComp pays

AF Air France FALIB Air Lib F SING Singapore AL SG

Reacutesultat

immat typeAv

A3 Mercure

SELECT DISTINCT immat typeAv FROM Affretements aliasAff

WHERE NOT EXISTS

(SELECT DISTINCT comp FROM Compagnie WHERE pays = F

AND comp NOT IN

(SELECT compa FROM Affr etements WHERE immat = aliasAffimmat ))

Ensemble A de reacutefeacuterence

Ensemble B agrave comparer

Parcours de tous les avions

4055_04_C04 Page 144 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 145

chapitre ndeg 4 Interrogation des donneacutees

Reacutesulats en HTML ou XML

Les options laquo --html raquo et laquo --xml raquo (eacutetudieacutees dans lrsquointroduction) permettent de formater lereacutesultat des extractions au standard du Web Cela peut ecirctre inteacuteressant si vous voulez rapide-ment publier des pages (qui seront statiques bien sucircr) ou composer des fichiers destineacutes agravelrsquoeacutechange de donneacutees provenant de votre base Ainsi la requecircte preacuteceacutedente fournira les eacutetats desortie suivants Concernant XML la balise de plus haut niveau contient un attribut deacutecrivantla requecircte

SELECT DISTINCT immat typeAv FROM Affregravetements aliasAff WHERE NOT EXISTS (SELECT comp FROM Compagnie WHERE pays = F AND comp NOT IN (SELECT compa FROM Affretements WHERE immat = aliasAffimmat )) AND NOT EXISTS (SELECT compa FROM Affretements WHERE immat = aliasAffimmat AND compa NOT IN (SELECT comp FROM Compagnie WHERE pays = F ))

A-B

Parcours de tous les avions

B-A

Tableau 4-50 Reacutesultats formateacutes pour le Web

Connexion avec --hmtl Connexion avec --xml

ltTABLE BORDER=1gtltTRgtltTHgtimmatltTHgtltTHgttypeAvltTHgtltTRgtltTRgtltTDgtA3ltTDgtltTDgtMercureltTDgtltTRgtltTABLEgt

ltresultset statement=SELECT DISTINCT immat typeAv FROM Affretements alia-sAff WHERE NOT EXISTS (SELECT comp FROM Compagnie WHERE pays = F AND comp NOT IN (SELECT compa FROM Affre-tements WHERE immat = alia-sAffimmat)) AND NOT EXISTS (SELECT compa FROM Affretements WHERE immat = aliasAffimmat AND compa NOT IN (SELECT comp FROM Compagnie WHERE pays = F))gt ltrowgt ltfield name=immatgtA3ltfieldgt ltfield name=typeAvgtMercureltfieldgt ltrowgtltresultsetgt

Web

4055_04_C04 Page 145 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

146 copy Eacuteditions Eyrolles

Eacutecriture dans un fichier

Meacutecanisme inverse agrave LOAD DATA INFILE eacutetudieacute au chapitre 2 lrsquoexportation de donneacutees (auformat de fichiers) extraites agrave lrsquoaide drsquoune requecircte peut ecirctre programmeacutee agrave lrsquoaide de la direc-tive INTO OUTFILE de lrsquoinstruction SELECT Une telle requecircte eacutecrit dans un fichier dans unreacutepertoire du serveur Le privilegravege FILE est requis Le fichier cible doit ecirctre inexistant avantdrsquoexeacutecuter son chargement La syntaxe simplifieacutee de cette directive est la suivante

SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes

FROM nomTable1 [nomTable2] [ WHERE condition ]

FIELDS deacutecrit comment seront formateacutees dans le fichier les colonnes extraites de(s)table(s) En lrsquoabsence de cette clause TERMINATED BY vaut t ENCLOSED BY vaut et ESCAPED BY vaut ndash FIELDS TERMINATED BY deacutecrit le caractegravere qui seacutepare deux valeurs de colonnesndash FIELDS ENCLOSED BY permet de controcircler le caractegravere qui encadrera chaque valeur

de colonnendash FIELDS ESCAPED BY permet de controcircler les caractegraveres speacuteciaux

LINES deacutecrit comment seront eacutecrites dans le fichier les lignes extraites de(s) table(s) Enlrsquoabsence de cette clause TERMINATED BY vaut n et STARTING BY vaut

Creacuteons le fichier laquo pilotestxt raquo situeacute dans le reacutepertoire laquo Ddev raquo en exportant la tota-liteacute des enregistrements de la table Pilote (SELECT ) deacutecrite au deacutebut du chapitre Lefichier est ensuite ouvert agrave lrsquoaide du WordPad Notez lrsquoutilisation du double laquo raquo pour deacutesi-gner une arborescence Windows Le caractegravere NULL est exporteacute par le caractegravere laquo N raquo

Figure 4-23 Creacuteation drsquoun fichier

INTO OUTFILE cheminEtNomFichier

[FIELDS [TERMINATED BY string]

[[OPTIONALLY] ENCLOSED BY char]

[ESCAPED BY char ] ]

[LINES [STARTING BY string]

[TERMINATED BY string] ]

SELECT INTO OUTFILE Ddevpilotestxt FIELDS TERMINATED BY ENCLOSED BY

FROM Pilote LINES STARTING BY import-Pilote TERMINATED BY $n

4055_04_C04 Page 146 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 147

chapitre ndeg 4 Interrogation des donneacutees

Exercices

Les objectifs de ces exercices sont

de creacuteer dynamiquement des tables et leurs donneacutees

drsquoeacutecrire des requecirctes monotables et multitables

de reacutealiser des modifications synchroniseacutees

de composer des jointures et des divisions

41 Creacuteation dynamique de tables

Eacutecrire le script creacuteaDynamiquesql permettant de creacuteer les tables Softs et PCSeuls suivan-tes (en utilisant la directive AS SELECT de la commande CREATE TABLE) Vous ne poserezaucune contrainte sur ces tables Penser agrave modifier le nom des colonnes

La table Softs sera construite sur la base de tous les enregistrements de la table Logiciel quevous avez creacuteeacutee et alimenteacutee preacuteceacutedemment La table PCSeuls doit seulement contenir les enregis-trements de la table Poste qui sont de type PCWS ou PCNT Veacuterifier

SELECT FROM Softs

SELECT FROM PCSeuls

42 Requecirctes monotables

Eacutecrire le script requecirctessql permettant drsquoextraire agrave lrsquoaide drsquoinstructions SELECT les donneacuteessuivantes

1 Type du poste p8

2 Noms des logiciels UNIX

3 Noms adresses IP numeacuteros de salle des postes de type UNIX ou PCWS

4 Mecircme requecircte pour les postes du segment 13012080 trieacutes par numeacuteros de salles deacutecroissants

5 Numeacuteros des logiciels installeacutes sur le poste p6

6 Numeacuteros des postes qui heacutebergent le logiciel log1

7 Noms et adresses IP complegravetes (ex 1301208001) des postes de type TX (utiliser la fonctionde concateacutenation)

Figure 4-24 Structures des nouvelles tables

SoftsnomSoft version prix

PCSeulsnP nomP seg ad typeP salle

4055_04_C04 Page 147 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

Partie I SQL de base

148 copy Eacuteditions Eyrolles

43 Fonctions et groupements

8 Pour chaque poste le nombre de logiciels installeacutes (en utilisant la table Installer)

9 Pour chaque salle le nombre de postes (agrave partir de la table Poste)

10 Pour chaque logiciel le nombre drsquoinstallations sur des postes diffeacuterents

11 Moyenne des prix des logiciels UNIX

12 Plus reacutecente date drsquoachat drsquoun logiciel

13 Numeacuteros des postes heacutebergeant 2 logiciels

14 Nombre de postes heacutebergeant 2 logiciels (utiliser la requecircte preacuteceacutedente en faisant un SELECTdans la clause FROM)

44 Requecirctes multitables

Opeacuterateurs ensemblistes

15 Types de postes non recenseacutes dans le parc informatique (utiliser la table Types)

16 Types existant agrave la fois comme types de postes et de logiciels

17 Types de postes de travail nrsquoeacutetant pas des types de logiciels

Jointures proceacutedurales

18 Adresses IP complegravetes des postes qui heacutebergent le logiciel log6

19 Adresses IP complegravetes des postes qui heacutebergent le logiciel de nom Oracle 8

20 Noms des segments posseacutedant exactement trois postes de travail de type TX

21 Noms des salles ou lrsquoon peut trouver au moins un poste heacutebergeant le logiciel Oracle 6

22 Nom du logiciel acheteacute le plus reacutecent (utiliser la requecircte 12)

Jointures relationnelles

Eacutecrire les requecirctes 18 19 20 21 avec des jointures de la forme relationnelle Numeacuteroter ces nouvellesrequecirctes de 23 agrave 26

27 Installations (nom segment nom salle adresse IP complegravete nom logiciel date drsquoinstallation) trieacuteespar segment salle et adresse IP

Jointures SQL2

Eacutecrire les requecirctes 18 19 20 21 avec des jointures SQL2 (JOIN NATURAL JOIN JOIN USING)Numeacuteroter ces nouvelles requecirctes de 28 agrave 31

4055_04_C04 Page 148 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 149

chapitre ndeg 4 Interrogation des donneacutees

45 Modifications synchroniseacutees

Eacutecrire le script modifSynchroniseacuteessql pour ajouter les lignes suivantes dans la tableInstaller

Eacutecrire les requecirctes UPDATE synchroniseacutees de la forme suivante

UPDATE table1 alias1

SET colonne = (

Pour mettre agrave jour automatiquement les colonnes rajouteacutees

bull nbSalle dans la table Segment (nombre de salles traverseacutees par le segment)

bull nbPoste dans la table Segment (nombre de postes du segment)

bull nbInstall dans la table Logiciel (nombre drsquoinstallations du logiciel)

bull nbLog dans la table Poste (nombre de logiciels installeacutes par poste)

Veacuterifier le contenu des tables modifieacutees (Segment Logiciel et Poste)

46 Opeacuterateurs existentiels

Rajouter au script requecirctessql les instructions SELECT pour extraire les donneacutees suivantes

Sous-interrogation synchroniseacutee

32 Noms des postes ayant au moins un logiciel commun au poste p6 (on doit trouver les postes p2p8 et p10)

Divisions

33 Noms des postes ayant les mecircmes logiciels que le poste p6 (les postes peuvent avoir plus de logi-ciels que p6) On doit trouver les postes p2 et p8 (division inexacte)

34 Noms des postes ayant exactement les mecircmes logiciels que le poste p2 (division exacte) on doittrouver p8

Figure 4-25 Lignes agrave ajouter

Installer nPoste nLog numIns dateIns delai

p2 log6 SYSDATE() NULL p8 log1 SYSDATE () NULL p10 log1

seacutequence

SYSDATE () NULL

SELECT COUNT()

FROM table2 alias2

WHERE alias2colonneA = alias1colonneB)

4055_04_C04 Page 149 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir

4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

151

Chapitre 5

Controcircle des donneacutees

Comme dans tout systegraveme multi-utilisateur lrsquousager drsquoun SGBD doit ecirctre identifieacute avant depouvoir utiliser des ressources Les accegraves aux informations et agrave la base de donneacutees doivent ecirctrecontrocircleacutes agrave des fins de seacutecuriteacute et de coheacuterence La figure suivante illustre un groupe drsquoutilisa-teurs dans lequel existe une classification entre ceux qui peuvent consulter mettre agrave joursupprimer des enregistrements voire les tables

Nous verrons dans cette section les aspects du langage SQL qui concernent le controcircle desdonneacutees et des accegraves Nous eacutetudierons

la gestion des utilisateurs qui manipuleront des bases de donneacutees dans lequelles se trouventdes objets tels que des tables index seacutequences (pour lrsquoinstant impleacutementeacutees par des colon-nes

AUTO_INCREMENT

) vues proceacutedures etc

la gestion des privilegraveges qui permettent de donner des droits sur la base de donneacutees (privi-legraveges systegraveme) et sur les donneacutees de la base (privilegraveges objet)

la gestion des vues

lrsquoutilisation du dictionnaire des donneacutees (base de donneacutees

information_schema

)

Le chapitre 9 deacutetaille lrsquooutil graphique

MySQL Administrator

qui permet de srsquoaffranchirdrsquoeacutecrire des instructions SQL

Figure 5-1

Conseacutequences de lrsquoaspect multi-utilisateur

Peut creacuteer des pilotes

Peut consulter les vols

Peut supprimer un vol

Peut deacutetruire la base MySQLTCP-IP

4055_05_C05 Page 151 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

152

copy Eacuteditions Eyrolles

Gestion des utilisateurs

Preacutesenteacute rapidement agrave lrsquointroduction nous verrons qursquoun utilisateur (

user

) est identifieacute parMySQL par son nom et celui de la machine agrave partir de laquelle il se connecte Cela fait ilpourra acceacuteder agrave diffeacuterents objets (tables vues seacutequences index proceacutedures etc) drsquoune oude plusieurs bases sous reacuteserve drsquoavoir reccedilu un certain nombre de privilegraveges

Classification

Les types drsquoutilisateurs leurs fonctions et leur nombre peuvent varier drsquoune base agrave une autreNeacuteanmoins pour chaque base de donneacutees en activiteacute on peut classifier les utilisateurs de lamaniegravere suivante

Le DBA (

DataBase

Administrator

) Il en existe au moins un Une petite base peut nrsquoavoirqursquoun seul administrateur Une base importante peut en regrouper plusieurs qui se parta-gent les tacircches suivantes

ndash installation et mises agrave jour de la base et des outils eacuteventuels

ndash gestion de lrsquoespace disque et des espaces pour les donneacutees

ndash gestion des utilisateurs et de leurs objets (srsquoils ne les gegraverent pas eux-mecircmes)

ndash optimisation des performances

ndash sauvegardes restaurations et archivages

ndash contact avec le support technique

Lrsquoadministrateur reacuteseau (qui peut ecirctre le DBA) se charge de la configuration des couchesclient pour les accegraves distants

Les deacuteveloppeurs qui conccediloivent et mettent agrave jour la base Ils peuvent aussi agir sur leursobjets (creacuteation et modification des tables index seacutequences etc) Ils transmettent auDBA leurs demandes speacutecifiques (stockage optimisation seacutecuriteacute)

Les administrateurs drsquoapplication qui gegraverent les donneacutees manipuleacutees par la ou les applica-tions Pour les petites et les moyennes bases le DBA joue ce rocircle

Les utilisateurs qui se connectent et interagissent avec la base agrave travers les applications ouagrave lrsquoaide drsquooutils (interrogations pour la geacuteneacuteration de rapports ajouts modifications ousuppressions drsquoenregistrements)

Tous seront des utilisateurs (au sens MySQL) avec des privilegraveges diffeacuterents

Creacuteation drsquoun utilisateur (

CREATE USER

)

Pour pouvoir creacuteer un utilisateur vous devez posseacuteder le privilegravege

CREATE

USER

ou

INSERT

sur la base systegraveme

mysql

(car crsquoest la table

mysqluser

qui stockera lrsquoexistence de cenouvel arrivant)

4055_05_C05 Page 152 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

153

chapitre ndeg 5 Controcircle des donneacutees

La syntaxe de creacuteation drsquoun utilisateur est la suivante

CREATE USER

utilisateur

[IDENTIFIED BY [PASSWORD]

motdePasse

]

[

utilisateur2

[IDENTIFIED BY [PASSWORD]

motdePasse2

] ]

IDENTIFIED BY

motdePasse

permet drsquoaffecter un mot de passe (16 caractegraveres maximumsensibles agrave la casse) agrave un utilisateur (16 caractegraveres maximum sensibles aussi agrave la casse)

Le tableau suivant deacutecrit la creacuteation drsquoun utilisateur (agrave exeacutecuter en eacutetant connecteacute en local entant que

root

)

Par deacutefaut les utilisateurs une fois creacuteeacutes nrsquoont aucun droit sur aucune base de donneacutees (agrave parten lecture eacutecriture sur la base

test

et en lecture seule sur la base

information_schema

)La section

Privilegraveges

eacutetudie ces droits

Un utilisateur bien connu

Lors de lrsquoinstallation vous avez ducirc noter la preacutesence de lrsquoutilisateur

root

(mot de passe saisiagrave lrsquoinstallation) Cet utilisateur est le DBA que MySQL vous offre Il vous permettra drsquoeffec-tuer vos tacircches administratives en ligne de commande ou par une console graphique (creacuteer desutilisateurs par exemple)

Liste des utilisateurs

Agrave propos de

root

on le retrouve dans la table

user

de la base

mysql

(

mysqluser

)Lrsquoextraction des colonnes

User

et

Host

restitue la liste des utilisateurs connus du serveur Si

root

nrsquoavait pas seacutelectionneacute la base

mysql

la commande agrave exeacutecuter aurait eacuteteacute laquo

SELECTUserHost FROM mysqluser

raquo

(rootlocalhost) [mysql] mysqlgt SELECT UserHost FROM user

+--------+-----------+

| User | Host |

+--------+-----------+

| | |

| | localhost |

| root | localhost |

| soutou | localhost |

+--------+-----------+

Tableau 5-1 Creacuteation drsquoun utilisateur

Instruction SQL Reacutesultat

CREATE USER

soutoulocalhost IDENTIFIED BY iut

soutou

est deacuteclareacute laquo utilisateur agrave accegraves local raquo il devra se connecter agrave lrsquoaide de son mot de passe

4055_05_C05 Page 153 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

154

copy Eacuteditions Eyrolles

Vous devez posseacuteder une table similaire Il apparaicirct quatre accegraves potentiels Lrsquoutilisateur vide

correspond agrave une connexion anonyme La machine deacutesigneacutee par laquo

raquo indique que laconnexion est autoriseacutee agrave partir de tout site (en supposant qursquoun client MySQL est installeacute etqursquoil est relieacute au serveur par TCP-IP) La machine deacutesigneacutee par laquo

localhost

raquo speacutecifie quela connexion est autoriseacutee en local

Ici la table fait eacutetat que lrsquoaccegraves anonyme (restreint toutefois agrave la base

test

voir la section

Table

mysqldb

) est permis en local et agrave partir de tout site et que

soutou

comme

root

nepeuvent se connecter qursquoen local

Modification drsquoun utilisateur

Le mot de passe drsquoun utilisateur peut ecirctre modifieacute sans parler de privilegraveges Nous verrons plustard qursquoil est possible de restreindre le nombre de requecirctes (

SELECT

) de modifications(

UPDATE

) de connexions par heure et de connexions simultaneacutees agrave un serveur

Puisqursquoil nrsquoexiste pas de commande

ALTER USER

pour changer un mot de passe il faut doncmodifier la table

user

par la seule commande SQL capable de le faire

UPDATE

Lrsquoinstruction suivante modifie le mot de passe de lrsquoutilisateur

soutou

pour lrsquoaccegraves en localNotez lrsquoutilisation de la fonction

PASSWORD()

qui code le mot de passe agrave affecter agrave lacolonne

Password

de la table

user

Il est plus prudent drsquoutiliser ensuite

FLUSH PRIVI-LEGES

qui recharge les tables systegraveme de maniegravere agrave rendre la manipulation effective surlrsquoinstant (un peu comme un

COMMIT

sur des donneacutees)

UPDATE

mysqluser

WHERE User = soutou

AND Host = localhost

FLUSH

PRIVILEGES

Une fois cette modification reacutealiseacutee si soutou tente une connexion avec son ancien mot depasse il vient lrsquoerreur classique laquo ERROR 1045 (28000) Access denied for usersoutoulocalhost (using password xx) raquo (xx valant YES si soutou seconnecte avec son ancien mot de passe NO srsquoil nrsquoen donne pas)

Chaque utilisateur peut changer son propre mot de passe agrave lrsquoaide de cette instruction srsquoil en ale privilegravege Mais attention Le fait de lui donner ce droit (nous verrons plus loin comment lefaire) implique eacutegalement qursquoil puisse aussi modifier les mots de passe de ses copains ainsique celui du root

Renommer un utilisateur (RENAME USER)

Pour pouvoir renommer un utilisateur vous devez posseacuteder le privilegravege CREATE USER (ou leprivilegravege UPDATE sur la base de donneacutees mysql) La syntaxe SQL est la suivante

RENAME USER utilisateur TO nouveauNom

SET Password = PASSWORD(eyrolles)

4055_05_C05 Page 154 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 155

chapitre ndeg 5 Controcircle des donneacutees

Penser agrave speacutecifier lrsquoaccegraves complet agrave renommer (usermachine) Les privilegraveges et le mot depasse ne changent pas Le tableau suivant deacutecrit trois opeacuterations de renommage drsquoutilisateurs(qui reviennent drsquoailleurs agrave lrsquoeacutetat initial)

Suppression drsquoun utilisateur (DROP USER)

Pour pouvoir supprimer un utilisateur vous devez posseacuteder le privilegravege CREATE USER (ou leprivilegravege DELETE sur la base de donneacutees mysql) La syntaxe SQL est la suivante

DROP USER utilisateur [utilisateur2 ]

Il faut speacutecifier lrsquoaccegraves agrave eacuteliminer (usermachine) Tous les privilegraveges relatifs agrave cet accegravessont deacutetruits Si lrsquoutilisateur est connecteacute dans le mecircme temps sa suppression ne sera effectiveqursquoagrave la fin de sa (derniegravere) session

Aucune donneacutee drsquoaucune table que lrsquoutilisateur aura mis agrave jour durant toutes ses connexionsne sera supprimeacutee Il nrsquoy a pas de notion drsquoappartenance drsquoobjets (tables index proceacutedureetc) agrave un utilisateur Tout ceci est relatif agrave la base de donneacutees (database)

Pour supprimer le compte soutou en local la commande agrave lancer est

DROP USER

Gestion des bases de donneacutees

Abordeacutee briegravevement agrave lrsquointroduction une base de donneacutees (database) regroupe essentielle-ment des tables sur lesquelles lrsquoadministrateur affectera des autorisations agrave des utilisateursCette notion de database srsquoapparente plutocirct agrave celle de scheacutema (connu des utilisateursdrsquoOracle) Drsquoailleurs dans lrsquoinstruction de creacuteation les deux mots peuvent ecirctre utiliseacutes

Tableau 5-2 Renommer un utilisateur

Instruction SQL Commentaire

RENAME USER localhost TO localhost

Lrsquoaccegraves soutou en local est renommeacute christiansoutou en local

RENAME USER christiansoutoulocalhost TO christiansoutou

Lrsquoaccegraves christiansoutou en local est renommeacute christiansoutou en accegraves distant

RENAME USER TO

Lrsquoaccegraves est renommeacute complegravetement

soutouchristiansoutou

1945322712

christiansoutou1945322712soutoulocalhost

soutoulocalhost

4055_05_C05 Page 155 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

156 copy Eacuteditions Eyrolles

Creacuteation drsquoune base (CREATE DATABASE)

Pour pouvoir creacuteer une base de donneacutees vous devez posseacuteder le privilegravege CREATE sur lanouvelle base (ou au niveau global pour creacuteer toute table)CREATE DATABASE | SCHEMA [IF NOT EXISTS] nomBase

[ [DEFAULT] CHARACTER SET nomJeu ]

[ [DEFAULT] COLLATE nomCollation ]

IF NOT EXISTS eacutevite une erreur dans le cas ougrave la base de donneacutees existe deacutejagrave (auquelcas elle ne sera pas remplaceacutee)

nomBase deacutesigne le nom de la base (64 caractegraveres maximum caractegraveres compris par lesystegraveme de gestion de fichier du systegraveme drsquoexploitation notamment respectant les regraveglesde nommage des reacutepertoires) Les caractegraveres laquo raquo laquo raquo ou laquo raquo sont proscrits

CHARACTER SET indique le jeu de caractegraveres associeacute aux donneacutees qui reacutesideront dans lestables de la base

COLLATE deacutefinit la collation1 du jeu de caractegraveres en question La collation dans le jargoninformatique permet de deacutefinir la position des caractegraveres dans le jeu Par exemple il serapossible de diffeacuterencier laquo agrave raquo de laquo a raquo ou pas (sensibiliteacute diacritique) Le but eacutetant desrsquoadapter aux diffeacuterentes regravegles et langues de notre petite planegravete

Une fois creacuteeacutee vous constaterez lrsquoexistence drsquoun reacutepertoire portant le nom de votre nouvellebase (par deacutefaut sous CProgram FilesMySQLMySQL Server 5ndatanouvel-leBase dans le cas de Windows) Ce reacutepertoire contiendra les donneacutees des tables qui serontconstitueacutees dans la nouvelle base Si vous concevez manuellement un reacutepertoire (mkdir rep1par exemple) dans le reacutepertoire de data de MySQL rep1 sera consideacutereacute comme une base dedonneacutees avec le jeu de caractegraveres par deacutefaut (visible avec laquo SHOW DATABASES raquo)

Nrsquoeffacez pas le fichier dbopt qui stocke les caracteacuteristiques de la base Vous pouvezlrsquoouvrir avec un eacutediteur de texte pour connaicirctre le jeu de caractegraveres par deacutefaut que MySQLaffectera agrave vos bases en lrsquoabsence de clause CHARACTER SET Souhaitons que ce ne soit pasgb2312 associeacute par deacutefaut agrave la collation gb2312_chinese_ci qui vous ferait dire que jevous parle chinois Crsquoest pourtant quelquefois ce que je ressens quand mes eacutetudiants meregardent avec des yeux de poisson en utilisant le langage des carpeshellip

Le tableau suivant deacutecrit la creacuteation de deux bases de donneacutees

1 Action de comparer entre eux des textes des documents Petit Larousse

Tableau 5-3 Creacuteation de bases

Instruction SQL Reacutesultat

CREATE DATABASE bdnouvelle DEFAULT CHARACTER SET ascii COLLATE ascii_general_ci

La base bdnouvelle est creacuteeacutee le jeu de caractegraveres par deacutefaut est ASCII

CREATE DATABASE bdnouvelle2 DEFAULT CHARACTER SET gb2312

La base bdnouvelle2 est creacuteeacutee pour les Chinois

4055_05_C05 Page 156 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 157

chapitre ndeg 5 Controcircle des donneacutees

Le jeu de caractegraveres par deacutefaut est deacutefini dans myini agrave lrsquoaide de la variable default-character-set Il est donc possible de creacuteer des bases de donneacutees associeacutees agrave diffeacuterentsjeux de caractegraveres au sein drsquoun mecircme serveur Le jeu de caractegraveres drsquoune base deacutefinit celui destables qui seront constitueacutees dedans agrave moins que la table ne soit combineacutee agrave un autre jeu (creacuteeacuteavec la directive [DEFAULT] CHARACTER SET jeu [COLLATE nomCollation])

Notons enfin qursquoil est mecircme possible drsquoaffecter un jeu de caractegraveres agrave une colonne drsquounetable Lrsquoexemple suivant construit la table testChap5 dans la base bdnouvelle2 (pardeacutefaut chinoise) en speacutecifiant que la colonne col1 sera associeacutee au jeu cp850 DOS WestEuropean tandis que le reste de la table (pour lrsquoinstant de porteacutee col2) sera appliqueacute au jeulatin1 cp1252 West European Inseacuterons une ligne

CREATE TABLE bdnouvelle2testChap5

( col2 CHAR(4))

CHARACTER SET latin1

INSERT INTO bdnouvelle2testChap5 VALUES (GTRIUT)

Seacutelection drsquoune base de donneacutees (USE)

Ceux qui ont travailleacute sous Dbase se souviennent de lrsquoinstruction USE qui deacutesignait la tablecourante dans un programme Pour MySQL USE seacutelectionne une base de donneacutees qui devientactive dans une session

USE nomBase

Si vous deacutesirez travailler simultaneacutement dans diffeacuterentes bases de donneacutees faites toujourspreacutefixer le nom des tables par celui de la base par la notation pointeacutee (nomBasenomTable)

Lrsquoexemple suivant exeacutecute une jointure sur deux tables situeacutees dans deux bases distinctes

col CHAR(5) CHARACTER SET cp850

Tableau 5-4 Seacutelection de bases

Instruction SQL Reacutesultat

CREATE TABLE bdnouvelletestUSE (col3 CHAR(5) col4 CHAR(4)) CHARACTER SET latin1INSERT INTO bdnouvelletestUSE VALUES (ACTMPIUT)

Creacuteation drsquoune table dans la base

Insertion drsquoune ligne

USE bdnouvelle2 Seacutelection de la base bdnouvelle2

SELECT col col3 FROM testChap5 WHERE col2 = col4+------+-------+| col | col3 |+------+-------+| GTR | ACTMP |+------+-------+

Jointure de la table testChap5 situeacutee dans la base active (bdnouvelle2) avec testUSE situeacutee dans la base bdnouvelle

bdnouvelletestUSEbdnouvelletestUSEbdnouvelletestUSE

4055_05_C05 Page 157 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

158 copy Eacuteditions Eyrolles

Modification drsquoune base (ALTER DATABASE)

ALTER DATABASE vous permet de modifier le jeu de caractegraveres par deacutefaut drsquoune base dedonneacutees Pour pouvoir changer ainsi une base vous devez avoir le privilegravege ALTER sur la basede donneacutees en question

ALTER DATABASE nomBase

[ [DEFAULT] CHARACTER SET nomJeu ]

[ [DEFAULT] COLLATE nomCollation ]

Lrsquoinstruction suivante modifie la base laquo chinoise raquo en lui affectant le jeu de caractegraveres de typeDOS

ALTER DATABASE bdnouvelle2

Suppression drsquoune base (DROP DATABASE)

Pour pouvoir supprimer une base de donneacutees vous devez posseacuteder le privilegravege DROP sur labase (ou au niveau global pour effacer toute base) Cette commande deacutetruit tous les objets(tables index etc) et le reacutepertoire contenus dans la base

DROP DATABASE | SCHEMA [IF EXISTS] nomBase

IF EXISTS eacutevite une erreur dans le cas ougrave la base de donneacutees nrsquoexisterait pas

Cette instruction retourne le nombre de tables qui on eacuteteacute supprimeacutees (fichiers agrave lrsquoextensionlaquo frm raquo)

Disons agrave preacutesent adios agrave la base laquo chinoise raquo

DROP DATABASE bdnouvelle2

Privilegraveges

Depuis le deacutebut du livre nous avons parleacute de privilegraveges Il est temps agrave preacutesent de preacuteciser ceque recouvre ce terme Un privilegravege (sous-entendu utilisateur) est un droit drsquoexeacutecuter unecertaine instruction SQL (on parle de privilegravege systegraveme) ou un droit relatif aux donneacutees destables situeacutees dans diffeacuterentes bases (on parle de privilegravege objet) La connexion par exemplesera consideacutereacutee comme un privilegravege systegraveme bien que nrsquoeacutetant pas une commande SQL

Les privilegraveges systegraveme diffegraverent sensiblement drsquoun SGBD agrave un autre Chez Oracle il y en aplus drsquoune centaine MySQL est plus modeste en nrsquoen proposant qursquoune vingtaine En revan-che on retrouvera les mecircmes privilegraveges objet (exemple autorisation de modifier la colonnenomComp de la table Compagnie) qui sont attribueacutes ou retireacutes par les instructions GRANT etREVOKE

DEFAULT CHARACTER SET cp850

4055_05_C05 Page 158 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 159

chapitre ndeg 5 Controcircle des donneacutees

Niveaux de privilegraveges

La figure suivante illustre les diffeacuterents niveaux de privilegraveges que lrsquoon peut rencontrer

Global level privilegraveges srsquoappliquant agrave toutes les bases du serveur Ces privilegraveges sontstockeacutes dans la table mysqluser (exemple drsquoattribution drsquoun privilegravege global GRANTCREATE hellip)

Database level privilegraveges srsquoappliquant agrave tous les objets drsquoune base de donneacutees en particu-lier Ces privilegraveges sont stockeacutes dans les tables mysqldb et mysqlhost (exempledrsquoattribution drsquoun privilegravege database GRANT SELECT hellip)

Table level privilegraveges srsquoappliquant agrave la globaliteacute drsquoune table drsquoune base de donneacutees enparticulier Ces privilegraveges sont stockeacutes dans la table mysqltables_priv (exempledrsquoattribution drsquoun privilegravege table GRANT INSERT hellip)

Column level privilegraveges srsquoappliquant agrave une des colonnes drsquoune table drsquoune base dedonneacutees en particulier Ces privilegraveges sont stockeacutes dans la table mysqlcolumns_priv(exemple drsquoattribution drsquoun privilegravege column GRANT UPDATE( )ON

hellip)

Routine level privilegraveges globaux ou au niveau drsquoune base (CREATE ROUTINE ALTERROUTINE EXECUTE et GRANT) srsquoappliquant aux proceacutedures catalogueacutees (eacutetudieacutees auchapitre 7) Ces privilegraveges sont stockeacutes dans la table mysqlprocs_priv de la basemysql (exemple drsquoattribution drsquoun privilegravege routine GRANT EXECUTE ON

hellip)

Tables de la base mysqlCinq tables de la base de donneacutees mysql suffisent agrave MySQL pour stocker les privilegraveges(systegraveme et objet) de tous les utilisateurs La figure suivante illustre comment MySQL deacuteduittoutes ces preacuterogatives toujours en fonction des accegraves (couple utilisateur machine)

Figure 5-2 Niveaux de privilegraveges

Jules Paul

mysql test

information_schema

bdjules bdpaul

Routine level

Global level

Database level

Table level

Column level

ON

ON bdpaul

ON bdpaulAvion

nomCompbdpaulCompagnie

PROCEDUREbdpaulsp1

4055_05_C05 Page 159 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

160 copy Eacuteditions Eyrolles

La colonne Db est en plus dans les tables host tables_priv et columns_priv car elle estneacutecessaire pour deacutesigner la base de donneacutees sur laquelle portera le droit ou la famille de droits

Supposons pour nos exemples que lrsquoutilisateur Paul (accegraves en local) et la base de donneacuteesbdpaul soient creacuteeacutes

CREATE DATABASE bdpaul

CREATE USER Paullocalhost IDENTIFIED BY iut

Table mysqluserPreacutesenteacute briegravevement au deacutebut du chapitre Cette table est composeacutee de 37 colonnes qui deacutecriventles privilegraveges au niveau global du serveur Nous deacutetaillons ici la signification des principales

Privilegraveges objet (LMD) sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives de Paul (et des autres) Pour lrsquoinstant le caractegravereN eacutetant dans toutes les colonnes il ne peut ni interroger une table (Select_priv) ni inseacute-rer dans une table (Insert_priv) ni en modifier (Update_priv) ni en supprimer(Delete_priv) et ce quelle que soit la base de donneacutees (excepteacute les bases systegraveme test etinformation_schema) sur laquelle il voudra se connecterSELECT Host User FROM mysqluser+-----------+------+-------------+-------------+-------------+-------------+| Host | User | Select_priv | Insert_priv | Update_priv | Delete_priv |+-----------+------+-------------+-------------+-------------+-------------+| localhost | root | Y | Y | Y | Y || localhost | | Y | Y | Y | Y || | | N | N | N | N || |+-----------+------+-------------+-------------+-------------+-------------+

Figure 5-3 Stockage des preacuterogatives

Table user db host tables_priv columns_priv procs_priv+----------- +------+------------- +-------- +-------- +------------- +------

| Host | User | hellip | droit1 | droit2 | familledroit1 | hellip

+----------- +------+----------- --+-------- +-------- +---------- -----+----

| localhost | root | | Y | Y | Y | hellip

| hellip | | | | | |

| hellip | | | | | |

| localhost | Paul | | N | Y | N | hellip

+----------- +------+------------- +-------- +-------- +------------ ---+----

Paul possegravede le privilegravege droit2sur une base table objet Paul

root possegravede tous les privilegraveges sur une base table objet

root

Select_priv Insert_priv Update_priv Delete_priv

localhost | Paul | N | N | N | N

4055_05_C05 Page 160 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 161

chapitre ndeg 5 Controcircle des donneacutees

Vous pouvez par analogie pour cet exemple et pour les suivants deacutecouvrir les preacuterogativesdes autres accegraves (ici root et anonyme)

Privilegraveges objet (LDD) sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des instructions LDD Pour lrsquoinstant lecaractegravere N eacutetant dans toutes les colonnes Paul ne peut ni creacuteer une table ou une base(Create_priv) ni en supprimer (Drop_priv) ni creacuteer ou supprimer un index (Index_priv) ni modifier la structure drsquoune table la renommer ou modifier une base (Alter_priv) et ce quelle que soit la base de donneacutees (excepteacute les bases systegraveme test etinformation_schema)

SELECT Host User FROM mysqluser+-----------+------+-------------+-----------+------------+------------+| Host | User | Create_priv | Drop_priv | Index_priv | Alter_priv |+-----------+------+-------------+-----------+------------+------------+| localhost | root | Y | Y | Y | Y || localhost | | Y | Y | Y | Y || | | N | N | N | N || |+-----------+------+-------------+-----------+------------+------------+

Privilegraveges systegraveme (LCD) sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des instructions LCD Pour lrsquoinstant lecaractegravere N eacutetant dans toutes les colonnes Paul ne peut ni creacuteer un utilisateur (Create_user_priv) ni transmettre des droits qursquoil aura lui-mecircme reccedilus (Grant_priv) ni lister lesbases de donneacutees existantes (Show_db_priv) et ce quelle que soit la base de donneacutees

SELECT HostUser FROM mysqluser+-----------+------+------------------+------------+--------------+| Host | User | Create_user_priv | Grant_priv | Show_db_priv |+-----------+------+------------------+------------+--------------+| localhost | root | Y | Y | Y || localhost | | N | Y | Y || | | N | N | N || |+-----------+------+------------------+------------+--------------+

Privilegraveges agrave propos des vues sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des instructions relatives aux vues (viewsdeacutetailleacutees dans la section suivante) Pour lrsquoinstant le caractegravere N eacutetant dans toutes lescolonnes Paul ne peut ni creacuteer une vue (Create_view_priv) ni lister les vues existantes(Show_view_priv) et ce quelle que soit la base de donneacutees

Create_priv Drop_privIndex_priv Alter_priv

localhost | Paul | N | N | N | N

Create_user_priv Grant_priv Show_db_priv

localhost | Paul | N | N | N

4055_05_C05 Page 161 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

162 copy Eacuteditions Eyrolles

SELECT HostUser FROM mysqluser

+-----------+------+------------------+----------------+

| Host | User | Create_view_priv | Show_view_priv |

+-----------+------+------------------+----------------+

| localhost | root | Y | Y |

| localhost | | N | N |

| | | N | N |

| localhost | Paul | N | N |

+-----------+------+------------------+----------------+

Privilegraveges agrave propos des proceacutedures catalogueacutees sur toutes les bases de donneacutees

La requecircte suivante extrait les preacuterogatives agrave propos des proceacutedures catalogueacutees (deacutetailleacuteesdans le chapitre 7) Pour lrsquoinstant le caractegravere N eacutetant dans toutes les colonnes Paul nepeut ni creacuteer une proceacutedure (Create_routine_priv) ni en modifier (Alter_routine_priv) ni en exeacutecuter (Execute_priv) et ce quelle que soit la base de donneacuteesSELECT HostUser FROM mysqluser+-----------+------+---------------------+--------------------+--------------+| Host | User | Create_routine_priv | Alter_routine_priv | Execute_priv |+-----------+------+---------------------+--------------------+--------------+| localhost | root | Y | Y | Y || localhost | | N | N | Y || | | N | N | N || localhost | Paul | N | N | N |+-----------+------+---------------------+--------------------+--------------+

Privilegraveges agrave propos des restrictions drsquoutilisateur

La requecircte suivante extrait les preacuterogatives agrave propos des restrictions qursquoon peut deacutefinir paraccegraves Pour lrsquoinstant le chiffre eacutetant agrave 0 dans toutes les colonnes aucun accegraves (utilisateur)nrsquoest limiteacute concernant le nombre de requecirctes (max_questions) de modifications (max_updates) de connexions par heure (max_connections) et de connexions simultaneacutees(max_user_connections) agrave un serveur

SELECT Host User Requetes Modifs

Connexions Cx simult FROM mysqluser+-----------+------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+------+----------+--------+------------+------------+| localhost | root | 0 | 0 | 0 | 0 || localhost | | 0 | 0 | 0 | 0 || | | 0 | 0 | 0 | 0 || localhost | Paul | 0 | 0 | 0 | 0 |+-----------+------+----------+--------+------------+------------+

Create_view_priv Show_view_priv

Create_routine_priv Alter_routine_priv Execute_priv

max_questions max_updates

max_connections max_user_connections

4055_05_C05 Page 162 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 163

chapitre ndeg 5 Controcircle des donneacutees

Privilegraveges non abordeacutes

Drsquoautres colonnes de la table mysqluser sont inteacuteressantes mais sortent un peu du cadrede ce livre Jrsquoai donc fait lrsquoimpasse sur Create_tmp_table_priv (sert agrave creacuteer des tablestemporaires) Lock_tables_priv (pose des verrous explicites) Shutdown_priv (arrecircteet redeacutemarre le serveur) Process_priv et Super_priv (gegraverent les processus) File_priv (accegravede aux fichiers du systegraveme drsquoexploitation) Repl_slave_priv et Repl_client_priv (utiliseacutes pour des aspects de reacuteplication de donneacutees)

Nul doute que vous saurez vous servir de ces privilegraveges en temps voulu par analogie avecceux que nous allons eacutetudier

Le privilegravege References_priv nrsquoest pas opeacuterationnel encore Il permettrait de beacuteneacuteficier delrsquointeacutegriteacute reacutefeacuterentielle entre deux tables appartenant agrave deux bases distinctes (par exemple latable Avion dans bd1 ferait reacutefeacuterence par cleacute eacutetrangegravere agrave la table Compagnie dans bd2)

Avant de preacutesenter les autres tables (db host tables_priv columns_priv et procs_priv) de la base mysql eacutetudions les intructions relatives agrave lrsquoattribution drsquoun privilegravege(GRANT) qursquoil soit systegraveme ou objet et celles relatives agrave la reacutevocation drsquoun privilegravege (REVOKE)

Attribution de privilegraveges (GRANT)

La figure suivante illustre le contexte qui va servir drsquoexemple agrave lrsquoattibution de preacuterogatives

Syntaxe

Lrsquoinstruction GRANT permet drsquoattribuer un (ou plusieurs) privilegravege(s) agrave propos drsquoun objet agrave un(ou plusieurs) beacuteneacuteficiaire(s) Lrsquoutilisateur qui exeacutecute cette commande doit avoir reccedilu lui-mecircme le droit de transmettre ces privilegraveges (reccedilu avec la directive GRANT OPTION) Dans lecas de root aucun problegraveme car il a implicitement tous les droits

Figure 5-4 Attribution de privilegraveges

mysql test

information_schema

bdjules bdpaul

sp1() sp2()

PaulJules

Livre

CREATE

Restrictions de connexion SELECT(titre) INSERT - UPDATE(ISBN)

DELETE - SELECTCREATEDROP

Execute sp1() sp2() Modif sp1()

4055_05_C05 Page 163 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

164 copy Eacuteditions Eyrolles

GRANT privilegravege [ (col1 [ col2])] [privilegravege2 ]

ON [ TABLE | FUNCTION | PROCEDURE ]

nomTable | | | nomBase

TO utilisateur [IDENTIFIED BY [PASSWORD] password]

[utilisateur2 ]

[ WITH [ GRANT OPTION ]

[ MAX_QUERIES_PER_HOUR nb ]

[ MAX_UPDATES_PER_HOUR nb2 ]

[ MAX_CONNECTIONS_PER_HOUR nb3 ]

[ MAX_USER_CONNECTIONS nb4 ] ]

privilegravege description du privilegravege (ex SELECT DELETE etc) voir le tableau suivant

col preacutecise la ou les colonnes sur lesquelles se portent les privilegraveges SELECT INSERT ouUPDATE (exemple UPDATE(typeAvion) pour nrsquoautoriser que la modification de lacolonne typeAvion)

GRANT OPTION permet de donner le droit de retransmettre les privilegraveges reccedilus agrave unetierce personne

Le tableau suivant reacutesume la signification des principaux privilegraveges agrave accorder ou agrave reacutevoquer

Tableau 5-5 Privilegraveges principaux pour GRANT et REVOKE

privilege Commentaire

ALL [PRIVILEGES] Tous les privilegraveges

ALTER Modification de basetable

ALTER ROUTINE Modification de proceacutedure

CREATE Creacuteation de basetable

CREATE ROUTINE Creacuteation de proceacutedure

CREATE USER Creacuteation drsquoutilisateur

CREATE VIEW Creacuteation de vue

DELETE Suppression de donneacutees de table

DROP Suppression de basetable

EXECUTE Exeacutecution de proceacutedure

INDEX CreacuteationSuppression drsquoindex

INSERT Insertion de donneacutees de table

SELECT Extraction de donneacutees de table

SHOW DATABASES Lister les bases

SHOW VIEW Lister les vues drsquoune base

SUPER Gestion des deacuteclencheurs

UPDATE Modification de donneacutees de table

USAGE Synonyme de laquo sans privilegravege raquo USAGE est utiliseacute pour conserver les privilegraveges preacuteceacutedemment deacutefinis tout en les restreignant avec des options

4055_05_C05 Page 164 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 165

chapitre ndeg 5 Controcircle des donneacutees

Exemples

Le tableau suivant deacutecrit lrsquoaffectation de quelques privilegraveges en donnant les explications asso-cieacutees

Tout ce que vous avez le droit de faire doit ecirctre explicitement autoriseacute par la commande GRANTCe qui nrsquoest pas dit par GRANT nrsquoest pas permis Par exemple Jules peut creacuteer des bases maispas en deacutetuire Paul peut modifier le numeacutero ISBN drsquoun livre mais pas son titre etc

Voir les privilegraveges

La commande SHOW GRANTS FOR liste les diffeacuterentes instructions GRANT eacutequivalentes agrave toutesles preacuterogatives drsquoun utilisateur donneacute Crsquoest bien utile quand vous avez attribueacute un certain nombrede privilegraveges agrave un utilisateur sans avoir penseacute agrave les consigner dans un fichier de commande

SHOW GRANTS FOR utilisateur

Tableau 5-6 Affectation de privilegraveges

Instruction faite par root Explication

GRANT CREATE DROP ON TO

Privilegravege systegraveme database level

Paul (en accegraves local) peut creacuteer ousupprimer des tables dans la base bdpaul

GRANT INSERT SELECT DELETE UPDATE(ISBN) ON TO

Privilegravege objet table level

Paul peut inseacuterer extraire supprimer etmodifier la colonne ISBN de la table Livrecontenue dans la base bdpaul

GRANT ALTER ON TO

Privilegravege systegraveme table level

Paul peut modifier la structure ou lescontraintes de la table Livre contenuedans la base bdpaul

GRANT SELECT(titre) ON TO WITH GRANT OPTION

Privilegravege objet column level

Jules peut extraire seulement la colonnetitre de la table Livre contenue dans labase bdpaul Il pourra par la suiteretransmettre eacuteventuellement ce droit

GRANT CREATE ON TO

Privilegravege systegraveme global level

Jules peut creacuteer des bases de donneacutees

GRANT USAGE ON TO WITH MAX_QUERIES_PER_HOUR 50 MAX_UPDATES_PER_HOUR 20 MAX_CONNECTIONS_PER_HOUR 6 MAX_USER_CONNECTIONS 3

Privilegravege systegraveme database level

Jules ne peut lancer chaque heure que50 SELECT 20 UPDATE se connecter 6 fois(dont 3 connexions simultaneacutees) sur la basede donneacutees bdpaul

bdpaulPaullocalhost

bdpaulLivrePaullocalhost

bdpaulLivrePaullocalhost

bdpaulLivreJuleslocalhost

Juleslocalhost

bdpaulJuleslocalhost

4055_05_C05 Page 165 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

166 copy Eacuteditions Eyrolles

Utilisons cette commande pour extraire les profils de Jules de Paul et de lrsquoadministrateuren chef (accegraves en local) Jrsquoavoue avoir un peu retravailleacute lrsquoeacutetat de sortie (sans en modifier uneligne quand mecircme)

SHOW GRANTS FOR Juleslocalhost+---------------------------------------------------------------------------+| Grants for Juleslocalhost |+---------------------------------------------------------------------------+| GRANT CREATE ON TO Juleslocalhost IDENTIFIED BY PASSWORD 6AE163FB9EE8BB011EB2E87316AA5BE563A6CDB7 WITH MAX_QUERIES_PER_HOUR 50 MAX_UPDATES_PER_HOUR 20 MAX_CONNECTIONS_PER_HOUR 6 MAX_USER_CONNECTIONS 3 || GRANT SELECT (titre) ON `bdpaul``Livre` TO Juleslocalhost WITH GRANT OPTION |+---------------------------------------------------------------------------+

On remarque que MySQL a regroupeacute deux privilegraveges en une instruction GRANT (CREATE etles restrictions de connexions) Par lagrave mecircme on se rend compte que les preacuterogatives deconnexion sont au niveau global bien qursquoon les ait speacutecifieacutees au niveau database

SHOW GRANTS FOR Paullocalhost+---------------------------------------------------------------------------+| Grants for Paullocalhost |+---------------------------------------------------------------------------+| GRANT USAGE ON TO Paullocalhost IDENTIFIED BY PASSWORD 6AE163FB9EE8BB011EB2E87316AA5BE563A6CDB7 || GRANT CREATE DROP ON `bdpaul` TO Paullocalhost || GRANT SELECT INSERT UPDATE (ISBN) DELETE ALTER ON `bdpaul``Livre` TO Paullocalhost |+---------------------------------------------------------------------------+

On remarque que MySQL a regroupeacute tous les privilegraveges sur la table Livre en une instructionGRANT La premiegravere exprime le fait que Paul peut se connecter agrave toutes les bases (par USEnomBase) mais qursquoil ne pourra travailler en reacutealiteacute que dans bdpaul

SHOW GRANTS FOR rootlocalhost+---------------------------------------------------------------------------+| Grants for rootlocalhost |+---------------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON TO rootlocalhost IDENTIFIED BY PASSWORD 387E25FE2CF7ED941E43A76AD9402825401698FC WITH GRANT OPTION |+---------------------------------------------------------------------------+

On remarque que MySQL nrsquoattribue qursquoun seul droit mais le plus fort Tous les droits (ALLPRIVILEGES) sur toutes les bases () avec en prime la clause GRANT OPTION quipermet de retransmettre nrsquoimporte quoi agrave nrsquoimporte qui ou de tout reacutevoquer

Interrogeons agrave nouveau la table user de la base mysql stockant les preacuterogatives au niveauglobal du moment Le droit de creacuteation en local de Jules apparaicirct sur toutes les bases

4055_05_C05 Page 166 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 167

chapitre ndeg 5 Controcircle des donneacutees

SELECT HostUser Create_privDrop_privIndex_privAlter_priv FROM mysqluser+-----------+-------+-------------+-----------+------------+------------+| Host | User | Create_priv | Drop_priv | Index_priv | Alter_priv |+-----------+-------+-------------+-----------+------------+------------+| hellip| localhost | Paul | N | N | N | N || | N | N | N |+-----------+-------+-------------+-----------+------------+------------+

Les colonnes suivantes permettent de stocker les restrictions sur les connexions

SELECT HostUser max_questions Requetes max_updates Modifs max_connections Connexions max_user_connections Cx simult FROM mysqluser+-----------+-------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+-------+----------+--------+------------+------------+| hellip| localhost | Paul | 0 | 0 | 0 | 0 || |+-----------+-------+----------+--------+------------+------------+

Analysons les autres tables de la base mysql pour deacutecouvrir les preacuterogatives des autresniveaux (database table column et routine)

Table mysqldbLa table mysqldb deacutecrit les preacuterogatives au niveau database Ainsi la colonne Db indique labase de donneacutees

SELECT Host User Db Create_priv Drop_priv Alter_priv FROM mysqldb+-----------+------+---------+-------------+-----------+------------+| Host | User | Db | Create_priv | Drop_priv | Alter_priv |+-----------+------+---------+-------------+-----------+------------+| | | test_ | Y | Y | Y || | | test | Y | Y | Y || |+-----------+------+---------+-------------+-----------+------------+

Notez la possibiliteacute de Paul avec lrsquoaccegraves local de creacuteeacuter et de supprimer des tables dans labase bdpaul Notez eacutegalement la possibiliteacute de creacuteer de supprimer de modifier des tablespar un accegraves distant anonyme sur la base test

Table mysqlhostCette table est eacutetudieacutee agrave la section Accegraves distants

localhost | Jules | Y

localhost | Jules | 50 | 20 | 6 | 3

localhost | Paul | bdpaul | Y | Y | N

4055_05_C05 Page 167 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

168 copy Eacuteditions Eyrolles

Table mysqltables_privLa table mysqltables_priv deacutecrit les preacuterogatives objet au niveau table Ainsi lacolonne Table_name indique la table concerneacutee la colonne Grantor preacutecise lrsquoutilisateurayant donneacute le droit La colonne Table_priv est un SET contenant la liste des droits delrsquoutilisateur sur la table

SELECT CONCAT(UserHost) Compte CONCAT(DbTable_name) Objet Grantor Table_priv FROM mysqltables_priv+-----------------+--------------+----------------+---------------------------+| Compte | Objet | Grantor | Table_priv |+-----------------+--------------+----------------+---------------------------+| Juleslocalhost | bdpaulLivre | rootlocalhost | Grant || Paullocalhost | bdpaulLivre | rootlocalhost | SelectInsertDeleteAlter|+-----------------+--------------+----------------+---------------------------+

On retrouve les quatre privilegraveges de Paul et celui de Jules (GRANT OPTION de SELECTsur la table)

Cette table possegravede aussi une colonne de nom Timestamp stockant lrsquoinstant au cours duquelsrsquoest deacuterouleacutee lrsquoattribution (ou la reacutevocation)

Table mysqlcolumns_privLa table mysqlcolumns_priv deacutecrit les preacuterogatives objet au niveau column Ainsi lacolonne Table_name indique la table concerneacutee la colonne Column_name preacutecise lacolonne concerneacutee par le droit La colonne Column_priv est un SET contenant la liste desdroits de lrsquoutilisateur sur la colonne de la table

SELECT CONCAT(UserHost) Compte CONCAT(DbTable_name) Objet Column_name Column_priv FROM mysqlcolumns_priv+-----------------+--------------+-------------+-------------+| Compte | Objet | Column_name | Column_priv |+-----------------+--------------+-------------+-------------+| Juleslocalhost | bdpaulLivre | titre | Select || Paullocalhost | bdpaulLivre | ISBN | Update |+-----------------+--------------+-------------+-------------+

On retrouve le privilegravege de Paul et celui de Jules (portant ici sur la mecircme table)

Table mysqlprocs_privLa table mysqlprocs_priv deacutecrit les preacuterogatives des proceacutedures et des fonctionscatalogueacutees au niveau routine

4055_05_C05 Page 168 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 169

chapitre ndeg 5 Controcircle des donneacutees

Les privilegraveges CREATE ROUTINE ALTER ROUTINE EXECUTE et GRANT srsquoappliquent surles sous-programmes catalogueacutes et peuvent ecirctre attribueacutes au niveau global et database ALTERROUTINE EXECUTE et GRANT peuvent ecirctre assigneacutes aussi au niveau routine

En supposant que la base bdpaul contient la proceacutedure catalogueacutee sp1() et la fonctionsp2() toutes deux eacutecrites par root le tableau suivant exprime lrsquoaffectation de quelquesprivilegraveges en donnant les explications associeacutees

La colonne Routine_name de la table mysqlprocs_priv deacutesigne le nom du sous-programme catalogueacute La colonne Routine_type preacutecise le type du sous-programme cata-logueacute (fonction ou proceacutedure) La colonne Grantor indique lrsquoutilisateur ayant compileacute lesous-programme La colonne Proc_priv est un SET contenant la liste des droits de lrsquoutilisa-teur sur le sous-programme de la base

Extrayons les privilegraveges relatifs aux sous-programmes au niveau database

SELECT CONCAT(UserHost) Compte Db Create_routine_priv create routine Alter_routine_priv alter routine Execute_priv exec routine FROM mysqldb+----------------+---------+----------------+---------------+---------------+| Compte | Db | create routine | alter routine | exec routine |+----------------+---------+----------------+---------------+---------------+| | test_ | N | N | N || | test | N | N | N || | N | N |+----------------+---------+----------------+---------------+---------------+

On retrouve le privilegravege de Paul Extrayons enfin les privilegraveges relatifs aux sous-programmesau niveau routine

Tableau 5-7 Affectation de privilegraveges

Instruction faite par root Explication

GRANT CREATE ROUTINE ON TO Paullocalhost

Privilegravege systegraveme database level

Paul (en accegraves local) peut creacuteer ou supprimerdes sous-programmes catalogueacutes dans la basebdpaul

GRANT ALTER ROUTINE ON TO Paullocalhost

Privilegravege systegraveme routine level

Paul peut modifier la proceacutedure sp1 contenuedans la base bdpaul

GRANT EXECUTE ON TO Juleslocalhost

GRANT EXECUTE ON TO Juleslocalhost

Privilegraveges systegraveme routine level

Jules peut exeacutecuter la proceacutedure sp1 et lafonction sp2 contenues dans la base bdpaul

bdpaul

PROCEDURE bdpaulsp1

PROCEDURE bdpaulsp1

FUNCTION bdpaulsp2

Paullocalhost | bdpaul | Y

4055_05_C05 Page 169 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

170 copy Eacuteditions Eyrolles

SELECT CONCAT(UserHost) Compte CONCAT(Routine_nameRoutine_type) Objet Grantor Proc_priv FROM mysqlprocs_priv+-----------------+----------------------+----------------+---------------+| Compte | Objet | Grantor | Proc_priv |+-----------------+----------------------+----------------+---------------+| Juleslocalhost | bdpaulsp1PROCEDURE | rootlocalhost | Execute || Juleslocalhost | bdpaulsp2FUNCTION | rootlocalhost | Execute || Paullocalhost | bdpaulsp1PROCEDURE | rootlocalhost | Alter Routine |+-----------------+----------------------+----------------+---------------+

On retrouve le privilegravege en modification de sp1 pour Paul et les deux privilegraveges drsquoexeacutecutionde Jules

Reacutevocation de privilegraveges (REVOKE)

La reacutevocation drsquoun ou de plusieurs privilegraveges est reacutealiseacutee par lrsquoinstruction REVOKE Pourpouvoir reacutevoquer un privilegravege vous devez deacutetenir (avoir reccedilu) au preacutealable ce mecircme privilegravegeavec lrsquooption WITH GRANT OPTION

Syntaxe

Dans la syntaxe suivante les options sont les mecircmes que pour la commande GRANT

REVOKE privilegravege [ (col1 [ col2])] [privilegravege2 ]

ON [ TABLE | FUNCTION | PROCEDURE ]

nomTable | | | nomBase

FROM utilisateur [utilisateur2 ]

Exemples

Le tableau suivant deacutecrit la reacutevocation de certains privilegraveges acquis des utilisateurs Paul et Jules

Tableau 5-8 Reacutevocation de privilegraveges

Instruction faite par root Explication

REVOKE CREATE ON FROM

Privilegravege systegraveme database level

Paul (en accegraves local) ne peut plus creacuteer de tables dansla base bdpaul

REVOKE ALTERINSERTUPDATE(ISBN) ON FROM

Privilegravege objet table level

Paul ne peut plus modifier la structure (ou lescontraintes) inseacuterer et modifier la colonne ISBN de latable Livre contenue dans la base bdpaul

GRANT USAGE ON bdpaul TO WITH MAX_QUERIES_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0

Privilegravege systegraveme database level

Jules nrsquoest plus limiteacute en requecirctes SELECT et UPDATEsur la base de donneacutees bdpaul Ici crsquoest un GRANT qursquoilfaut faire car il srsquoagit plus drsquoune restriction de connexionque drsquoune instruction SQL

bdpaulPaullocalhost

bdpaulLivrePaullocalhost

Juleslocalhost

4055_05_C05 Page 170 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 171

chapitre ndeg 5 Controcircle des donneacutees

Veacuterifications

Une fois ces actualisations reacutealiseacutees les cinq tables de la base mysql contiennent un peu plusle caractegravere N qursquoauparavant Les colonnes SET des tables mysqltables_privmysqlcolumns_priv et mysqlprocs_priv sont eacutegalement mises agrave jour Ainsilrsquoextraction du profil actuel de Paul au niveau table fait apparaicirctre les deux seuls droits qursquoillui reste

SELECT CONCAT(UserHost) CompteCONCAT(DbTable_name)

Objet

Grantor Table_priv FROM mysqltables_priv

WHERE User=Paul AND Host=localhost

+----------------+--------------+----------------+---------------+

| Compte | Objet | Grantor | Table_priv |

+----------------+--------------+----------------+---------------+

| Paullocalhost | bdpaulLivre | rootlocalhost | SelectDelete |

+----------------+--------------+----------------+---------------+

Lrsquoextraction du profil actuel de Jules au niveau database fait apparaicirctre que les deux limita-tions de connexion sur les SELECT et UPDATE ont disparu

SELECT HostUser max_questions Requetes max_updates Modifs max_connections Connexions max_user_connections Cx simult FROM mysqluser WHERE User=Jules AND Host=localhost+-----------+-------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+-------+----------+--------+------------+------------+| localhost | Jules | | 6 | 3 |+-----------+-------+----------+--------+------------+------------+

Tout en une fois

Il existe une instruction qui reacutevoque tous les droits en une fois Vous en avez assez drsquoun utili-sateur qui ne cesse de vous casser les pieds utilisez REVOKE ALL PRIVILEGES Pensezquand mecircme agrave sauvegarder au preacutealable le profil de Jules (SHOW GRANT FOR) pourpouvoir le faire travailler de nouveau quand vous serez calmeacute

Selon la documentation officielle la syntaxe suivante permet de supprimer toutes les preacuteroga-tives aux niveaux global database table et column Et les privilegraveges routine me direz-vous Ils ont ducirc lrsquooublier dans la documentation mais ils sont aussi effaceacutes ne vous inquieacutetez pas jelrsquoai testeacute

REVOKE ALL PRIVILEGES GRANT OPTION FROM utilisateur [ utilisateur2 ]

Pour pouvoir annihiler ainsi un utilisateur il faut deacutetenir le privilegravege CREATE USER au niveauglobal ou le privilegravege UPDATE au niveau database sur la base mysql

0 | 0

4055_05_C05 Page 171 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

172 copy Eacuteditions Eyrolles

Ne confondez pas suppression de tous les droits drsquoun accegraves et suppression de lrsquoutilisateur Paranalogie les politiciens qui se voient retirer le droit de vote ne sont pas encore guillotineacutes (queje sache) Eacutenervons-nous contre Jules

REVOKE ALL PRIVILEGES GRANT OPTION FROM Juleslocalhost

Attributions et reacutevocations laquo sauvages raquo

Le caractegravere open de MySQL fait des fois bien les choses mais dans ce cas preacutecis je netrouve pas Ici mon billet drsquohumeur conteste la possibiliteacute qui est donneacutee de modifier lescinq tables de la base mysql pour affecter tantocirct un N par-ci tantocirct un Y par-lagrave ou encorepour mettre agrave jour un SET contenant SELECT par exemple etc Bref un UPDATE rateacute unINSERT dans la mauvaise colonne un DELETE sans WHERE et vous mettez une panique noire(comme la couleur par deacutefaut de lrsquointerface de commande) dans vos bases Vous pouvez vous-mecircme empecirccher toute connexion (mecircme celle du root)

Sous Oracle les commandes GRANT et REVOKE mettent agrave jour des tables systegraveme que vouspouvez interroger mais que vous ne pouvez pas modifier Crsquoest heureux

En conclusion je ne deacutecrirai aucune de ces manipulations drsquoabord parce que je nrsquoai pas enviede me tromper en faisant des tests et bouleverser ainsi inutilement ma configuration Ensuiteparce si vous voulez laquo bidouiller raquo allez consulter des sites Web ou drsquoautres ouvrages quirecopient la documentation sans quelquefois changer ni tester les exemples vous mrsquoen direzdes nouvelles

Vous voulez donner des droits utilisez GRANT les reprendre utilisez REVOKE car

bull Ils sont programmeacutes preacuteciseacutement pour ccedila

bull Les deux instructions sont dans la norme SQL

Ne pas les employer crsquoest comme acheter une quatre cylindres chez BMW (le motoriste estspeacutecialiste des six en ligne) et verser en cachette du colza dans le reacuteservoir chez lrsquoagriculteurdu coin en croyant eacuteconomiser

La seule utilisation acceptable parce qursquoon nrsquoa pas le choix de faire autrement concerne lamise agrave jour de la table mysqlhost (deacutecrite dans la section suivante) Agrave configuration avan-ceacutee programmeur averti

Accegraves distants

La figure suivante illustre la configuration de mon test Un client est en 1921684173 surlequel sont installeacutees les couches MySQL (Complete Package ou Essentials Package) Unserveur est en 1921684118 eacutequipeacute de MySQL Complete Package Sur le serveur root creacutee

4055_05_C05 Page 172 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 173

chapitre ndeg 5 Controcircle des donneacutees

un accegraves agrave Paul en preacutecisant lrsquoadresse de la machine client et lui attribue un droit drsquoextrac-tion de la table Livre sur la base bdPaul

CREATE USER Paul1921684173 IDENTIFIED BY pauldistant

GRANT SELECT ON bdpaulLivre TO Paul1921684173

Connexion par lrsquointerface de commande

Sur le client Paul se connecte au serveur dans une fenecirctre de commande en preacutecisantlrsquoadresse de la machine serveur puis donne son mot de passe distant Pensez agrave enlever lespare-feu Windows sur le client et le serveur (bloquant le port 3306)

mysql -h 1921684118 -u Paul -p

Paul peut agrave preacutesent seulement interroger la table distante comme le montre la copie drsquoeacutecransuivante

Table mysqlhostLa table mysqlhost est utiliseacutee conjointement avec mysqldb et concerne les accegravesdistants (plusieurs machines) Cette table nrsquoest employeacutee que pour les preacuterogatives au niveau

Figure 5-5 Accegraves distant par lrsquointerface de commande MySQL

Paullocalhost

1921684118

1921684173root

Paul1921684173

TCP-IP

bdpaul

mysql

mysql

rootlocalhostPaul

Livre

Figure 5-6 Interrogation distante par lrsquointerface de commande MySQL

4055_05_C05 Page 173 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

174 copy Eacuteditions Eyrolles

database indeacutependamment des utilisateurs La structure est la mecircme que celle de mysqldbagrave lrsquoexception de la colonne User qui nrsquoest pas preacutesente Le couple de colonnes (Host Db)est unique

MySQL lit et trie les tables db (sur les colonnes Host Db et User) et host (sur les colonnesHost et Db) en mecircme temps qursquoil parcourt la table user Pour les opeacuterations relatives auxbases (INSERT UPDATE etc) MySQL interroge la table user Si lrsquoaccegraves nrsquoy est pas deacutecritla recherche se poursuit dans les tables db et host Si la colonne Host de la table db estrenseigneacutee en fonction de lrsquoaccegraves lrsquoutilisateur reccediloit ses privilegraveges

Si la colonne Host de la table db nrsquoest pas renseigneacutee ( ) cela signifie que la table hosteacutenumegravere les machines qui sont autoriseacutees agrave acceacuteder agrave une base de donneacutees en particulier Si lamachine ne correspond pas lrsquoaccegraves nrsquoest pas permis Dans le cas contraire les privilegraveges sontvalueacutes agrave Y agrave partir drsquoune intersection (et pas drsquoune union) entre les tables db et host sur lecouple (Host Db)

La table mysqlhost nrsquoest mise agrave jour ni par GRANT ni par REVOKE Il faudra directement inseacute-rer (par INSERT) modifier (par UPDATE) ou supprimer (par DELETE) les lignes de cette tableElle nrsquoest pas utiliseacutee par la plupart des serveur MySQL car elle est deacutedieacutee agrave des usages tregravesspeacutecifiques (pour geacuterer un ensemble de machines agrave accegraves seacutecuriseacute par exemple) Elle peutaussi ecirctre utiliseacutee pour deacutefinir un ensemble de machines agrave accegraves non seacutecuriseacute

En supposant que vous deacuteclariez une machine agrave accegraves non seacutecuriseacute camparolsgtrfr Ilest possible drsquoautoriser lrsquoaccegraves seacutecuriseacute agrave toutes les autres machines du reacuteseau local Ceci enajoutant des enregistrements par INSERT dans la table mysqlhost comme suit

+------------------+----+----------------------------

| Host | Db |

+------------------+----+-----------------------------

| camparolsgtrfr | | (tous les privilegraveges agrave N)

| gtrfr | | (tous les privilegraveges agrave Y)

+------------------+----+-----------------------------

Vous deacuteclareriez lrsquoinverse des conditions initiales en remplaccedilant les N par des Y et reacutecipro-quement Dans tous les cas il sera neacutecessaire de mettre agrave jour les autres tables pour affiner lesprivilegraveges

Tableau 5-9 Tables pour les accegraves distants

Caractegravere Signification pour mysqldb Signification pour mysqlhost

colonne Host colonne Db colonne Host colonne Db

toute machine toute base toute machine toute base

(chaicircne vide)

consultez la table mysqlhost

toute base toute machine toute base

4055_05_C05 Page 174 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 175

chapitre ndeg 5 Controcircle des donneacutees

Vues

Outre le controcircle de lrsquoaccegraves aux donneacutees (privilegraveges) la confidentialiteacute des informations est unaspect important qursquoun SGBD relationnel doit prendre en compte Depuis la version 5 de MySQLla confidentialiteacute est renforceacutee par lrsquoutilisation de vues (views) qui agissent comme des fenecirctres surla base de donneacutees Cette section deacutecrit les diffeacuterents types de vues qursquoon peut rencontrer

Les vues correspondent agrave ce qursquoon appelle laquo le niveau externe raquo qui reflegravete la partie visible dela base de donneacutees pour chaque utilisateur

Seules les tables contiennent des donneacutees et pourtant pour lrsquoutilisateur une vue apparaicirctcomme une table En theacuteorie les utilisateurs ne devraient acceacuteder aux informations qursquoenquestionnant des vues Ces derniegraveres masquant la structure des tables interrogeacutees En pratiquela plupart des applications se passent de ce concept en manipulant directement les tables

La figure suivante illustre ce qui a eacuteteacute dit en preacutesentant trois utilisateurs Ils travaillent chacunsur une base de donneacutees contenant des vues formeacutees agrave partir de diffeacuterentes tables

Une vue est consideacutereacutee comme une table virtuelle car elle nrsquoa pas drsquoexistence propre Seule sastructure est stockeacutee dans le dictionnaire Ses donneacutees seront extraites de la meacutemoire agrave partirdes tables source agrave la demande

Une vue est creacuteeacutee agrave lrsquoaide drsquoune instruction SELECT appeleacutee laquo requecircte de deacutefinition raquo Cetterequecircte interroge une (ou plusieurs) table(s) ou vue(s) Une vue se recharge chaque foisqursquoelle est interrogeacutee

Outre le fait drsquoassurer la confidentialiteacute des informations une vue est capable de reacutealiser descontrocircles de contraintes drsquointeacutegriteacute et de simplifier la formulation de requecirctes complexes

Figure 5-7 Les vues

Niveau externe

Table1 Table2

Vue1 Vue2

Vue3

Vue1Vue2

Vue3

Niveau physique

scheacutema1 scheacutema2

Jules

Louise

Paul

4055_05_C05 Page 175 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

176 copy Eacuteditions Eyrolles

Dans certains cas la deacutefinition drsquoune vue temporaire est neacutecessaire pour eacutecrire une requecircteqursquoil ne serait pas possible de construire agrave partir des tables seules Attribueacutees comme des privi-legraveges (GRANT) les vues ameacuteliorent la seacutecuriteacute des informations stockeacutees

Creacuteation drsquoune vue (CREATE VIEW)

Pour pouvoir creacuteer une vue dans une base vous devez posseacuteder le privilegravege CREATE VIEW etles privilegraveges en SELECT des tables preacutesentes dans la requecircte de deacutefinition de la vue Lasyntaxe SQL de creacuteation drsquoune vue est la suivante

CREATE [OR REPLACE] [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE]

VIEW [nomBase]nomVue [(listecolonnes)]

AS requecircteSELECT

[WITH [CASCADED | LOCAL] CHECK OPTION]

OR REPLACE remplace la vue par la nouvelle deacutefinition mecircme si elle existait deacutejagrave (eacutevitede deacutetruire la vue avant de la recreacuteer) Vous devez avoir le privilegravege DELETE sur la basepour beacuteneacuteficier de cette directive

ALGORITHM=MERGE la deacutefinition de la vue et sa requecircte sont fusionneacutees en interne

ALGORITHM=TEMPTABLE les reacutesultats sont extraits dans une table temporaire (TEMPO-RARY) qui est utiliseacutee par la suite Inteacuteressant si les tables source sont sujettes agrave de nombreuxverrous qui ne gecircnent plus la manipulation de la vue utilisant elle une table temporaire

Aucune option ou ALGORITHM=UNDEFINED MySQL choisit la politique agrave adoptersouvent en faveur de MERGE la seule qui convient aux vues modifiables

nomBase deacutesigne le nom de la base de donneacutees qui heacutebergera la vue En lrsquoabsence de ceparamegravetre la vue est creacuteeacutee dans la base en cours drsquoutilisation

requecircteSELECT requecircte de deacutefinition interrogeant une (ou des) table(s) ou vue(s) pourcharger les donneacutees dans la vue

bull La requecircte de deacutefinition ne peut interroger une table temporaire ni contenir de paramegravetresou de variables de session

bull Si la requecircte de deacutefinition seacutelectionne toutes les colonnes drsquoun objet source (SELECT FROMhellip) et si des colonnes sont ajouteacutees par la suite agrave cet objet la vue ne contiendra pasces colonnes deacutefinies ulteacuterieurement agrave elle Il faudra recreacuteer la vue pour prendre en comptelrsquoeacutevolution structurelle de lrsquoobjet source

WITH CHECK OPTION garantit que toute mise agrave jour de la vue par INSERT ou UPDATEsrsquoeffectuera conformeacutement au preacutedicat contenu dans la requecircte de deacutefinition

Les paramegravetres LOCAL et CASCADED (par deacutefaut) determinent la porteacutee de la veacuterificationquand une vue est deacutefinie agrave partir drsquoune autre vue LOCAL restreint la veacuterification du preacutedi-cat agrave la vue elle-mecircme CASCADED permet drsquoeacutetendre eacuteventuellement les veacuterifications auxautres vues source de la vue qui vient drsquoecirctre deacutefinie

4055_05_C05 Page 176 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 177

chapitre ndeg 5 Controcircle des donneacutees

Classification

On distingue les vues simples des vues complexes en fonction de la nature de la requecircte dedeacutefinition Le tableau suivant reacutesume ce que nous allons deacutetailler au cours de cette section

Une vue monotable est deacutefinie par une requecircte SELECT ne comportant qursquoune seule table danssa clause FROM

Vues monotables

Les meacutecanismes preacutesenteacutes ci-apregraves srsquoappliquent aussi pour la plupart aux vues multitables(eacutetudieacutees plus loin) Consideacuterons les deux vues illustreacutees par la figure suivante et deacuteriveacutees dela table Pilote La vue PilotesAF deacutecrit les pilotes drsquoAir France agrave lrsquoaide drsquoune restriction(eacuteleacutements du WHERE) La vue Etat_civil est constitueacutee par une projection de certainescolonnes (eacuteleacutements du SELECT)

Une fois creacuteeacutee une vue srsquointerroge comme une table par tout utilisateur sous reacuteserve qursquoil aitobtenu le privilegravege en lecture directement (GRANT SELECT ON nomVue TOhellip) Le tableausuivant preacutesente une interrogation des deux vues

Tableau 5-10 Classification des vues

Requecircte de deacutefinition Vue simple Vue complexe

Nombre de tables 1 1 ou plusieurs

Fonction non oui

Regroupement non oui

Mises agrave jour possibles oui pas toujours

Figure 5-8 Deux vues drsquoune table

Web

Pilote

brevet nom nbHVol adresse compa

PL-1 Soutou 890 Castanet CAST

PL-2 Laroche 500 Montauban CAST

PL-3 Lamothe 1200 Ramonville AF

PL-4 Albaric 500 Vieille-Toulouse AF

PL-5 Bidal 120 Paris ASO

PL-6 Labat 120 Pau ASO

PL-7 Tauzin 100 Bas-Mauco ASO

CREATE VIEW PilotesAF

AS SELECT FROM Pilote

WHERE compa = AF

CREATE VIEW Etat_civil AS SELECT nom nbHVol adresse compa FROM Pilote

4055_05_C05 Page 177 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

178 copy Eacuteditions Eyrolles

Agrave partir de cette table et de ces vues nous allons eacutetudier drsquoautres options de lrsquoinstructionCREATE VIEW

AliasLes alias srsquoils sont utiliseacutes deacutesignent le nom de chaque colonne de la vue Ce meacutecanismepermet de mieux controcircler les noms de colonnes Quand un alias nrsquoest pas preacutesent la colonneprend le nom de lrsquoexpression renvoyeacutee par la requecircte de deacutefinition Ce meacutecanisme sert agravemasquer les noms des colonnes de lrsquoobjet source

Les vues suivantes sont creacuteeacutees avec des qui masquent le nom des colonnes de la tablesource Les deux eacutecritures sont eacutequivalentes

Vue drsquoune vueLrsquoobjet source drsquoune vue est en geacuteneacuteral une table mais peut aussi ecirctre une vue La vuesuivante est deacutefinie agrave partir de la vue preacuteceacutedemment creacuteeacutee Notez qursquoilaurait eacuteteacute possible drsquoutiliser des alias pour renommer les colonnes de la nouvelle vue

Tableau 5-11 Interrogation drsquoune vue

Besoin et requecircte ReacutesultatSomme des heures de vol des pilotes dAir FranceSELECT SUM(nbHVol) FROM PilotesAF

+-------------+| SUM(nbHVol) |+-------------+| 170000 |+-------------+

Nombre de pilotesSELECT COUNT() FROM Etat_civil

+----------+| COUNT() |+----------+| 7 |+----------+

Web

alias

Tableau 5-12 Vue avec alias

Eacutecriture 1 Eacutecriture 2CREATE OR REPLACE VIEW PilotesPasAF ( ) AS SELECT FROM Pilote WHERE NOT (compa = AF)

CREATE OR REPLACE VIEW PilotesPasAF AS SELECT brevet nom nbHVol adresse compa FROM Pilote WHERE NOT (compa = AF)

Contenu de la vue +---------+---------+-----------+------------+---------+| |+---------+---------+-----------+------------+---------+| PL-1 | Soutou | 89000 | Castanet | CAST || PL-2 | Laroche | 50000 | Montauban | CAST || PL-5 | Bidal | 12000 | Paris | ASO || PL-6 | Labat | 12000 | Pau | ASO || PL-7 | Tauzin | 10000 | Bas-Mauco | ASO |+---------+---------+-----------+------------+---------+

Web

codepilnomPilheuresPiladressePil societe

codepil nomPilheuresPil adressePil

societe

codepil | nomPil | heuresPil | adressePil | societe

PilotesPasAF

4055_05_C05 Page 178 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 179

chapitre ndeg 5 Controcircle des donneacutees

Vues en lecture seuleLrsquooption ALGORITHM=TEMPTABLE deacuteclare la vue non modifiable par INSERT UPDATE ouDELETE

Redeacutefinissons une vue des pilotes nrsquoeacutetant pas drsquoAir France agrave lrsquoaide de cette option Les messa-ges drsquoerreur induits par la clause de lecture seule geacuteneacutereacutes par MySQL sont tregraves parlants

Vues modifiables

Lorsqursquoil est possible drsquoexeacutecuter des instructions INSERT UPDATE ou DELETE sur une vuecette derniegravere est dite laquo modifiable raquo (updatable view) Vous pouvez creacuteer une vue qui estmodifiable intrinsegravequement

Pour mettre agrave jour une vue il doit exister une correspondance biunivoque entre les lignes de lavue et celles de lrsquoobjet source De plus certaines conditions doivent ecirctre remplies

Si une vue nrsquoest pas modifiable en soi il nrsquoest pas encore possible de programmer un deacuteclen-cheur de type instead of qui prenne le pas sur lrsquoinstruction de modification de la vue en speacuteci-fiant un bloc drsquoinstructions agrave effectuer agrave la place Les mises agrave jour de la vue seraient ainsiautomatiquement reacutepercuteacutees au niveau drsquoune ou de plusieurs tables Notons que ce type dedeacuteclencheur nrsquoest arriveacute qursquoassez tardivement sous Oracle DB2 et SQL Server

Tableau 5-13 Vue drsquoune vue

Creacuteation Contenu de la vue

CREATE OR REPLACE VIEW EtatCivilPilotesPasAF AS SELECT nomPilheuresPiladressePil FROM

+---------+-----------+------------+| nomPil | heuresPil | adressePil |+---------+-----------+------------+| Soutou | 89000 | Castanet || Laroche | 50000 | Montauban || Bidal | 12000 | Paris || Labat | 12000 | Pau || Tauzin | 10000 | Bas-Mauco |+---------+-----------+------------+

Web

PilotesPasAF

Tableau 5-14 Vue en lecture seule

Creacuteation Opeacuterations impossibles

CREATE OR REPLACE VIEW PilotesPasAFRO AS SELECT FROM Pilote WHERE NOT (compa = AF)

INSERT INTO PilotesPasAFRO VALUES (PL-8Ferry5ParisASO)ERROR 1288 (HY000) The target table PilotesPasAFRO of the INSERT is not updatableUPDATE PilotesPasAFRO SET nbHvol=nbHvol+2ERROR 1288 (HY000) The target table PilotesPasAFRO of the UPDATE is not updatableDELETE FROM PilotesPasAFROERROR 1288 (HY000) The target table PilotesPasAFRO of the DELETE is not updatable

Web

ALGORITHM=TEMPTABLE

4055_05_C05 Page 179 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

180 copy Eacuteditions Eyrolles

Pour qursquoune vue simple soit modifiable sa requecircte de deacutefinition doit respecter les critegraveres suivants

bull pas de directive DISTINCT de fonction (AVG COUNT MAX MIN SUM ou VARIANCE)drsquoexpression dans le SELECT

bull pas de GROUP BY ORDER BY ou HAVING

Dans notre exemple nous constatons qursquoil sera quand mecircme possible drsquoajouter un pilote agrave la vueEtat_civil bien que la cleacute primaire de la table source ne soit pas renseigneacutee MySQL insegravere agravela place en lrsquoabsence de valeur par deacutefaut de la cleacute primaire la chaicircne vide ( ) si la cleacute avaiteacuteteacute une seacutequence les insertions se feraient normalement Cette opeacuteration ne pourra donc se faireqursquoune seule fois apregraves cela sera contradictoire avec la condition de correspondance biunivo-que

En revanche il sera possible de modifier les colonnes de cette vue On pourra aussi ajoutermodifier (sous reacuteserve de respecter les eacuteventuelles contraintes issues des colonnes de la tablesource) ou supprimer des pilotes en passant par la vue PilotesAF

La derniegravere instruction est paradoxale car elle permet drsquoajouter un pilote de la compagnieASO en passant par la vue des pilotes de la compagnie AF La directive WITH CHECKOPTION permet drsquoeacuteviter ces effets de bord indeacutesirables pour lrsquointeacutegriteacute de la base

Tableau 5-15 Mises agrave jour de vues

Opeacuterations possibles Opeacuterations non conseilleacutees et impossibles

Suppression des pilotes de ASO

DELETE FROM WHERE compa = ASOLe pilote Lamothe double ses heuresUPDATE SET nbHVol = nbHVol2 WHERE nom = Lamothe

Ajout drsquoun pilote (pas conseilleacute)INSERT INTO VALUES(Raffarin10PoitiersASO)

Ajout drsquoun autre pilote impossibleINSERT INTO Etat_civil VALUES (Lebur20BordeauxASO)ERROR 1062 (23000) Duplicate entry for key 1

Ajout drsquoun piloteINSERT INTO VALUES (PL-8Ferry5 ParisAF)ModificationUPDATE SET nbHVol = nbHVol2SuppressionDELETE FROM WHERE nom=FerryAjout drsquoun pilote qui nrsquoest pas de AF INSERT INTO VALUES (PL-9Caboche 600RennesASO)

Toute mise agrave jour qui ne respecterait pas les contraintes de la table Pilote

Web

Etat_civil

Etat_civil

Etat_civil

PilotesAF

PilotesAF

PilotesAF

PilotesAF

4055_05_C05 Page 180 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 181

chapitre ndeg 5 Controcircle des donneacutees

Directive CHECK OPTION

La directive WITH CHECK OPTION empecircche un ajout ou une modification non conformes agrave ladeacutefinition de la vue

Interdisons lrsquoajout (ou la modification de la colonne compa) drsquoun pilote au travers de la vuePilotesAF si le pilote nrsquoappartient pas agrave la compagnie de code AF Il est neacutecessaire deredeacutefinir la vue PilotesAF Le script suivant deacutecrit la redeacutefinition de la vue lrsquoajout drsquounpilote et les tentatives drsquoajout et de modification ne respectant pas les caracteacuteristiques de lavue Les messages sont tregraves clairs

Vues complexes

Une vue complexe est caracteacuteriseacutee par le fait qursquoelle contient dans sa deacutefinition plusieurstables (jointures) et une fonction appliqueacutee agrave des regroupements ou agrave des expressions La miseagrave jour de telles vues nrsquoest pas toujours possible

Pour pouvoir modifier une vue complexe les restrictions sont les suivantes

bull La requecircte de deacutefinition ne doit pas contenir de sous-interrogation (jointure proceacutedurale)

bull Il nrsquoest pas possible drsquoutiliser drsquoopeacuterateur ensembliste (sauf UNION [ALL])

La figure suivante preacutesente deux vues complexes qui ne sont pas modifiables La vue multita-ble Pilotes_multi_AF est creacuteeacutee agrave partir drsquoune jointure entre les tables Compagnie etPilote La vue Moyenne_Heures_Pil est creacuteeacutee agrave partir drsquoun regroupement de la tablePilote

Tableau 5-16 Vue avec CHECK OPTION

Opeacuterations possibles Opeacuterations impossibles

Recreacuteation de la vueCREATE OR REPLACE VIEW PilotesAF AS SELECT FROM pilote WITH CHECK OPTION

Nouveau piloteINSERT INTO PilotesAF VALUES(PL-11Teste900RevelAF)Query OK 1 row affected (003 sec)

Ajout drsquoun piloteINSERT INTO PilotesAF VALUES (PL-9Caboche600RennesASO)ERROR 1369 (HY000) CHECK OPTION failedbdsoutouPilotesAF

Modification de pilotesUPDATE PilotesAF SET compa=ASOERROR 1369 (HY000) CHECK OPTION failedbdsoutouPilotesAF

Web

WHERE compa = AF

Web

4055_05_C05 Page 181 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

182 copy Eacuteditions Eyrolles

Mises agrave jour

Il semblerait qursquoon ne puisse inseacuterer aucun enregistrement dans ces vues du fait de la coheacute-rence qursquoil faudrait eacutetablir du sens vue vers tables Les messages drsquoerreur geacuteneacutereacutes par MySQLsont diffeacuterents suivant la nature de la vue (monotable ou multitable) Nous verrons commentreacutesoudre lrsquoerreur du deuxiegraveme cas

On pourrait croire qursquoil en est de mecircme pour les modifications Ce nrsquoest pas le cas Alors quela vue monotable Moyenne_Heures_Pil nrsquoest pas modifiable ni par UPDATE ni parDELETE (message drsquoerreur 1288) la vue multitable Pilotes_multi_AF est transformabledans une certaine mesure car la table Pilote (qui entre dans sa composition) est ditelaquo proteacutegeacutee par cleacute raquo (key preserved) Nous verrons dans le prochain paragraphe la significa-tion de cette notion

Figure 5-9 Vues complexes

Compagnie

comp nrue rue ville nomComp

AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL

Pilote

brevet nom nbHVol compa

PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING

CREATE VIEW Pilotes_multi_AF

AS SELECT pbrevet pnom pnbHVol cville cnomComp FROM Pilote p Compagnie c WHERE pcompa = ccomp AND pcompa = AF

CREATE VIEW Moyenne_Heures_Pil AS SELECT compa

AVG(nbHVol) moyenne FROM Pilote GROUP BY compa

compa moyenne

AF 675 SING 1000

Tableau 5-17 Tentatives drsquoinsertions dans des vues complexes

Vue monotable Vue multitable

INSERT INTO Moyenne_Heures_Pil VALUES (TAT50)ERROR 1288 (HY000) The targettable Moyenne_Heures_Pil of theINSERT is not updatable

INSERT INTO Pilotes_multi_AF VALUES(PL-4Test400CastanetCastanet AL)ERROR 1394 (HY000) Can not insert into joinview bdsoutouPilotes_multi_AF without fields list

Web

4055_05_C05 Page 182 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 183

chapitre ndeg 5 Controcircle des donneacutees

Les colonnes de la vue correspondant agrave la table proteacutegeacutee par cleacute ne sont pas les seules agrave pou-voir ecirctre modifieacutees Ici nbHVol peut ecirctre mise agrave jour car elle appartient agrave la table proteacutegeacutee ville qui nrsquoappartient pas agrave une table proteacutegeacutee peut aussi ecirctre modifeacutee

Les suppressions ne se reacutepercutent pas sur les enregistrements de la table proteacutegeacutee par cleacute(Pilote)

Modifions et tentons de supprimer des enregistrements agrave travers la vue multitable Pilotes_multi_AF

Tableau 5-18 Mise agrave jour drsquoune vue multitable

Mise agrave jour Reacutesultats

-- Multiplie par 2 le nombre drsquoheuresUPDATE SET nbHVol = nbHVol 2

Query OK 2 rows affectedRows matched 2 Changed 2 Warnings 0

SELECT brevetnomnbHVol FROM Pilotes_multi_AF+--------+-------------+---------+| brevet | nom | nbHVol |+--------+-------------+---------+| PL-1 | Louise Ente | 90000 || PL-2 | Paul Ente | 180000 |+--------+-------------+---------+

-- Modif de la ville de la compagnieUPDATE SET ville = Orly

SELECT brevetnomville FROM Pilotes_multi_AF+--------+-------------+-------+| brevet | nom | ville |+--------+-------------+-------+| PL-1 | Louise Ente | Orly || PL-2 | Paul Ente | Orly |+--------+-------------+-------+

SELECT compvillenomComp FROM Compagnie+------+-----------+--------------+| comp | ville | nomComp |+------+-----------+--------------+| AF | Orly | Air France || SING | Singapour | Singapore AL |+------+-----------+--------------+

--Pas possible DELETE FROM ERROR 1395 (HY000) Can not delete

from join view bdsoutouPilotes_multi_AF

WebPilotes_multi_AF

Pilotes_multi_AF

Pilotes_multi_AF

4055_05_C05 Page 183 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

184 copy Eacuteditions Eyrolles

Tables proteacutegeacutees (key preserved tables)

Une table est dite proteacutegeacutee par sa cleacute (key preserved) si sa cleacute primaire est preacuteserveacutee dans laclause de jointure et se retrouve en tant que colonne de la vue multitable (elle peut jouer le rocirclede cleacute primaire de la vue)

En consideacuterant les donneacutees initiales pour la vue multitable Vue_Multi_Comp_Pil la tablepreacuteserveacutee est la table Pilote car la colonne brevet identifie chaque enregistrement extraitde la vue alors que la colonne comp ne le fait pas

Cela ne veut pas dire pour autant que cette vue est modifiable Eacutetudions agrave preacutesent les condi-tions qui reacutegissent ces limitations

Critegraveres

Une vue multitable modifiable (updatable join view ou modifiable join view) est une vue quinrsquoest pas deacutefinie avec lrsquooption ALGORITHM=TEMPTABLE et qui est telle que la requecircte dedeacutefinition contient plusieurs tables dans la clause FROM

Aucune suppression nrsquoest possible

Les insertions sont permises seulement en isolant toutes les colonnes drsquoune seule table source

Attention aux effets de bord quand vous modifiez une colonne provenant drsquoune table non pro-teacutegeacutee par cleacute Il est plus naturel de modifier directement la table en question

Modifions de diffeacuterentes maniegraveres la vue multitable Vue_Multi_Comp_Pil La premiegraveretente une suppression les deux suivantes modifient tantocirct une colonne de la table proteacutegeacuteetantocirct une colonne de la table non proteacutegeacutee Les deux derniegraveres instructions insegraverent danschacune des deux tables

Tableau 5-19 Vue multitable

Creacuteation de la vue Reacutesultats

CREATE VIEW

AS SELECT ccomp cnomComp pnom pnbHVol FROM Pilote p Compagnie c WHERE pcompa=ccomp

+------+--------------+--------+-------------+---------+| comp | nomComp | brevet | nom | nbHVol |+------+--------------+--------+-------------+---------+| AF | Air France | PL-1 | Louise Ente | 45000 || AF | Air France | PL-2 | Paul Ente | 90000 || SING | Singapore AL | PL-3 | Paul Soutou | 100000 |+------+--------------+--------+-------------+---------+

WebVue_Multi_Comp_Pil

pbrevet

4055_05_C05 Page 184 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 185

chapitre ndeg 5 Controcircle des donneacutees

Autres utilisations de vues

Les vues peuvent eacutegalement servir pour simplifier lrsquoeacutecriture de requecirctes complexes renforcerla confidentialiteacute et une certaine inteacutegriteacute

Tableau 5-20 Mises agrave jour

Mise agrave jour Reacutesultats

DELETE FROM Vue_Multi_Comp_Pil WHERE comp=AF

ERROR 1395 (HY000) Can not delete from join view bdsoutouVue_Multi_Comp_Pil

UPDATE Vue_Multi_Comp_Pil SET nbHVol = nbHVol 3Query OK 3 rows affected (010 sec)

Warnings 0

SELECT brevet nbHVol FROM Pilote+--------+---------+| brevet | nbHVol |+--------+---------+| PL-1 | 135000 || PL-2 | 270000 || PL-3 | 300000 |+--------+---------+

UPDATE Vue_Multi_Comp_Pil SET nomComp = Dupond Query OK 2 rows affected (038 sec)

Warnings 0

(SELECT compvillenomComp FROM Compagnie+------+-----------+---------+| comp | ville | nomComp |+------+-----------+---------+| AF | Paris | Dupond || SING | Singapour | Dupond |+------+-----------+---------+

INSERT INTO Vue_Multi_Comp_Pil VALUES (PL-5 Jean2500)

SELECT brevetnomnbHVol FROM Pilote+--------+-------------+---------+| brevet | nom | nbHVol |+--------+-------------+---------+| PL-1 | Louise Ente | 135000 || PL-2 | Paul Ente | 270000 || PL-3 | Paul Soutou | 300000 || |+--------+-------------+---------+

INSERT INTO Vue_Multi_Comp_Pil VALUES (TAT Test)

SELECT compvillenomComp FROM Compagnie+------+-----------+---------+| comp | ville | nomComp |+------+-----------+---------+| AF | Paris | Dupond || SING | Singapour | Dupond || |+------+-----------+---------+

Web

Rows matched 3 Changed 3

Rows matched 3 Changed 2

(brevetnomnbHVol)

PL-5 | Jean | 250000

(compnomComp)

TAT | Paris | Test

4055_05_C05 Page 185 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

186 copy Eacuteditions Eyrolles

Simplifier les noms

Une vue permet de simplifier la manipulation drsquoune table ayant un nom long ou des colonnesportant des noms compliqueacutes Consideacuterons par exemple la table COLLATION_CHARACTER_SET_APPLICABILITY[COLLATION_NAMECHARACTER_SET_NAME] qui deacutecrit les colla-tions des jeux de caractegraveres disponibles et qui est situeacutee dans la base de donneacutees stockant ledictionnaire des donneacutees (INFORMATION_SCHEMA) Nous eacutetudierons dans la prochainesection les diffeacuterentes tables de cette base systegraveme Supposons que lrsquoon deacutesire souvent acceacutederagrave cette table pour connaicirctre les diffeacuterentes collations possibles pour les jeux de caractegraveres latins

Creacuteons la vue CollationsLatines qui simplifie lrsquoaccegraves agrave cette table au niveau du nommais aussi au niveau des colonnes Interrogeons cette vue de maniegravere agrave connaicirctre les collationsspeacutecifiques agrave la langue de Moliegravere ou agrave celle de Goethe

On dira que MySQL est plus laquo brancheacute raquo par la nouveauteacute Goethe eacutetant neacute 76 ans apregraves ledeacutecegraves de Moliegravere Aucun french dans la base donc

Contraintes de veacuterification

Nous avons deacutecrit au chapitre 1 les contraintes de veacuterification (CHECK) qui ne sont pas encoretotalement prises en charge Il est possible de programmer ce type de contraintes par des vues

Consideacuterons la table Pilote illustreacutee ci-apregraves et programmons par lrsquointermeacutediaire de la vueVueGradePilotes la contrainte veacuterifiant qursquoun pilote

ne peut ecirctre commandant de bord qursquoagrave la condition qursquoil ait entre 1 000 et 4 000 heures de vol

ne peut ecirctre copilote qursquoagrave la condition qursquoil ait entre 100 et 1 000 heures de vol

ne peut ecirctre instructeur qursquoagrave partir de 3 000 heures de vol

Les regravegles conseilleacutees pour manipuler les enregistrements drsquoune vue v1 deacutecrivant des con-traintes de veacuterification sur une table t1 sont les suivantes

bull modification et insertion par la vue v1

bull suppression et lecture par la table t1

Tableau 5-21 Vue pour simplifier les noms

Creacuteation Interrogation

CREATE VIEW CollationsLatines (collationjeu) AS SELECT FROM INFORMATION_SCHEMAcrarr COLLATION_CHARACTER_SET_APPLICABILITY WHERE CHARACTER_SET_NAME LIKE Latin

SELECT FROM CollationsLatines WHERE collation LIKE french OR collation LIKE german+-------------------+--------+| collation | jeu |+-------------------+--------+| latin1_german1_ci | latin1 || latin1_german2_ci | latin1 |+-------------------+--------+

Web

4055_05_C05 Page 186 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 187

chapitre ndeg 5 Controcircle des donneacutees

Manipulons agrave preacutesent la vue de notre exemple

Confidentialiteacute

La confidentialiteacute est une des vocations premiegraveres des vues Outre lrsquoutilisation de variablesdrsquoenvironnement il est possible de restreindre lrsquoaccegraves agrave des tables en fonction de momentspreacutecis

Les vues suivantes limitent temporellement les accegraves en lecture et en eacutecriture agrave des tables

Notez qursquoil est possible en plus de limiter lrsquoaccegraves agrave un utilisateur particulier en utilisant unevariable drsquoenvironnement (exemple rajout de la condition AND CURRENT_USER() =Paullocalhost agrave une vue)

Figure 5-10 Vue simulant la contrainte CHECK

Web Pilote

brevet nom nbHVol grade

PL-1 Daniel Vielle 1000 CDB PL-2 Benoit Treilhou 450 COPI PL-3 Pierre Filoux 9000 INST PL-4 Philippe Minier 1000 COPI

CREATE VIEW VueGradePilotesAS SELECT brevetnomnbHVolgradeFROM PiloteWHERE (grade =CDB

AND nbHVol BETWEEN 1000 AND 4000) OR (grade = COPI

AND nbHVol BETWEEN 100 AND 1000) OR (gr ade = INST AND nb HVol gt 3000)

WITH CHECK OPTION

Tableau 5-22 Manipulations des vues pour lrsquointeacutegriteacute reacutefeacuterentielle

Mises agrave jour possibles Mises agrave jour non valides ERROR 1369 (HY000) CHECK OPTION failed bdsoutouVueGradePilotes

INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-1Daniel Vielle )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-2Benoit Treihlou )INSERT INTO VueGradePilotes(brevetnomnbHVolgrade) VALUES (PL-3Pierre Filoux )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-4Philippe Minier )

INSERT INTO VueGradePilotes (brevetnomnbHVolgrade)VALUES (PL-5Trop jeune )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-6Inexperimente )

UPDATE VueGradePilotes SET WHERE brevet = PL-2

UPDATE VueGradePilotes SET WHERE brevet = PL-4

UPDATE VueGradePilotes SET WHERE brevet = PL-3

Web

1000CDB

450COPI

9000INST

1000COPI

100CDB

2999INST

grade =INST

grade =CDB nbHVol= 50

4055_05_C05 Page 187 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

188 copy Eacuteditions Eyrolles

Transmission de droits

Les meacutecanismes de transmission et de reacutevocation de privilegraveges que nous avons eacutetudieacutes srsquoappli-quent eacutegalement aux vues Ainsi si un utilisateur deacutesire transmettre des droits sur une partiedrsquoune de ses tables il utilisera une vue Seules les donneacutees appartenant agrave la vue seront acces-sibles aux beacuteneacuteficiaires

Les privilegraveges objet qursquoil est possible drsquoattribuer sur une vue sont les mecircmes que ceux appli-cables sur les tables (SELECT INSERT UPDATE sur une ou plusieurs colonnes DELETE)

Modification drsquoune vue (ALTER VIEW)

Vous devez au moins posseacuteder les privilegraveges CREATE VIEW et DELETE au niveau drsquoune vuepour pouvoir la modifier La syntaxe SQL est la suivante

ALTER [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE]

VIEW [nomBase]nomVue [(listecolonnes)]

AS requecircteSELECT

[WITH [CASCADED | LOCAL] CHECK OPTION]

Tableau 5-23 Vues pour restreindre lrsquoaccegraves agrave des moments preacutecis

Deacutefinition de la vue Accegraves

CREATE VIEW VueDesCompagniesJoursFeries AS SELECT FROM Compagnie WHERE

Restriction en lecture de la table Compagnie lessamedis et dimanches Mises agrave jour possibles agravetout moment

CREATE VIEW VueDesPilotesJoursOuvrables AS SELECT FROM Pilote WHERE AND DATE_FORMAT(SYSDATE()W) NOT IN (Sunday Saturday) WITH CHECK OPTION

Restriction en lecture et en eacutecriture (agrave cause deWITH CHECK OPTION) de la table Pilote lesjours ouvrables de 8h30 agrave 17h30

Web

DATE_FORMAT(SYSDATE()W)IN (SundaySaturday)

CURTIME()+0BETWEEN 83000 AND 173000

Tableau 5-24 Privilegraveges sur les vues

Attribution du privilegravege Signification

GRANT SELECT ON VueDesCompagniesJoursFeries TO Paullocalhost

Accegraves en local de lrsquoutilisateur Paul en lec-ture sur la vue VueDesCompagniesJoursFeacuterieacutes

GRANT INSERT ON VueDesPilotesJoursOuvrables TO Juleslocalhost

Accegraves en local de lrsquoutilisateur Jules eneacutecriture sur la vue VueDesCompagniesJoursFeacuterieacutes

4055_05_C05 Page 188 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 189

chapitre ndeg 5 Controcircle des donneacutees

Les transformations peuvent concerner toutes les parties drsquoune vue existante la politique decreacuteation (ALGORITHM) la liste des colonnes la requecircte etc Voir la section Creacuteation drsquoune vue

Visualisation drsquoune vue (SHOW CREATE VIEW)

Pour pouvoir visualiser la requecircte de deacutefinition drsquoune vue lrsquoinstruction que MySQL proposeest la suivante

SHOW CREATE VIEW [nomBase]nomVue

En arrangeant lrsquoeacutetat de sortie vous pouvez deacutecouvrir comment MySQL stocke la deacutefinition dela vue preacuteceacutedemment creacuteeacutee

SHOW CREATE VIEW VueDesCompagniesJoursFeries+-----------------------------+-----------------------------------------------+| View | Create View |+-----------------------------+-----------------------------------------------+| VueDesCompagniesJoursFeries | CREATE ALGORITHM=UNDEFINED || | DEFINER=`root``localhost` SQL SECURITY || | DEFINER VIEW `VueDesCompagniesJoursFeries` AS || | select sql_no_cache `Compagnie``comp` AS || | `comp``Compagnie``nrue` AS || | `nrue``Compagnie``rue` AS || | `rue``Compagnie``ville` AS || | `ville``Compagnie``nomComp` AS `nomComp` || | from `Compagnie` where || | (date_format(sysdate()_latin1W) in || | (_latin1Sunday_latin1Saturday)) |+-----------------------------+-----------------------------------------------+

Suppression drsquoune vue (DROP VIEW)

Vous devez posseacuteder le privilegravege DROP sur une vue pour pouvoir la supprimer

La suppression drsquoune vue nrsquoentraicircne pas la destruction des donneacutees qui reacutesident toujours dansles tables

La syntaxe SQL est la suivante

DROP VIEW [IF EXISTS]

[nomBase]nomVue [nomBase2]nomVue2

[RESTRICT | CASCADE]

IF EXISTS eacutevite une erreur dans le cas ougrave la vue nrsquoexiste pas

RESTRICT et CASCADE ne sont pas encore opeacuterationnels il concerneront probablement lareacutepercussion de la suppression entre vues interdeacutependantes

4055_05_C05 Page 189 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

190 copy Eacuteditions Eyrolles

Dictionnaire des donneacutees

Le dictionnaire des donneacutees (metadata ou data dictionary) est une partie majeure drsquoune basede donneacutees MySQL qursquoon peut assimiler agrave une structure centraliseacutee

Pour MySQL 16 vues sont issues de tables systegraveme non visibles Ces vues qui sont appeleacuteestables par abus de langage (dans la documentation officielle dans les livres et sur les forums1)et qui sont situeacutees dans la base INFORMATION_SCHEMA suffisent agrave stocker toutes lesinformations deacutecrivant tous les objets contenus dans toutes les bases de donneacutees MySQL serapproche davantage de DB2 et de SQL Server que drsquoOracle (qui possegravede 600 vues) Lesnoms des vues sont similaires et se rapprochent de la speacutecification ANSIISO SQL2003standard Part 11 Schemata

Constitution

Le dictionnaire des donneacutees contient

la deacutefinition des tables vues index seacutequences proceacutedures fonctions et deacuteclencheurs

la description de lrsquoespace disque alloueacute et occupeacute par chaque objet

les valeurs par deacutefaut des colonnes (DEFAULT)

la description des contraintes drsquointeacutegriteacute reacutefeacuterentielle (de veacuterification agrave venir)

le nom des utilisateurs de la base

les privilegraveges pour chaque utilisateur

des informations drsquoaudit (accegraves aux objets) et drsquoautre nature (commentaires par exemple)

Toutes les tables du dictionnaire des donneacutees ne sont accessibles qursquoen lecture seulementElles appartiennent agrave la base de donneacutees INFORMATION_SCHEMA Lrsquointerrogation du diction-naire des donneacutees est permise agrave tout utilisateur (qui ne verra que les objets qui lui sont toute-fois accessibles avec ses propres privilegraveges) et peut se faire au travers de requecirctes SELECT oupar le biais de la commande SHOW

Toutes les informations contenues dans les tables du dictionnaire des donneacutees sont codeacutees enminuscules

Le dictionnaire des donneacutees est mis automatiquement agrave jour apregraves chaque instruction SQL duLMD (INSERT UPDATE DELETE LOCK TABLE)

Les avantages drsquointerroger le dictionnaire des donneacutees par des requecirctes sont les suivants

1 Je conserve le vocable de laquo vue raquo pour ecirctre plus pregraves de la reacutealiteacute Cependant parler de table ou de vue est eacutequiva-lent puisqursquoelles sont interrogeables de la mecircme maniegravere par SELECT

4055_05_C05 Page 190 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 191

chapitre ndeg 5 Controcircle des donneacutees

Conforme aux regravegles drsquoEF Codd (le pegravere du modegravele relationnel) toutes les manipula-tions sont reacutealiseacutees agrave lrsquoaide des opeacuterateurs relationnels sur des tables

Inutile drsquoapprendre de nouvelles instructions (SHOW paramegravetres) proprieacutetaires deMySQL La migration vers un autre SGBD est ainsi faciliteacutee

Les possibiliteacutes drsquoextraction sont quasiment illimiteacutees du fait du grand nombre de tables etde jointures (ou drsquoautres opeacuterateurs) possible

Vous avez tellement souffert au chapitre 4 que vous avez ici lrsquooccasion de mettre agravelrsquoeacutepreuve vos connaissances dans un contexte plus laquo systegraveme raquo

Modegravele graphique du dictionnaire des donneacutees

Le diagramme suivant ndash qui srsquoapparente plus au niveau logique car les cleacutes eacutetrangegraveresapparaissent ndash tireacute de httpmysqldevelopmentcom deacutecrit la structure des vues du diction-naire des donneacutees

Deacutemarche agrave suivre

La deacutemarche agrave suivre afin drsquointerroger correctement le dictionnaire des donneacutees agrave propos drsquounobjet est la suivante

trouver le nom de la vue (ou des vues) pertinente(s) agrave partir du scheacutema preacuteceacutedent

choisir les colonnes de la vue (ou des vues) agrave seacutelectionner (soit agrave partir du graphique soiten affichant la structure de la vue par la commande DESCRIBE)

interroger la vue (ou les vues) en exeacutecutant une instruction SELECT contenant les colonnesinteacuteressantes

Recherche du nom drsquoune vue

Il nrsquoy a pas de moyen automatique de trouver le nom de la vue pertinente Cela dit il nrsquoy en aque 16 et vous en aurez vite fait le tour

Choisir les colonnes

Le choix des colonnes drsquoune vue du dictionnaire des donneacutees srsquoeffectue apregraves avoir listeacute lastructure de cette vue (par DESCRIBE) Le nom de la colonne est en geacuteneacuteral assez parlantDans notre exemple la vue contient huit colonnes Il apparaicirct que la clause de deacutefinition dechaque vue est contenue dans la colonne VIEW_DEFINITION La colonne CHECK_OPTIONdoit indiquer en principe le fait que la vue est deacuteclareacutee avec une contrainte de veacuterificationMais quelle colonne renseigne donc le nom de ladite vue

4055_05_C05 Page 191 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

192 copy Eacuteditions Eyrolles

Figure 5-11 Modegravele graphique du dictionnaire des donneacutees

4055_05_C05 Page 192 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 193

chapitre ndeg 5 Controcircle des donneacutees

DESCRIBE INFORMATION_SCHEMAVIEWS

+-----------------+--------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-----------------+--------------+------+-----+---------+-------+

| TABLE_CATALOG | varchar(512) | YES | | NULL | |

| TABLE_SCHEMA | varchar(64) | NO | | | |

| TABLE_NAME | varchar(64) | NO | | | |

| VIEW_DEFINITION | longtext | NO | | | |

| CHECK_OPTION | varchar(8) | NO | | | |

| IS_UPDATABLE | varchar(3) | NO | | | |

| DEFINER | varchar(77) | NO | | | |

| SECURITY_TYPE | varchar(7) | NO | | | |

+-----------------+--------------+------+-----+---------+-------+

Interroger la vue

Lrsquointerrogation de la vue sur les colonnes choisies est lrsquoeacutetape finale de la recherche de donneacuteesdans le dictionnaire Il convient drsquoeacutecrire une requecircte monotable ou multitable (jointures) quiextrait des donneacutees contenues dans la vue Ces donneacutees sont en fait contenues dans des tablessystegraveme qui ne sont pas accessibles pour des raisons seacutecuritaires

Supposons que je sois root en local et que je deacutesire connaicirctre le nom lrsquoemplacement et lecaractegravere contraint de toutes les vues existantes

SELECT TABLE_SCHEMATABLE_NAMECHECK_OPTION FROM INFORMATION_SCHEMAVIEWS+--------------+-----------------------------+--------------+| TABLE_SCHEMA | TABLE_NAME | CHECK_OPTION |+--------------+-----------------------------+--------------+| bdnouvelle | VueDesSocietes | NONE || bdsoutou | VueDesPilotesJoursOuvrables | CASCADED |+--------------+-----------------------------+--------------+

Si jrsquoavais voulu connaicirctre les vues contenues seulement dans la base bdsoutou il suffisaitdrsquoajouter la condition (WHERE TABLE_SCHEMA=bdsoutou)

Vous pouvez noter que MySQL utilise

La colonne TABLE_SCHEMA pour deacutesigner une database

La colonne TABLE_NAME pour stocker le nom de chaque vue des diffeacuterents scheacutemas Ici lanorme SQL doit y ecirctre pour quelque chose (Oracle nomme la colonne VIEW_NAME)

La colonne CHECK_OPTION pour indiquer le caractegravere restreint de chaque vue (lapremiegravere nrsquoest pas restreinte la seconde lrsquoest)

Classification des vues

Le tableau suivant classifie les vues selon leur fonctionnaliteacute Notez qursquoaucune redondance nide synonyme nrsquoexistent (si vous voulez reacutealiser une extraction pour deacutecouvrir quelque choseil nrsquoy aura pas beaucoup de requecirctes diffeacuterentes possibles)

4055_05_C05 Page 193 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

194 copy Eacuteditions Eyrolles

Interrogeons agrave preacutesent quelques-unes de ces vues dans le cadre drsquoexemples concrets

Bases de donneacutees du serveur

La requecircte suivante interroge la vue SCHEMATA et permet de retrouver les caracteacuteristiques(jeux de caractegraveres) des bases de donneacutees heacutebergeacutees par le serveur

SELECT SCHEMA_NAME AS Base de donnees

AS Jeu caracteres

AS Collation

FROM INFORMATION_SCHEMASCHEMATA

+--------------------+----------------+-------------------+

| Base de donnees | Jeu caracteres | Collation |

+--------------------+----------------+-------------------+

| information_schema | utf8 | utf8_general_ci |

| bdnouvelle | ascii | ascii_general_ci |

| bdsoutou | latin1 | latin1_swedish_ci |

| mysql | latin1 | latin1_swedish_ci |

| test | latin1 | latin1_swedish_ci |

+--------------------+----------------+-------------------+

Tableau 5-25 Vues du dictionnaire des donneacutees

Nature de lrsquoobjet Vues

Serveur SCHEMATA caracteacuteristiques du serveur (jeux de caractegraveres utiliseacutes)CHARACTER_SETS informations sur les colonnes pour lesquelles lrsquoutilisa-teur a reccedilu une autorisationCOLLATIONS et COLLATION_CHARACTER_SET_APPLICABILITY rela-tifs aux jeux de caractegraveres

Privilegraveges SCHEMA_PRIVILEGES liste des preacuterogatives au niveau databaseTABLE_PRIVILEGES liste des preacuterogatives au niveau tableUSER_PRIVILEGES liste des preacuterogatives au niveau userCOLUMN_PRIVILEGES liste des preacuterogatives au niveau columns

Tables et seacutequences TABLES caracteacuteristiques des tables (et seacutequences) dans les bases

Colonnes COLUMNS colonnes des tables et vues

Index STATISTICS description des index

Contraintes TABLE_CONSTRAINTS deacutefinition des contraintes de tablesKEY_COLUMN_USAGE composition des contraintes (colonnes)

Vues VIEWS description des vues

Sous-programmes ROUTINES description des sous-programmes stockeacutesTRIGGERS description des deacuteclencheurs

DEFAULT_CHARACTER_SET_NAME

DEFAULT_COLLATION_NAME

4055_05_C05 Page 194 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 195

chapitre ndeg 5 Controcircle des donneacutees

Notez que MySQL utilise

la colonne DEFAULT_CHARACTER_SET_NAME pour deacutesigner le jeu de caractegraveres drsquounedatabase Le dictionnaire est lui-mecircme codeacute en utf8

la colonne DEFAULT_COLLATION_NAME pour deacutesigner la collation du jeu de caractegraveres

Les colonnes CATALOG_NAME et SQL_PATH ne sont pas encore renseigneacutees Elles proviennenttoutes deux de la speacutecification de la norme SQL La premiegravere est relative au concept descheacutema (qursquoon peut assimiler agrave une collection de bases) et la seconde concerne un nom sym-bolique qursquoon pourrait associer agrave une routine (sous-programme)

Composition drsquoune base

La requecircte suivante interroge la vue TABLES et deacutecrit la composition des bases de donneacuteesutilisateur (jrsquoai filtreacute volontairement les lignes qui correspondent aux bases de MySQL)

SELECT TABLE_SCHEMATABLE_NAME FROM INFORMATION_SCHEMATABLES WHERE TABLE_SCHEMA NOT IN (information_schematestmysql)+--------------+-----------------------------+------------+-------------------+| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | DATE(CREATE_TIME) |+--------------+-----------------------------+------------+-------------------+| bdnouvelle | VueDesSocietes | VIEW | NULL || bdsoutou | Installer | BASE TABLE | 2005-11-30 || bdsoutou | Logiciel | BASE TABLE | 2005-11-30 || bdsoutou | PCSeuls | BASE TABLE | 2005-11-30 || bdsoutou | Pilote | BASE TABLE | 2005-11-30 || bdsoutou | Poste | BASE TABLE | 2005-11-30 || bdsoutou | Salle | BASE TABLE | 2005-11-30 || bdsoutou | Segment | BASE TABLE | 2005-11-30 || bdsoutou | Softs | BASE TABLE | 2005-11-30 || bdsoutou | Types | BASE TABLE | 2005-11-30 || bdsoutou | VueDesPilotesJoursOuvrables | VIEW | NULL |+--------------+-----------------------------+------------+-------------------+

Vous pouvez remarquer que MySQL utilise

la colonne TABLE_TYPE pour deacutesigner le type de la structure de stockage (les tablestemporaires si elles existent nrsquoapparaissent pas)

la colonne CREATE_TIME pour deacutesigner la date de creacuteation de lrsquoobjet

Deacutetail de stockage drsquoune base

En utilisant la mecircme vue du dictionnaire inteacuteressons-nous agrave la table Installer dans la basebdsoutou qui fait partie du scheacutema des exercices de ce livre La requecircte suivante extrait desinformations inteacuteressantes

TABLE_TYPEDATE(CREATE_TIME)

4055_05_C05 Page 195 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

196 copy Eacuteditions Eyrolles

SELECT FROM INFORMATION_SCHEMATABLES WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+--------+----------------+------------+----------------+-------------+| ENGINE | AUTO_INCREMENT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |+--------+----------------+------------+----------------+-------------+| InnoDB | 15 | 14 | 1170 | 16384 |+--------+----------------+------------+----------------+-------------+

Notez que MySQL utilise

la colonne ENGINE pour deacutesigner le type de moteur de stockage de la table en question

la colonne AUTO_INCREMENT pour deacutesigner la prochaine valeur de la seacutequence

la colonne TABLE_ROWS pour donner le nombre drsquoenregistrements de la table (ici crsquoestbien coheacuterent avec la seacutequence qui fait office de cleacute primaire)

la colonne AVG_ROW_LENGTH pour deacutesigner la taille moyenne drsquoune ligne en octets

la colonne DATA_LENGTH pour deacutesigner la taille de la table en octets

Citons pour en terminer avec cette vue les colonnes

TABLE_COLLATION qui indique le jeu de caractegraveres de la table

TABLE_COMMENT qui renseigne notamment agrave propos des reacutefeacuterences entre tables par lescleacutes eacutetrangegraveres

Structure drsquoune table

Inteacuteressons-nous agrave preacutesent agrave la vue COLUMNS qui deacutecrit la structure des tables au niveaucolumn level

Structure au premier niveau

La requecircte suivante deacutecrit en partie la table Installer Notez que ccedila ressemble assez auDESCRIBE (normal car lrsquoinstruction a eacuteteacute programmeacutee agrave lrsquoaide drsquoune requecircte analogue)

SELECT FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+-------------+-----------+------------------+-------------------+------------+| COLUMN_NAME | DATA_TYPE | ORDINAL_POSITION | COLUMN_DEFAULT | COLUMN_KEY |+-------------+-----------+------------------+-------------------+------------+| nPoste | varchar | 1 | NULL | || nLog | varchar | 2 | NULL | || numIns | int | 3 | NULL | PRI || dateIns | timestamp | 4 | CURRENT_TIMESTAMP | || delai | time | 5 | NULL | |+-------------+-----------+------------------+-------------------+------------+

ENGINEAUTO_INCREMENTTABLE_ROWSAVG_ROW_LENGTHDATA_LENGTH

COLUMN_NAMEDATA_TYPEORDINAL_POSITIONCOLUMN_DEFAULTCOLUMN_KEY

4055_05_C05 Page 196 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 197

chapitre ndeg 5 Controcircle des donneacutees

Remarquez que MySQL utilise

COLUMN_NAME pour renseigner le nom de chaque colonne

DATA_TYPE pour donner le typeMySQL

ORDINAL_POSITION pour renseigner lrsquoordre des colonnes dans la table (utiliseacute en cas deSELECT )

COLUMN_DEFAULT pour preacuteciser la valeur par deacutefaut de chaque colonne

COLUMN_KEY pour donner la composition de la cleacute primaire

Extraction des colonnes caractegraveres

La requecircte suivante deacutecrit en deacutetail les colonnes chaicircnes de caractegraveres de la table Installer

SELECT AS Taille max FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer AND NUMERIC_PRECISION IS NULL AND DATA_TYPE NOT IN (timestamptimedate)+-------------+-----------+------------+-------------+| COLUMN_NAME | DATA_TYPE | Taille max | IS_NULLABLE |+-------------+-----------+------------+-------------+| nPoste | varchar | 7 | YES || nLog | varchar | 5 | YES |+-------------+-----------+------------+-------------+

Vous pouvez noter que MySQL utilise

IS_NULLABLE pour renseigner le fait qursquoune colonne puisse ecirctre nulle

CHARACTER_OCTET_LENGTH pour renseigner la taille des chaicircnes de caractegraveres pourchaque colonne

Extraction des colonnes numeacuteriques

La requecircte suivante deacutetaille les colonnes numeacuteriques de la table Installer

SELECT COLUMN_NAMEDATA_TYPE AS Taille max

AS Preacutecision

FROM INFORMATION_SCHEMACOLUMNS

WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer

AND CHARACTER_MAXIMUM_LENGTH IS NULL

AND DATA_TYPE NOT IN (timestamptimedate)

+-------------+-----------+------------+-----------+

| COLUMN_NAME | DATA_TYPE | Taille max | Preacutecision |

+-------------+-----------+------------+-----------+

| numIns | int | 10 | 0 |

+-------------+-----------+------------+-----------+

COLUMN_NAMEDATA_TYPECHARACTER_OCTET_LENGTH IS_NULLABLE

NUMERIC_PRECISION

NUMERIC_SCALE

4055_05_C05 Page 197 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

198 copy Eacuteditions Eyrolles

Vous pouvez notez que MySQL utilise

NUMERIC_PRECISION pour renseigner la taille des numeacuteriques pour chaque colonne

NUMERIC_SCALE pour renseigner la preacutecision des numeacuteriques

Extraction des colonnes date-heure

La requecircte suivante extrait toutes les colonnes de type date-heure de la table Installer

SELECT COLUMN_NAMEDATA_TYPECOLUMN_DEFAULT

FROM INFORMATION_SCHEMACOLUMNS

WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer

AND CHARACTER_MAXIMUM_LENGTH IS NULL

AND )

+-------------+-----------+-------------------+

| COLUMN_NAME | DATA_TYPE | COLUMN_DEFAULT |

+-------------+-----------+-------------------+

| dateIns | timestamp | CURRENT_TIMESTAMP |

| delai | time | NULL |

+-------------+-----------+-------------------+

Citons pour en terminer avec cette vue les colonnes

CHARACTER_SET_NAME et COLLATION_NAME qui renseignent sur le jeu de caractegraverespour chaque colonne de la table

COLUMN_COMMENT qui renseigne sur les eacuteventuels commentaires sur chaque colonne

Recherche des contraintes drsquoune table

La vue TABLE_CONSTRAINTS deacutecrit la nature des contraintes La requecircte suivante deacutetailleles contraintes contenues dans la table Installer de la base bdsoutou

SELECT FROM INFORMATION_SCHEMATABLE_CONSTRAINTS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+-------------------+----------------------------+-----------------+| CONSTRAINT_SCHEMA | CONSTRAINT_NAME | CONSTRAINT_TYPE |+-------------------+----------------------------+-----------------+| bdsoutou | PRIMARY | PRIMARY KEY || bdsoutou | un_installation | UNIQUE || bdsoutou | fk_Installer_nLog_Logiciel | FOREIGN KEY || bdsoutou | fk_Installer_nPoste_Poste | FOREIGN KEY |+-------------------+----------------------------+-----------------+

MySQL utilise

CONSTRAINT_SCHEMA pour indiquer la base de donneacutees qui contient la contrainte (quipeut ecirctre situeacutee dans une autre base de donneacutees que la table elle-mecircme)

DATA_TYPE IN (timestamptimedate

CONSTRAINT_SCHEMACONSTRAINT_NAMECONSTRAINT_TYPE

4055_05_C05 Page 198 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 199

chapitre ndeg 5 Controcircle des donneacutees

CONSTRAINT_NAME pour renseigner le nom de la contrainte Notez ici que MySQLnrsquoextrait pas le nom de ma contrainte (pk_Installer) sans doute est-ce le fait qursquoelleest deacuteclareacutee eacutegalement AUTO_INCREMENT

CONSTRAINT_TYPE pour renseigner le type de chaque contrainte

La valeur CHECK dans la colonne CONSTRAINT_TYPE nrsquoest pas encore prise en charge Vouspouvez toutefois creacuteer des tables avec des contraintes CHECK rien ne se passera si vousinseacuterez des donneacutees non valides et le dictionnaire restera coheacuterent en nrsquoextrayant pas cesinformations

Composition des contraintes drsquoune table

La vue KEY_COLUMN_USAGE deacutecrit la composition des contraintes

Positions

La requecircte suivante permet drsquoextraire la composition des contraintes de la table Installerdans la base bdsoutou et en particulier celle de lrsquouniciteacute du couple (nPostenLog)

SELECT CONSTRAINT_NAME COLUMN_NAME AS Position

AS Position index FROM INFORMATION_SCHEMAKEY_COLUMN_USAGE WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+----------------------------+-------------+----------+----------------+| CONSTRAINT_NAME | COLUMN_NAME | Position | Position index |+----------------------------+-------------+----------+----------------+| PRIMARY | numIns | 1 | NULL || un_installation | nPoste | 1 | NULL || un_installation | nLog | 2 | NULL || fk_Installer_nLog_Logiciel | nLog | 1 | 1 || fk_Installer_nPoste_Poste | nPoste | 1 | 1 |+----------------------------+-------------+----------+----------------+

MySQL utilise

ORDINAL_POSITION qui indique la position de la colonne dans la contrainte (deacutebutantagrave 1)

POSITION_IN_UNIQUE_CONSTRAINT est eacutevalueacutee agrave NULL pour les index (unique et cleacuteprimaire) Pour les cleacutes eacutetrangegraveres composites elle indique la position de la colonne dansla contrainte

Deacutetails des contraintes reacutefeacuterentielles

Cette mecircme vue permet eacutegalement de retrouver la nature de la reacutefeacuterence pour chaque cleacuteeacutetrangegravere

ORDINAL_POSITION

POSITION_IN_UNIQUE_CONSTRAINT

4055_05_C05 Page 199 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

200 copy Eacuteditions Eyrolles

SELECT CONSTRAINT_NAME COLUMN_NAME AS Cle AS Base cible

AS Table pere

AS Col pere FROM INFORMATION_SCHEMAKEY_COLUMN_USAGE WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer AND REFERENCED_TABLE_SCHEMA IS NOT NULL+----------------------------+--------+------------+------------+----------+| CONSTRAINT_NAME | Cle | Base cible | Table pere | Col pere |+----------------------------+--------+------------+------------+----------+| fk_Installer_nLog_Logiciel | nLog | bdsoutou | logiciel | nLog || fk_Installer_nPoste_Poste | nPoste | bdsoutou | poste | nPoste |+----------------------------+--------+------------+------------+----------+

MySQL utilise

REFERENCED_TABLE_SCHEMA qui indique la base de donneacutees heacutebergeant la tablelaquo pegravere raquo Ici la base donneacutees contient les tables laquo fils raquo et laquo pegraveres raquo mais il se peut que cestables soient dans deux bases distinctes

REFERENCED_TABLE_NAME qui indique le nom de la table laquo pegravere raquo

REFERENCED_COLUMN_NAME qui indique le nom de la colonne reacutefeacuterenceacutee dans la tablelaquo pegravere raquo Ici les noms des colonnes des tables laquo fils raquo et laquo pegravere raquo sont identiques mais il sepeut qursquoils diffegraverent

Recherche du code source drsquoun sous-programme

La vue ROUTINES deacutecrit la composition des sous-programmes (proceacutedures et fonctions cata-logueacutees) La requecircte suivante permet drsquoextraire le code source des sous-programmes stockeacutesdans la base test

SELECT FROM INFORMATION_SCHEMAROUTINES WHERE ROUTINE_SCHEMA = test+--------------+--------------+-----------------------------------------------+| ROUTINE_NAME | ROUTINE_TYPE | ROUTINE_DEFINITION |+--------------+--------------+-----------------------------------------------+| sp1 | PROCEDURE | BEGIN DECLARE v_brevet CHAR(6) SET v_brevet = PROC END || sp2 | FUNCTION | BEGIN DECLARE v_brevet CHAR(3) SET v_brevet = FCT RETURN v_brevet END |+--------------+--------------+-----------------------------------------------+

REFERENCED_TABLE_SCHEMA

REFERENCED_TABLE_NAME

REFERENCED_COLUMN_NAME

ROUTINE_NAMEROUTINE_TYPEROUTINE_DEFINITION

4055_05_C05 Page 200 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 201

chapitre ndeg 5 Controcircle des donneacutees

MySQL utilise

ROUTINE_SCHEMA qui indique le nom de la base heacutebergeant le sous-programme

ROUTINE_NAME qui indique le nom du sous-programme

ROUTINE_TYPE qui indique la nature du sous-programme

ROUTINE_DEFINITION qui liste le code MySQL du sous-programme

Citons pour en terminer avec cette vue les colonnes

SECURITY_TYPE qui renseigne sur les privilegraveges associeacutes agrave la vue lors de son exeacutecution(soit les privilegraveges de lrsquoutilisateur creacuteateur definer soit ceux de lrsquoutilisateur qui lancelrsquoexeacutecution invoker)

CREATED et LAST_ALTERED pour stocker la date de creacuteation du sous-programme etlrsquoinstant de la derniegravere compilation

DEFINER qui indique lrsquoidentiteacute de lrsquoutilisateur qui a creacuteeacute le sous-programme

ROUTINE_COMMENT qui stocke un eacuteventuel commentaire relatif au sous-programme(initialiseacute lors de la compilation)

Privilegraveges des utilisateurs drsquoune base de donneacutees

On retrouve les diffeacuterents niveaux de privilegraveges eacutetudieacutes en deacutebut de chapitre

Au niveau global

La vue USER_PRIVILEGES liste les privilegraveges des accegraves utilisateurs au niveau global (lesdonneacutees viennent de la table mysqluser) La requecircte suivante extrait les privilegraveges dePaul et de Jules (en accegraves distant ou en local) Non vous ne recircvez pas trois simples quotessont neacutecessaires pour tester la valeur de la colonne GRANTEE

SELECT

FROM INFORMATION_SCHEMAUSER_PRIVILEGES

WHERE GRANTEE LIKE Paul OR GRANTEE LIKE Jules

+------------------------+----------------+--------------+

| GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE |

+------------------------+----------------+--------------+

| Paullocalhost | USAGE | NO |

| Juleslocalhost | USAGE | NO |

| Paul1921684173 | SELECT | NO |

| Paul1921684173 | CREATE | NO |

+------------------------+----------------+--------------+

GRANTEEPRIVILEGE_TYPEIS_GRANTABLE

4055_05_C05 Page 201 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

202 copy Eacuteditions Eyrolles

MySQL utilise

GRANTEE qui indique le nom de lrsquoaccegraves utilisateur

PRIVILEGE_TYPE qui indique le type du privilegravege

IS_GRANTABLE qui renseigne sur la possibiliteacute que lrsquoaccegraves utilisateur puisse retransmet-tre le privilegravege acquis (reccedilu avec WITH GRANT OPTION)

Au niveau database

La vue SCHEMA_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne TABLE_SCHEMA Celle-ci donne le nom de la base de donneacutees concerneacutee par lesprivilegraveges des accegraves utilisateurs (les donneacutees viennent de la table dbuser) La requecirctesuivante extrait les privilegraveges au niveau database de Paul en accegraves distant ou local

SELECT GRANTEEPRIVILEGE_TYPEIS_GRANTABLE FROM INFORMATION_SCHEMASCHEMA_PRIVILEGES WHERE GRANTEE LIKE Paul+--------------+------------------------+----------------+--------------+| TABLE_SCHEMA | GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE |+--------------+------------------------+----------------+--------------+| bdpaul | Paul1921684173 | SELECT | NO || bdpaul | Paullocalhost | DROP | NO || bdpaul | Paullocalhost | CREATE ROUTINE | NO |+--------------+------------------------+----------------+--------------+

Au niveau table

La vue TABLE_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne TABLE_NAME Celle-ci donne le nom de la table concerneacutee par les privilegraveges desaccegraves utilisateurs (les donneacutees viennent de la table mysqltables_priv) La requecirctesuivante extrait les privilegraveges au niveau table de Paul en accegraves distant ou local

SELECT AS BaseTable GRANTEEPRIVILEGE_TYPE AS Privilege FROM INFORMATION_SCHEMATABLE_PRIVILEGES WHERE GRANTEE LIKE Paul+--------------------------------------+------------------------+-----------+| | GRANTEE | Privilege |+--------------------------------------+------------------------+-----------+| bdsoutouVueDesCompagniesJoursFeries | Paullocalhost | SELECT || bdpaulLivre | Paul1921684173 | SELECT || bdpaulLivre | Paullocalhost | SELECT || bdpaulLivre | Paullocalhost | DELETE |+--------------------------------------+------------------------+-----------+

TABLE_SCHEMA

CONCAT(TABLE_SCHEMATABLE_NAME)

BaseTable

4055_05_C05 Page 202 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 203

chapitre ndeg 5 Controcircle des donneacutees

Au niveau column

La vue COLUMN_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne COLUMN_NAME Celle-ci preacutecise le nom de la colonne concerneacutee par les privilegravegesdes accegraves utilisateurs (les donneacutees viennent de la table mysql columns_priv) La requecirctesuivante extrait les privilegraveges au niveau column de Paul en accegraves distant ou local sur la basebdpaul

SELECT CONCAT(TABLE_NAME ) AS Tablecolonne

GRANTEEPRIVILEGE_TYPE AS Privilege

FROM INFORMATION_SCHEMACOLUMN_PRIVILEGES

WHERE TABLE_SCHEMA=bdpaul

+---------------+--------------------+-----------+

| Tablecolonne | GRANTEE | Privilege |

+---------------+--------------------+-----------+

| LivreISBN | Paullocalhost | UPDATE |

+---------------+--------------------+-----------+

Au niveau routine

Se reporter au niveau database

Commande SHOWLa commande SHOW permet drsquoextraire facilement des informations provenant du dictionnairedes donneacutees Elle est bien sucircr agrave lrsquoinverse plus limiteacutee que lrsquoeacutecriture drsquoune requecircte SELECT ndashqui pourra toujours extraire les mecircmes informations mais en interrogeant les vues adeacutequatesLa copie drsquoeacutecran suivante illustre la commande SHOW TABLES qui restitue une reacuteponse agrave laquestion laquo Quelles sont les tables et les vues preacutesentes dans la base de donneacutees en coursdrsquoutilisation raquo

COLUMN_NAME

Figure 5-12 Exemple de SHOW pour lister les tables drsquoun scheacutema

4055_05_C05 Page 203 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

204 copy Eacuteditions Eyrolles

Le tableau suivant deacutecrit quelques exemples qui vous seront peut-ecirctre utiles

Tableau 5-26 Exemples de SHOW

Commande Reacutesultat

SHOW COLUMNS FROM Installer FROM bdsoutou LIKE n

Liste des colonnes dont le nom commence parn dans la table Installer de la basebdsoutou

SHOW CREATE DATABASE bdsoutou Options de creacuteation de la base bdsoutou

SHOW CREATE TABLE bdsoutouInstaller Description totale de lrsquoinstruction permettant decreacuteer la table Installer de la base bdsou-tou

SHOW DATABASES Liste des bases preacutesentes sur le serveur

SHOW ENGINES Liste des moteurs de stockage utilisables sur leserveur

SHOW ERRORS Libelleacute de lrsquoerreur SQL courante

SHOW GRANTS FOR Paullocalhost Pour un accegraves utilisateur liste de ses privilegravegesaux niveaux global database column et rou-tine

SHOW INDEX FROM Installer FROM bdsoutou Description des index de la table Installerde la base bdsoutou

SHOW PRIVILEGES Liste de tous les privilegraveges possibles

SHOW TABLE STATUS FROM bdsoutou LIKE S

Caracteacuteristiques physiques des tables dont lenom commence par S dans la base bdsoutou

SHOW TABLES FROM mysql Liste des tables de la base mysql

SHOW TRIGGERS Caracteacuteristiques des deacuteclencheurs preacutesentssur le serveur

4055_05_C05 Page 204 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 205

chapitre ndeg 5 Controcircle des donneacutees

Exercices

Les objectifs de ces exercices sont

de creacuteer des vues monotables et multitables

drsquoinseacuterer des enregistrements dans des vues

drsquoeffectuer une mise agrave jour conditionneacutee via une vue

51 Vues monotables

Vues sans contraintes

Eacutecrire le script vuessql permettant de creacuteer

bull La vue LogicielsUnix qui contient tous les logiciels de type UNIX (toutes les colonnes sontconserveacutees) Veacuterifier la structure et le contenu de la vue (DESCRIBE et SELECT)

bull La vue Poste_0 de structure (nPos0 nomPoste0 nSalle0 TypePoste0 indIP ad0) quicontient tous les postes du rez-de-chausseacutee (etage=0 au niveau de la table Segment) Faireune jointure proceacutedurale sinon la vue sera consideacutereacutee comme une vue multitable Veacuterifier la struc-ture et le contenu de la vue

Inseacuterer deux nouveaux postes dans la vue tels qursquoun poste soit connecteacute au segment du rez-de-chausseacutee et lrsquoautre agrave un segment drsquoun autre eacutetage Veacuterifier le contenu de la vue et celui de la tableConclusion

Supprimer ces deux enregistrements de la table Poste

Reacutesoudre une requecircte complexe

Creacuteer la vue SallePrix de structure (nSalle nomSalle nbPoste prixLocation) quicontient les salles et leur prix de location pour une journeacutee (en fonction du nombre de postes) Lemontant de la location drsquoune salle agrave la journeacutee sera drsquoabord calculeacute sur la base de 100 euro par posteServez-vous de lrsquoexpression 100nbPoste dans la requecircte de deacutefinition

Veacuterifier le contenu de la vue puis afficher les salles dont le prix de location deacutepasse 150 euro

Ajouter la colonne tarif de type SMALLINT(4) agrave la table Types Mettre agrave jour cette table demaniegravere agrave inseacuterer les valeurs suivantes

Tableau 5-27 Tarifs des postes

Type du poste Tarif en euro

TX 50

PCWS 100

PCNT 120

UNIX 200

NC 80

BeOS 400

4055_05_C05 Page 205 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie I SQL de base

206 copy Eacuteditions Eyrolles

Creacuteer la vue SalleIntermediaire de structure (nSalle typePoste nombre tarif) detelle sorte que le contenu de la vue reflegravete le tarif ajusteacute des salles en fonction du nombre et du typedes postes de travail Il srsquoagit de grouper par salle type et tarif (tout en faisant une jointure avec la tableTypes pour les tarifs) et de compter le nombre de postes pour avoir le reacutesultat suivant

+--------+-----------+--------+-------+

| nSalle | typePoste | nombre | tarif |

+--------+-----------+--------+-------+

| s01 | TX | 2 | 50 |

| s01 | UNIX | 2 | 200 |

| s02 | PCWS | 2 | 100 |

| s03 | TX | 1 | 50 |

| |

Agrave partir de la vue SalleIntermediaire creacuteer la vue SallePrixTotal(nSalle PrixReel)qui reflegravete le prix reacuteel de chaque salle (par exemple la s01 sera factureacutee 250 + 1200 = 300 euro) Veacuteri-fier le contenu de cette vue

Afficher les salles les plus eacuteconomiques agrave la location

Vues avec contraintes

Remplacer la vue Poste0 en rajoutant lrsquooption de controcircle (CHECK OPTION) Tenter drsquoinseacuterer unposte appartenant agrave un eacutetage diffeacuterent du rez-de-chausseacutee

Creacuteer la vue Installer0 de structure (nPoste nLog dateIns) ne permettant de travaillerqursquoavec les postes du rez-de-chausseacutee tout en interdisant lrsquoinstallation drsquoun logiciel de type PCNTTenter drsquoinseacuterer deux postes dans cette vue ne correspondant pas agrave ces deux contraintes un postedrsquoun eacutetage puis un logiciel de type PCNT Inseacuterer lrsquoenregistrement p6 log2 qui doit passer agrave traversla vue

52 Vue multitable

Creacuteer la vue SallePoste de structure (nomSalle nomPoste adrIP nomTypePoste)permettant drsquoextraire toutes les installations sous la forme suivante

SELECT FROM SallePoste

+----------+----------+---------------+-------------------+

| nomSalle | nomPoste | adrIP | nomTypePoste |

+----------+----------+---------------+-------------------+

| Salle 1 | Poste 1 | 1301208001 | Terminal X-Window |

| Salle 1 | Poste 2 | 1301208002 | Systegraveme Unix |

| Salle 1 | Poste 3 | 1301208003 | Terminal X-Window |

| |

4055_05_C05 Page 206 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir

Partie II

Programmation proceacutedurale

4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

209

Chapitre 6

Bases du langage

de programmation

Ce chapitre deacutecrit les caracteacuteristiques geacuteneacuterales du langage proceacutedural de programmation deMySQL

structure drsquoun programme

deacuteclaration et affectation de variables

structures de controcircle (

si

tant que

reacutepeacuteter

pour

)

meacutecanismes drsquointeraction avec la base

programmation de transactions

Geacuteneacuteraliteacutes

Les structures de controcircle habituelles drsquoun langage (

IF

WHILE

hellip) ne font pas partie inteacute-grante de la norme SQL Elles apparaissent dans une sous-partie optionnelle de la norme(ISOIEC 9075-51996

Flow-control statements

) MySQL les prend en compte

Le langage proceacutedural de MySQL est une extension de SQL car il permet de faire cohabiterles habituelles structures de controcircle (

si

pour

et

tant que

pour les plus connues) avec desinstructions SQL (principalement

SELECT

INSERT

UPDATE

et

DELETE

)

Environnement client-serveur

Dans un environnement client-serveur chaque instruction SQL donne lieu agrave lrsquoenvoi drsquounmessage du client vers le serveur suivi de la reacuteponse du serveur vers le client Il est preacutefeacuterablede travailler avec un sous-programme (qui sera stockeacute en fait cocircteacute serveur) plutocirct qursquoavecune suite drsquoinstructions SQL susceptibles drsquoencombrer le trafic reacuteseau En effet un bloc donnelieu agrave un seul eacutechange sur le reacuteseau entre le client et le serveur Les reacutesultats intermeacutediairessont traiteacutes cocircteacute serveur et seul le reacutesultat final est retourneacute au client

4055_06_C06 Page 209 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

210

copy Eacuteditions Eyrolles

Avantages

Les principaux avantages drsquoutiliser des sous-programmes (proceacutedures ou fonctions catalo-gueacutees qui sont stockeacutees cocircteacute serveur) sont

La modulariteacute un sous-programme peut ecirctre composeacute drsquoautres blocs drsquoinstructions Unsous-programme peut aussi ecirctre reacuteutilisable car il peut ecirctre appeleacute par un autre

La portabiliteacute un sous-programme est indeacutependant du systegraveme drsquoexploitation qui heacutebergele serveur MySQL En changeant de systegraveme les applicatifs nrsquoont pas agrave ecirctre modifieacutes

Lrsquointeacutegration avec les donneacutees des tables on retrouvera avec ce langage proceacutedural tousles types de donneacutees et drsquoinstructions disponibles sous MySQL des meacutecanismes pourparcourir des reacutesultats de requecirctes (curseurs) pour traiter des erreurs (

handlers

) et pourprogrammer des transactions (

COMMIT

ROLLBACK

SAVEPOINT

)

La seacutecuriteacute car les sous-programmes srsquoexeacutecutent dans un environnement

a priori

seacutecuriseacute(SGBD) ougrave il est plus facile de garder la maicirctrise sur les ordres SQL exeacutecuteacutes et donc surles agissements des utilisateurs

Structure drsquoun bloc

Un bloc drsquoinstructions est composeacute de

BEGIN

(section obligatoire) contient le code incluant ou non des directives SQL se termi-nant par le symbole laquo raquo

DECLARE

(directive optionnelle) deacuteclare une variable un curseur une exception etc

END

ferme le bloc

Un bloc peut ecirctre imbriqueacute dans un autre bloc Pour tester un bloc nous verrons dans lasection

Tests des exemples

qursquoil faut lrsquoinclure dans une proceacutedure catalogueacutee MySQL neprend pas encore en charge les proceacutedures anonymes (sans nom)

Figure 6-1

Trafic sur le reacuteseau drsquoinstructions SQL

CALL Bloc

SGBDExeacutecution globale

SELECT hellip

UPDATE hellip

INSERT INTO helliphellip

SGBDExeacutecution requecircte par requecircte

Client

Bloc

Suitedrsquoinstructions Serveur

BEGINSELECT hellip

UPDATE hellip

INSERT INTOhelliphellipEND

4055_06_C06 Page 210 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

211

chapitre ndeg 6 Bases du langage de programmation

Porteacutee des objets

La porteacutee drsquoun objet (variable curseur ou exception) est la zone du programme qui peut yacceacuteder Un objet deacuteclareacute dans un bloc est accessible dans les sous-blocs En revanche unobjet deacuteclareacute dans un sous-bloc nrsquoest pas visible du bloc supeacuterieur (principe des accolades deslangages C et Java)

Casse et lisibiliteacute

Comme SQL les sous-programmes sont capables drsquointerpreacuteter les caractegraveres alphanumeacuteri-ques du jeu de caractegraveres seacutelectionneacute Aucun objet manipuleacute par programme nrsquoest sensible agrave lacasse (

not case sensitive

) Ainsi

numeroBrevet

et

NumeroBREVET

deacutesignent le mecircmeidentificateur (tout est traduit en minuscules au niveau du dictionnaire des donneacutees) Lesregravegles drsquoeacutecriture classiques concernant lrsquoindentation et les espaces entre variables mots-cleacuteset instructions doivent ecirctre respecteacutees dans un souci de lisibiliteacute

Figure 6-2

Structure drsquoun bloc drsquoinstructions MySQL

BEGIN[DECLARE deacuteclaration]hellip-- codehellip

hellipEND

BEGIN[DECLARE deacuteclaration ]-- codehellipEND

BEGIN[DECLARE deacuteclaration ]-- codehellipEND

Figure 6-3

Visibiliteacute des objets

BEGINDECLARE v_brevet CHAR(6)hellip-- v_brevet accessible

hellip

END

BEGINDECLARE v_nom VARCHAR (20)-- v_brevet et v_nom accessibleshellipEND

v_nom inaccessible

Tableau 6-1 Lisibiliteacute du code

Peu lisible Crsquoest mieux

IF xgty THEN SET max=xELSE SET max=yEND IF IF xgty THEN SET max=xELSE SET max=yEND IF

4055_06_C06 Page 211 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

212

copy Eacuteditions Eyrolles

Identificateurs

Avant de parler des diffeacuterents types de variables MySQL deacutecrivons comment il est possiblede nommer les objets des sous-programmes Un identificateur commence par une lettre (ou unchiffre) Un identificateur nrsquoest pas limiteacute en nombre de caractegraveres Les autres signes pourtantconnus du langage sont interdits comme le montre le tableau suivant

Commentaires

MySQL prend en charge deux types de commentaires monolignes commenccedilant au symbolelaquo

--

raquo et finissant agrave la fin de la ligne et multilignes commenccedilant par laquo

raquo

et finissant parlaquo

raquo

Le tableau suivant deacutecrit quelques exemples

Variables

Un sous-programme est capable de manipuler des variables qui sont deacuteclareacutees (et eacuteventuelle-ment initialiseacutees) par la directive

DECLARE

Ces variables permettent de transmettre desvaleurs agrave des sous-programmes via des paramegravetres ou drsquoafficher des eacutetats de sortie souslrsquointerface Deux types de variables sont disponibles sous MySQL

scalaires recevant une seule valeur drsquoun type SQL (ex colonne drsquoune table)

externes deacutefinies dans la session et qui peuvent servir de paramegravetres drsquoentreacutee ou de sortie

Tableau 6-2 Identificateurs

Autoriseacutes Interdits

t2code_brevet2nombresMysql_t

moiamptoi

(symbole laquo amp raquo)

debit-credit

(symbole laquo - raquo)

onoff

(symbole laquo raquo)

code brevet

(symbole espace)

Tableau 6-3 Commentaires

Sur une ligne Sur plusieurs lignes

SELECT nbHVol INTO v_nbHVol FROM Pilote WHERE nom = Gratien VielSET v_bonus = v_nbHVol015

SELECT salaire INTO v_salaire FROM Pilote

WHERE nom = Thierry Albaric

SET v_bonus = v_salaire015

-- Lecture de la table Pilote

ndash- Extraction heures de vol

-- Calcul

Lecture de la table Pilote

Extraction du salairepour calculer le bonus

Calcul

4055_06_C06 Page 212 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

213

chapitre ndeg 6 Bases du langage de programmation

Variables scalaires

La deacuteclaration drsquoune variable scalaire est de la forme suivante

DECLARE

nomVariable1

[

nomVariable2

]

typeMSQL

[DEFAULT

expression

]

DEFAULT

permet drsquoinitialiser la (ou les) variable(s) ndash pas forceacutement agrave lrsquoaide drsquoune cons-tante Le tableau suivant deacutecrit quelques exemples

Affectations

Il existe plusieurs possibiliteacutes pour affecter une valeur agrave une variable

lrsquoaffectation comme on la connaicirct dans les langages de programmation (

SET

variable

expression) Vous pouvez aussi utiliser le symbole laquo = raquo mais il est plus prudentde le reacuteserver agrave la programmation de conditions

la directive DEFAULT

la directive INTO drsquoune requecircte (SELECT hellip INTO variable FROM hellip)

Restrictions

Le type tableau (array) nrsquoest pas encore preacutesent dans le langage de MySQL Cela peut ecirctrepeacutenalisant quand on deacutesire travailler en interne avec des reacutesultats drsquoextractions de taillemoyenne

Il est impossible drsquoutiliser un identificateur dans une expression srsquoil nrsquoest pas deacuteclareacute au preacutea-lable Ici la deacuteclaration de la variable v_maxi est incorrecte

DECLARE v_maxi INT DEFAULT 2 v_mini

DECLARE v_mini INT DEFAULT 15

Tableau 6-4 Deacuteclarations

Deacuteclarations Commentaires

DECLARE v_dateNaissance DATE Deacuteclare la variable sans lrsquoinitialiser Eacutequivalent agrave SET v_dateNaissance = NULL

DECLARE v_capacite SMALLINT(4) DEFAULT 999 Initialise la variable agrave 999

DECLARE v_trouve BOOLEAN DEFAULT TRUE Initialise la variable agrave vrai (1)

DECLARE v_Dans2jours DATE DEFAULT ADDDATE(SYSDATE()2)

Initialise la variable agrave dans 2 jours

=

4055_06_C06 Page 213 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

214 copy Eacuteditions Eyrolles

Comme la plupart des langages reacutecents les deacuteclarations multiples sont permises Celle qui suitest juste

DECLARE INT

Reacutesolution de noms

Lors des conflits potentiels de noms (variables ou colonnes) dans des instructions SQL (prin-cipalement INSERT UPDATE DELETE et SELECT) le nom de la variable est prioritairementinterpreacuteteacute au deacutetriment de la colonne de la table (de mecircme nom)

Dans lrsquoexemple suivant lrsquoinstruction DELETE supprime tous les pilotes de la table (et non passeulement le pilote de nom Placide Fresnais) car MySQL considegravere les deux identificateurscomme eacutetant la mecircme variable et non pas comme colonne de la table et variable

DECLARE nom VARCHAR(16) DEFAULT Placide Fresnais

DELETE FROM Pilote WHERE

Pour se preacutemunir de tels effets de bord une seule solution existe elle consiste agrave nommertoutes les variables diffeacuteremment des colonnes (en utilisant un preacutefixe par exemple) Uneautre solution serait drsquoutiliser une eacutetiquette de bloc (block label) pour lever drsquoeacuteventuellesambiguiumlteacutes Bien qursquoil soit possible drsquoemployer des eacutetiquettes de blocs (aussi disponibles pourles structures de controcircle) on ne peut pas encore preacutefixer des variables pour en distinguer unede mecircme nom entre diffeacuterents blocs

Opeacuterateurs

Les opeacuterateurs SQL eacutetudieacutes au chapitre 4 (logiques arithmeacutetiques de concateacutenationhellip) sontdisponibles au sein drsquoun sous-programme Les regravegles de prioriteacute sont les mecircmes que dans lecas de SQL

Lrsquoopeacuterateur IS NULL permet de tester une formule avec la valeur NULL Toute expressionarithmeacutetique contenant une valeur nulle est eacutevalueacutee agrave NULL

Le tableau suivant illustre quelques utilisations possibles drsquoopeacuterateurs logiques

i j k

nom = nom

Tableau 6-5 Eacuteviter les ambiguiumlteacutes

Preacutefixer les variables Eacutetiquette de bloc (preacutefixe pas opeacuterationnel)

DECLARE v_nom VARCHAR(16) DEFAULT Placide FresnaishellipDELETE FROM Pilote WHERE --ouDELETE FROM Pilote WHERE

DECLARE nom VARCHAR(16) DEFAULT Placide Fresnais DELETE FROM Pilote WHERE principalnom = nom

nom = v_nom

v_nom = nom

principal BEGIN

END principal

4055_06_C06 Page 214 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 215

chapitre ndeg 6 Bases du langage de programmation

Variables de session

Il est possible de passer en paramegravetres drsquoentreacutee drsquoun bloc des variables externes Ces variablessont dites de session (user variables) Elles nrsquoexistent que durant la session On deacuteclare cesvariables en ligne de commande agrave lrsquoaide du symbole laquo raquo

SET [ var2 = expression2]

Le tableau suivant illustre un exemple de deux variables de session on extrait le nom et lenombre drsquoheures de vol drsquoun pilote (table deacutecrite au deacutebut du chapitre 4) augmenteacute drsquounnombre en paramegravetre Son numeacutero de brevet et la dureacutee du vol sont lus au clavier Ces varia-bles de session ne sont bien sucircr pas agrave deacuteclarer dans le bloc

Conventions recommandeacutees

Adoptez les conventions drsquoeacutecriture suivantes pour que vos programmes MySQL soient plusfacilement lisibles et maintenables

Tableau 6-6 Utilisation drsquoopeacuterateurs

Code MySQL Commentaires

DECLARE v_compteur INT(3) DEFAULT 0DECLARE v_boolean BOOLEANDECLARE v_nombre INT(3)

Trois deacuteclarations dont une avec initialisation

SET v_compteur = v_compteur+1 Increacutementation de v_compteur (opeacuterateur +)

SET v_boolean = (v_compteur=v_nombre) v_boolean reccediloit NULL car la condition est fausse

SET v_boolean = (v_nombre IS NULL) v_boolean reccediloit TRUE (1 en fait) car la condi-tion est vraie

var1 = expression1

Tableau 6-7 Variables de session

Code MySQL Reacutesultat

hellipBEGIN DECLARE v_nom CHAR(16) DECLARE v_nbHVol DECIMAL(72) SELECT nomnbHVol INTO v_nom v_nbHVol FROM Pilote WHERE brevet = SET v_nbHVol = v_nbHVol + SELECT v_nom v_nbHVolEND

+------------------+----------+| v_nom | v_nbHVol |+------------------+----------+| Placide Fresnais | 246500 |+------------------+----------+

WebSET vs_num = PL-4$SET vs_hvol = 15$

vs_numvs_hvol

4055_06_C06 Page 215 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

216 copy Eacuteditions Eyrolles

Test des exemples

Parce qursquoil nrsquoest pas encore possible drsquoexeacutecuter des blocs anonymes (sous-programme sansnom et qui nrsquoest pas stockeacute dans la base) vous devez les inclure dans une proceacutedure catalo-gueacutee que vous appellerez dans lrsquointerface de commande

Lrsquoexemple suivant extrait le nombre drsquoheures de vol du pilote de nom Placide FresnaisPensez agrave redeacutefinir le deacutelimiteur agrave laquo $ raquo (par exemple) pour pouvoir utiliser dans le bloc lesymbole laquo raquo pour terminer chaque instruction

Le reacutesultat dans lrsquointerface de commande est le suivant Allez-y tester vos exemples mainte-nant

Tableau 6-8 Conventions

Objet Convention Exemple

Variable v_nomVariable v_compteur

Constante c_nomConstante c_pi

Variable de session (globale) vs_nomVariable vs_brevet

Tableau 6-9 Tester un exemple de bloc

Preacutefixer les variables Commentaire

delimiter $SET vs_nom = Placide Fresnais$

Deacuteclaration du deacutelimiteur et drsquoune variable de session

DROP PROCEDURE sp1$ Suppression de la proceacutedure

CREATE PROCEDURE sp1() Creacuteation de la proceacutedure

BEGIN DECLARE v_nbHVol DECIMAL(72) SELECT nbHVol INTO v_nbHVol FROM Pilote WHERE nom = vs_nom SELECT v_nbHVolEND$

Bloc drsquoinstructions

Trace du reacutesultatFin du bloc

CALL sp1()$ Appel de la proceacutedure

Web

4055_06_C06 Page 216 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 217

chapitre ndeg 6 Bases du langage de programmation

Structures de controcircle

En tant que langage proceacutedural MySQL offre la possibiliteacute de programmer

les structures conditionnelles si et cas (IFhellip et CASE)

des structures reacutepeacutetitives tant que reacutepeacuteter et boucle sans fin (WHILE REPEAT et LOOP)

Pas de structure FOR pour lrsquoinstant Deux directives suppleacutementaires qui sont toutefois agrave utiliseravec modeacuteration LEAVE qui sort drsquoune boucle (ou drsquoun bloc eacutetiqueteacute) et ITERATE qui force leprogramme agrave refaire un tour de boucle depuis le deacutebut

Structures conditionnelles

MySQL propose deux structures pour programmer des actions conditionneacutees la structure IFet la structure CASE

Trois formes de IF

Suivant les tests agrave programmer on peut distinguer trois formes de structure IF IF-THEN (si-alors) IF-THEN-ELSE (avec le sinon agrave programmer) et IF-THEN-ELSEIF (imbricationsde conditions)

Le tableau suivant donne lrsquoeacutecriture des diffeacuterentes structures conditionnelles IF Notezlaquo END IF raquo en fin de structure et non pas laquo ENDIF raquo Lrsquoexemple affiche un message diffeacute-rent selon la nature du numeacutero de teacuteleacutephone contenu dans la variable v_telephone

Figure 6-4 Exeacutecution drsquoun bloc

4055_06_C06 Page 217 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

218 copy Eacuteditions Eyrolles

Conditions booleacuteennes

Les tableaux suivants preacutecisent le reacutesultat drsquoopeacuterateurs logiques qui mettent en jeu des varia-bles booleacuteennes pouvant prendre trois valeurs (TRUE FALSE NULL) Bien sucircr en lrsquoabsencedrsquoun vrai type booleacuteen MySQL repreacutesente TRUE avec 1 et FALSE avec 0 Il est agrave noter que laneacutegation de NULL (NOT NULL) renvoie une valeur nulle

Structure CASE

Comme lrsquoinstruction IF la structure CASE permet drsquoexeacutecuter une seacutequence drsquoinstructions enfonction de diffeacuterentes conditions La structure CASE est utile lorsqursquoil faut eacutevaluer une mecircmeexpression et proposer plusieurs traitements pour diverses conditions

Tableau 6-10 Structures IF

IF-THEN IF-THEN-ELSE IF-THEN-ELSEIF

IF condition THEN instructionsEND IF

IF condition THEN instructionsELSE instructionsEND IF

IF condition1 THEN instructionsELSEIF condition2 THEN instructions2 ELSE instructions3END IF

BEGIN DECLARE v_telephone CHAR(14) DEFAULT 06-76-85-14-89 SELECT Cest un portable ELSE SELECT Cest un fixe END IFEND

IF SUBSTR(v_telephone12)=06 THEN

Tableau 6-11 Opeacuterateur AND

AND TRUE FALSE NULL

TRUE TRUE FALSE NULL

FALSE FALSE FALSE FALSE

NULL NULL FALSE NULL

Tableau 6-12 Opeacuterateur OR

OR TRUE FALSE NULL

TRUE TRUE TRUE TRUE

FALSE TRUE FALSE NULL

NULL TRUE NULL NULL

4055_06_C06 Page 218 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 219

chapitre ndeg 6 Bases du langage de programmation

Selon la nature de lrsquoexpression et des conditions une des deux eacutecritures suivantes peut ecirctreutiliseacutee

Le tableau suivant nous livre lrsquoeacutecriture avec IF drsquoune programmation qursquoil est plus rationneldrsquoeffectuer avec une structure CASE (de type searched)

Structures reacutepeacutetitives

Eacutetudions agrave preacutesent les trois structures reacutepeacutetitives tant que reacutepeacuteter et boucle sans fin

Structure tant que

La structure tant que se programme agrave lrsquoaide de la syntaxe suivante Avant chaque iteacuteration (etnotamment avant la premiegravere) la condition est eacutevalueacutee Si elle est vraie la seacutequence drsquoinstruc-tions est exeacutecuteacutee puis la condition est reacuteeacutevalueacutee pour un eacuteventuel nouveau passage dans la

Tableau 6-13 Structures CASE

CASE searched CASE

CASE variable WHEN expr1 THEN instructions1 WHEN expr2 THEN instructions2 hellip WHEN exprN THEN instructionsN [ELSE instructionsN+1]END CASE

CASE WHEN condition1 THEN instructions1 WHEN condition2 THEN instructions2 hellip WHEN conditionN THEN instructionsN [ELSE instructionsN+1]END CASE

Tableau 6-14 Diffeacuterentes programmations

IF CASE

BEGINDECLARE v_mention CHAR(2)DECLARE v_note DECIMAL(42) DEFAULT 98

IF v_note gt= 16 THEN SET v_mention = TB ELSEIF v_note gt= 14 THEN SET v_mention = B ELSEIF v_note gt= 12 THEN SET v_mention = AB ELSEIF v_note gt= 10 THEN SET v_mention = P ELSE END IF

CASE WHEN v_note gt= 16 THEN SET v_mention = TB WHEN v_note gt= 14 THEN SET v_mention = B WHEN v_note gt= 12 THEN SET v_mention = AB WHEN v_note gt= 10 THEN SET v_mention = P ELSE SET v_mention = REND CASE

Web

SET v_mention = R

4055_06_C06 Page 219 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

220 copy Eacuteditions Eyrolles

boucle Ce processus continue jusqursquoagrave ce que la condition soit fausse pour passer en seacutequenceapregraves le END WHILE Quand la condition nrsquoest jamais fausse on dit que le programme bouclehellip

[etiquette] WHILE condition DO

instructions

END WHILE [etiquette]

Le tableau suivant deacutecrit la programmation de deux tant que Le premier calcule la somme des100 premiers entiers Le second recherche le premier numeacutero 4 dans une chaicircne de caractegraveres

Cette structure est la plus puissante car elle permet de programmer aussi un reacutepeacuteter uneboucle sans fin et mecircme un pour (qui nrsquoest pas encore opeacuterationnel) Elle doit ecirctre utiliseacuteequand il est neacutecessaire de tester une condition avant drsquoexeacutecuter les instructions contenues dansla boucle

Structure reacutepeacuteter

La structure reacutepeacuteter se programme agrave lrsquoaide de la syntaxe REPEAThellip UNTIL

Enfin un reacutepeacuteter qui se programme comme il faut (agrave savoir laquo reacutepeacuteterhellip jusqursquoagrave condition raquo) Leslangages C et Java nous avaient deacuteformeacute cette traduction par do hellip while(condition)qui neacutecessite drsquoeacutecrire lrsquoinverse de la condition du jusqursquoagrave de lrsquoalgorithmique Ouf MySQL(comme Oracle) a bien programmeacute la structure reacutepeacuteter en traduisant ce fameux jusqursquoagrave par ladirective until et non plus par ce facirccheux while

Tableau 6-15 Structures tant que

Condition simple Condition composeacutee

DECLARE v_somme INT DEFAULT 0DECLARE v_entier SMALLINT DEFAULT 1

SET v_somme = v_somme+v_entier SET v_entier = v_entier+1

SELECT v_somme

+---------+| v_somme |+---------+| 5050 |+---------+

DECLARE v_telephone CHAR(14) DEFAULT 06-76-85-14-89DECLARE v_trouve BOOLEAN DEFAULT FALSEDECLARE v_indice SMALLINT DEFAULT 1

IF SUBSTR(v_telephonev_indice1) = 4 THEN SET v_trouve = TRUE ELSE SET v_indice = v_indice + 1 END IF

IF v_trouve THEN SELECT CONCAT(Trouveacute 4 agrave lindice v_indice)END IF

Trouveacute 4 agrave lindice 11

Web

WHILE (v_entier lt= 100) DO

END WHILEWHILE (v_indice lt= 14 AND NOT v_trouve) DO

END WHILE

4055_06_C06 Page 220 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 221

chapitre ndeg 6 Bases du langage de programmation

[etiquette] REPEAT

instructions

UNTIL condition END REPEAT [etiquette]

La particulariteacute de cette structure est que la premiegravere iteacuteration est effectueacutee quelles que soientles conditions initiales La condition nrsquoest eacutevalueacutee qursquoen fin de boucle

Si la condition est fausse la seacutequence drsquoinstructions est de nouveau exeacutecuteacutee Ce processuscontinue jusqursquoagrave ce que la condition soit vraie pour passer en seacutequence apregraves le END REPEAT

Quand la condition nrsquoest jamais vraie on dit aussi que le programme bouclehellip

Le tableau suivant deacutecrit la programmation de la somme des 100 premiers entiers et de larecherche du premier numeacutero 4 dans une chaicircne de caractegraveres agrave lrsquoaide de la structure reacutepeacuteterLes variables sont les mecircmes qursquoau tableau preacuteceacutedent

Cette structure doit ecirctre utiliseacutee quand il nrsquoest pas neacutecessaire de tester la condition avec lesdonneacutees initiales avant drsquoexeacutecuter les instructions contenues dans la boucle

Structure boucle sans fin

La syntaxe geacuteneacuterale de cette structure est programmeacutee par la directive LOOP Elle devient sansfin si vous nrsquoutilisez pas lrsquoinstruction LEAVE qui passe en seacutequence du END LOOP

[etiquette] LOOP

instructions

END LOOP [etiquette]

Le tableau suivant donne lrsquoeacutecriture du calcul de la somme des 100 premiers entiers en utilisantdeux boucles sans fin (qui se terminent toutefois car tout a une fin mais celles-lagrave je lesprogramme avec LEAVE) Jrsquoen profite pour preacutesenter ITERATE qui force agrave reprendrelrsquoexeacutecution au deacutebut de la boucle

Tableau 6-16 Structures reacutepeacuteter

Condition simple Condition composeacutee

REPEATSET v_somme = v_somme + v_entierSET v_entier = v_entier + 1

UNTIL END REPEAT

REPEAT IF SUBSTR(v_telephonev_indice1) = 4 THEN SET v_trouve = TRUE ELSE SET v_indice = v_indice + 1 END IFUNTIL END REPEATIF v_trouve THEN SELECT CONCAT(Trouveacute 4 agrave lindice v_indice)END IF

Web

v_entier gt 100

(v_indice gt 14 OR v_trouve)

4055_06_C06 Page 221 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

222 copy Eacuteditions Eyrolles

Il est agrave noter que LEAVE peut ecirctre aussi utiliseacute pour sortir drsquoun bloc (srsquoil est eacutetiqueteacute) LEAVEet ITERATE peuvent aussi ecirctre employeacutes au sein de structures REPEAT ou WHILE

Redirection (GOTO)Ceacutelegravebre pour faire tendre un programme vers une configuration plutocirct de feu drsquoartifice que decours drsquoeau tranquille lrsquoinstruction GOTO est bien connue mais souvent mal utiliseacutee Elle peutecirctre pratique dans certains cas pour sortir drsquoune boucle ou drsquoun bloc Il nrsquoest pas souhaitableque vous utilisiez GOTO agrave moins que vous eacutecriviez vos algorithmes avec des organigrammes

Dans son livre blanc (httpdevmysqlcomtech-resourcesarticlesmysql-storedprocedu-reshtml) Peter Gulutzan parle de laquo GOTO etiquette raquo et de laquo LABEL etiquette raquo Cetarticle est sorti alors que la version becircta de MySQL 50 nrsquoen eacutetait qursquoagrave ses deacutebuts Cette fonc-tionnaliteacute semble avoir eacuteteacute supprimeacutee dans la version de production Agrave suivre donc

Structure pourRenommeacutee pour les parcours de vecteurs tableaux et matrices en tout genre la structure pourse caracteacuterise par la connaissance a priori du nombre drsquoiteacuterations que le programmeur souhaitefaire effectuer agrave son algorithme La syntaxe geacuteneacuterale de cette structure est programmeacutee danstous les langages par lrsquoinstruction for

Absente pour lrsquoinstant de MySQL elle peut se programmer par un reacutepeacuteter un tant que ouencore par une boucle sans fin Dans tous ces cas il faudra deacutefinir un indice allant drsquoune valeurinitiale agrave une valeur finale tout en increacutementant ce mecircme indice en fin de boucle

Interactions avec la base

Cette section deacutecrit les meacutecanismes que MySQL offre pour interfacer un sous-programmeavec une base de donneacutees

Tableau 6-17 TStructures boucle sans fin

Avec LEAVE Avec ITERATE

SET v_somme = v_somme + v_entier SET v_entier = v_entier + 1 IF v_entier gt 100 THEN END IF

SET v_somme = v_somme + v_entier SET v_entier = v_entier + 1 IF v_entier lt= 100 THEN END IF

Webboucle1 LOOP

LEAVE boucle1

END LOOP boucle1

boucle1 LOOP

ITERATE boucle1

LEAVE boucle1END LOOP boucle1

4055_06_C06 Page 222 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 223

chapitre ndeg 6 Bases du langage de programmation

Extraire des donneacutees

La principale instruction capable drsquoextraire des donneacutees contenues dans des tables estSELECT Eacutetudieacutee au chapitre 4 dans un contexte SQL la particulariteacute de cette instruction auniveau drsquoun sous-programme est la directive INTO qui permet de charger des variables agrave partirde valeurs de colonnes comme le montre la syntaxe suivante

SELECT col1 [col2 ]INTO variable1 [variable2 ]

FROM nomTable

Cette instruction peut aussi ecirctre utiliseacutee agrave lrsquoexteacuterieur drsquoun bloc pour charger une variable desession par exemple

Veillez agrave ne reacutecupeacuterer qursquoun seul enregistrement agrave lrsquoaide du WHERE de la requecircte Crsquoest logi-que puisque vous deacutesirez ne charger qursquoune valeur par variable

bull Si vous en extrayez plusieurs vous verrez lrsquoerreur laquo ERROR 1172 (42000) Resultconsisted of more than one row raquo

bull Si vous nrsquoen extrayez aucun (no data found) aucune erreur nrsquoest souleveacutee et la variable estinchangeacutee (elle reste initialiseacutee agrave la valeur preacutesente avant la requecircte)

Colonnes simples

Le tableau suivant deacutecrit lrsquoextraction de la colonne compa pour le pilote de code PL-2 dansdiffeacuterents contextes

Tableau 6-18 Extraction de donneacutees

Code MYSQL Commentaires

BEGIN DECLARE v_comp VARCHAR(15) SELECT FROM Pilote WHERE brevet=PL-2 END

Chargement drsquoune variable locale agrave un blocNeacutecessiteacute drsquoappeler par la suite cette proceacute-dure (CALL)

SET vs_compa=$SELECT compa FROM Pilote WHERE brevet=PL-2$

Chargement drsquoune variable de session horsdrsquoun sous-programme

SET vs_compa=$CREATE PROCEDURE sp1() BEGIN SELECT FROM Pilote WHERE brevet=PL-2 END

Chargement drsquoune variable de session dans unsous-programme

compa INTO v_comp

INTO vs_compa

compa INTO vs_compa

4055_06_C06 Page 223 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

224 copy Eacuteditions Eyrolles

Pour traiter des requecirctes renvoyant plusieurs enregistrements il faudra utiliser des curseurs(eacutetudieacutes au chapitre suivant)

Fonctions SQL

Il est naturel que les fonctions SQL (mono et multilignes) eacutetudieacutees au chapitre 4 soienteacutegalement disponibles dans un sous-programme agrave condition de les utiliser au sein drsquouneinstruction SELECT Deux exemples sont deacutecrits dans le tableau suivant le premier char-gera la variable avec le nom du pilote de code PL-1 en majuscules (table deacutecrite au deacutebutdu chapitre 4) le second affectera agrave la variable le maximum du nombre drsquoheures de voltous pilotes confondus

Manipuler des donneacutees

Les principales instructions disponibles pour manipuler par un sous-programme leseacuteleacutements drsquoune base de donneacutees sont les mecircmes que celles proposeacutees par SQL agrave savoirINSERT UPDATE et DELETE Pour libeacuterer les verrous au niveau drsquoun enregistrement (etdes tables) il faudra ajouter les instructions COMMIT ou ROLLBACK (aspects eacutetudieacutes en finde chapitre)

Insertions

Le tableau suivant deacutecrit lrsquoinsertion de diffeacuterents enregistrements sous plusieurs eacutecritures (ilest aussi possible drsquoutiliser des variables de session)

Comme sous SQL il faut respecter les noms types et domaines de valeurs des colonnes Demecircme les contraintes de veacuterification (CHECK qui nrsquoest pas encore opeacuterationel et NOT NULL)et drsquointeacutegriteacute (PRIMARY KEY et FOREIGN KEY) doivent ecirctre valides

Dans le cas inverse une exception qui preacutecise la nature du problegraveme est leveacutee et peut ecirctreintercepteacutee par la directive HANDLER (voir chapitre suivant) Si une telle directive nrsquoexiste pas

Tableau 6-19 Utilisation de fonctions

Monoligne Multiligne

BEGIN DECLARE v_nomEnMAJUSCULES CHAR(20) SELECT FROM Pilote WHERE brevet = PL-1SELECT v_nomEnMAJUSCULESEND

BEGIN DECLARE v_plusGrandHVol DECIMAL(72) SELECT FROM PiloteSELECT v_plusGrandHVol END

+-------------------+| v_nomEnMAJUSCULES |+-------------------+| GRATIEN VIEL |+-------------------+

+-----------------+| v_plusGrandHVol |+-----------------+| 245000 |+-----------------+

Web

UPPER(nom)INTO v_nomEnMAJUSCULES

MAX(nbHVol) INTO v_plusGrandHVol

4055_06_C06 Page 224 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 225

chapitre ndeg 6 Bases du langage de programmation

dans le bloc qui contient lrsquoinstruction INSERT la premiegravere exception fera srsquointerrompre leprogramme

Modifications

Concernant la mise agrave jour de colonnes par UPDATE la clause SET peut ecirctre ambigueuml dans lesens ougrave lrsquoidentificateur agrave gauche de lrsquoopeacuterateur drsquoaffectation est toujours une colonne de basede donneacutees alors que celui agrave droite de lrsquoopeacuterateur peut correspondre agrave une colonne ou agrave unevariable

UPDATE nomTable

SET col1 = variable1 | expression1 | autrecol | (requecircte)

[col2 = ]

[WHERE ]

Si aucun enregistrement nrsquoest modifieacute aucune erreur ne se produit et aucune exception nrsquoestleveacutee

Alors que les affectations dans le code MYSQL (SET hellip) peuvent srsquoeacutecrire par les symboleslaquo = raquo ou laquo = raquo les comparaisons ou affectations SQL neacutecessitent le symbole laquo = raquo

Le tableau suivant deacutecrit la modification de diffeacuterents enregistrements (il est aussi possibledrsquoemployer des variables de session)

Tableau 6-20 Insertion drsquoenregistrements

Code MySQL Commentaires

BEGIN DECLARE v_brevet VARCHAR(6) DEFAULT PL-7 DECLARE v_nom VARCHAR(6) DECLARE v_HVol DECIMAL(72) DEFAULT 0 DECLARE v_comp VARCHAR(6)

Deacuteclaration des variables locales aubloc

INSERT INTO Pilote VALUES

Insertion drsquoun enregistrement en rensei-gnant les colonnes par des constantes

SET v_nom = Fabrice Peyrard SET v_comp = SING INSERT INTO Pilote VALUES END

Insertion drsquoun enregistrement en rensei-gnant les colonnes par des variableslocales

Web

(PL-6 Jules Ente 3000 AF)

(v_brevetv_nomv_HVolv_comp)

4055_06_C06 Page 225 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

226 copy Eacuteditions Eyrolles

Suppressions

La suppression par DELETE peut ecirctre ambigueuml (mecircme raison que pour lrsquoinstruction UPDATE)au niveau de la clause WHERE

DELETE FROM nomTable

[WHERE col1 = variable1 | expression1 | autrecol | (requecircte)

[col2 = ] ]

Si aucun enregistrement nrsquoest modifieacute aucune erreur ne se produit et aucune exception nrsquoestleveacutee

Le tableau suivant deacutecrit la suppression de diffeacuterents enregistrements (il est aussi possibledrsquoutiliser des variables de session)

Tableau 6-21 Modifications drsquoenregistrements

Code MySQL Commentaires

BEGIN DECLARE v_dureeVol DECIMAL(31) DEFAULT 48

Deacuteclaration

UPDATE Pilote SET WHERE brevet= PL-6

Modification drsquoun enregistrement de la table Pilote en utilisant une variable

UPDATE Pilote SET WHERE compa = AFEND

Modification de plusieurs enregistrements de la table Pilote en utilisant une cons-tante

Web

nbHVol= nbHVol + v_dureeVol

nbHVol= nbHVol + 10

Tableau 6-22 Suppression drsquoenregistrements

Code MYSQL Commentaires

BEGIN DECLARE v_hVolMini DECIMAL(72) DEFAULT 100000

DELETE FROM Pilote WHERE nbHVol lt

DELETE FROM Pilote WHERE Supprime les enregistrements dela table Pilote dont le nombredrsquoheures de vol est infeacuterieur agrave1 000Supprime un pilote

DELETE FROM Pilote WHERE END

Ne supprime aucun pilote

Web

v_hVolMini

brevet = PL-3

brevet = NULL

4055_06_C06 Page 226 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 227

chapitre ndeg 6 Bases du langage de programmation

Transactions

Une transaction est un bloc drsquoinstructions LMD faisant passer la base de donneacutees drsquoun eacutetatcoheacuterent agrave un autre eacutetat coheacuterent Si un problegraveme logiciel ou mateacuteriel survient au cours drsquounetransaction aucune des instructions contenues dans la transaction nrsquoest effectueacutee quel quesoit lrsquoendroit de la transaction ougrave est intervenue lrsquoerreur

On peut supposer que la majoriteacute des transactions sous MySQL sont programmeacutees dans lelangage du serveur Les langages plus eacutevolueacutes permettent aussi de deacutevelopper des transactionsagrave travers des API (par exemple la meacutethode commit est comprise dans le paquetagejavasql)

Lrsquoexemple typique drsquoune transaction est celui du transfert drsquoun compte eacutepargne vers uncompte courant Imaginez qursquoapregraves une panne votre compte eacutepargne a eacuteteacute deacutebiteacute de la sommede 500 euro sans que votre compte courant soit creacutediteacute du mecircme montant Vous ne seriez pastregraves content des services de votre banque (agrave moins que lrsquoerreur ne soit intervenue dans lrsquoautresens) Le meacutecanisme transactionnel empecircche un tel sceacutenario en invalidant toutes les opeacutera-tions faites depuis le deacutebut de la transaction si une panne survient au cours de cette mecircmetransaction

Caracteacuteristiques

Une transaction assure

lrsquoatomiciteacute des instructions qui sont consideacutereacutees comme une seule opeacuteration (principe dutout ou rien)

la coheacuterence (passage drsquoun eacutetat coheacuterent de la base agrave un autre eacutetat coheacuterent)

lrsquoisolation des transactions entre elles (lecture consistante meacutecanisme deacutecrit plus loin)

la durabiliteacute des opeacuterations (les mises agrave jour perdurent mecircme si une panne se produit apregravesla transaction)

Figure 6-5 Transaction

TRANSFERT(500euro) Deacutebut Transaction hellip UPDATE Codevi( -500euro) UPDATE CompteCourant(+500euro) Fin Transaction

Eacutetat coheacuterent

TEMPS

PANNE

Eacutetat coheacuterent

4055_06_C06 Page 227 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

228 copy Eacuteditions Eyrolles

Deacutebut et fin drsquoune transaction

Deux instructions sont disponibles pour marquer le deacutebut drsquoune transaction START TRAN-SACTION ou BEGIN Ainsi entre BEGIN et END drsquoun programme MySQL il est possibledrsquoeacutecrire plusieurs transactions Le fait de commencer une transaction termine implicitementcelle qui preacuteceacutedait ladite transaction

Une transaction se termine explicitement par les instructions SQL COMMIT ou ROLLBACK Ellese termine implicitement

bull agrave la premiegravere commande SQL du LDD ou du LCD rencontreacutee (CREATE ALTER DROPhellip)

bull agrave la fin normale drsquoune session utilisateur avec deacuteconnexion

bull agrave la fin anormale drsquoune session utilisateur (sans deacuteconnexion)

Nous deacutetaillons ici les principes de base drsquoune transaction MySQL sans entrer dans des deacutetailsplus techniques (veacuterouillages accegraves concurrents et transactions reacuteparties) qui sortent du cadrede cet ouvrage

Mode de validation

Deux modes de fonctionnement sont possibles celui par deacutefaut (autocommit) qui validesysteacutematiquement toutes les instructions reccedilues par la base Dans ce mode point de salut car ilvous sera impossible de revenir en arriegravere afin drsquoannuler une instruction Le mode agrave utiliserpour programmer des transactions est celui inverse (autocommit off) qui se deacuteclare agrave lrsquoaide duparamegravetre 0 dans lrsquoinstruction suivante

SET AUTOCOMMIT = 0 | 1

Le tableau suivant preacutecise la validiteacute de la transaction en fonction des eacuteveacutenements possibles

Votre premiegravere transaction

Vous pouvez tester rapidement une transaction en eacutecrivant le bloc suivant qui insegravere une lignedans une de vos tables

Tableau 6-23 Validiteacute drsquoune transaction

Eacuteveacutenement Validiteacute

COMMIT Transaction valideacutee

ROLLBACKCommande SQL (LDD ou LCD)Fin anormale drsquoune session

Transaction non valideacutee

4055_06_C06 Page 228 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 229

chapitre ndeg 6 Bases du langage de programmation

delimiter $

DROP PROCEDURE sp1$

CREATE PROCEDURE sp1()

BEGIN

SET AUTOCOMMIT = 0

INSERT INTO TableaVous VALUES ()

END

$

--appel de la transaction

CALL sp1()$

SELECT FROM TableaVous$

Exeacutecutez ce bloc dans lrsquointerface puis deacuteconnectez-vous soit en cassant la fenecirctre (icocircne enhaut agrave droite) soit proprement avec exit Reconnectez-vous et constatez que lrsquoenregistre-ment nrsquoest pas preacutesent dans votre table Mecircme quand la fin du programme est normale la tran-saction nrsquoest pas valideacutee (car il manque COMMIT) Relancez le bloc en ajoutant cetteinstruction apregraves lrsquoinsertion Notez que lrsquoenregistrement est preacutesent deacutesormais dans votretable mecircme apregraves une deacuteconnexion douce ou dure

Controcircle des transactions

Il est inteacuteressant de pouvoir deacutecouper une transaction en inseacuterant des points de validation(savepoints) qui rendent possible lrsquoannulation de tout ou partie des opeacuterations composantladite transaction

La figure suivante illustre une transaction deacutecoupeacutee en trois parties Lrsquoinstruction ROLLBACKpeut srsquoeacutecrire sous diffeacuterentes formes Ainsi ROLLBACK TO SAVEPOINTPointvalidation1 invalidera les UPDATE et le DELETE tout en laissant la possibiliteacute deconfirmer lrsquoinstruction INSERT (en fonction des commandes se trouvant apregraves ce ROLLBACKrestreint et de la maniegravere dont la session se terminera)

Web

Figure 6-6 Points de validation

Deacutebut Transaction INSERThellipPoint validation 1 UPDATEhellip UPDATEhellipPoint validation 2 DELETE hellip hellip

Fin Transaction

ROLLBACK

ROLLBACK TO SAVEPOINTPoint validation1

ROLLBACK TO SAVEPOINTPoint validation2

4055_06_C06 Page 229 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

230 copy Eacuteditions Eyrolles

Le tableau suivant deacutecrit une transaction MySQL deacutecoupeacutee en trois parties Le programmeuraura le choix entre les instructions ROLLBACK TO SAVEPOINT indiqueacutees en commentairepour valider tout ou partie de la transaction Il faudra finalement se deacutecider entre COMMIT etROLLBACK

Lrsquoinstruction SAVEPOINT deacuteclare un point de validation

Transactions imbriqueacutees

Il nrsquoest pas possible drsquoimbriquer plusieurs transactions se deacuteroulant dans diffeacuterents blocs

Il nrsquoest pas possible drsquoinvalider par ROLLBACK une commande SQL du LDD ou du LCD rencon-treacutee (CREATE ALTER DROPhellip)

Tableau 6-24 Transaction deacutecoupeacutee

Code MYSQL Commentaires

BEGINSET AUTOCOMMIT = 0 INSERT INTO Compagnie VALUES(C22 Place Brassens Blagnac Easy Jet)

Premiegravere partie de la transaction

UPDATE Compagnie SET nrue = 125 WHERE comp = AF UPDATE Compagnie SET ville = Castanet WHERE comp = C1

Deuxiegraveme partie de la transaction

DELETE FROM Compagnie WHERE comp = C1

Troisiegraveme partie de la transaction

-- Premiegravere partie agrave valider

-- Deuxiegraveme partie agrave valider

-- Troisiegraveme partie agrave valider

Tout agrave invalider

END

Valide la ou les sous-parties

Web

SAVEPOINT P1

SAVEPOINT P2

ROLLBACK TO SAVEPOINT P1

ROLLBACK TO SAVEPOINT P2

ROLLBACK TO SAVEPOINT P3

ROLLBACK

COMMIT

4055_06_C06 Page 230 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 231

chapitre ndeg 6 Bases du langage de programmation

Exercices

Lrsquoobjectif de ces exercices est drsquoeacutecrire des blocs puis des transactions manipulant des tablesdu scheacutema Parc Informatique Vous utiliserez une proceacutedure pour tester vos blocs comme ilest indiqueacute dans la section Test des exemples

61 Extraction de donneacutees

Eacutecrire le bloc MySQL qui affiche les deacutetails de la derniegravere installation de logiciel sous la forme suivante(les champs en gras sont agrave extraire)

+------------------------------------------------+

| Resultat 1 exo 1 |

+------------------------------------------------+

| Derniere installation en salle numeacuterodeSalle |

+------------------------------------------------+

+--------------------------------------------------------------------+

| Resultat 2 exo 1 |

+--------------------------------------------------------------------+

| Poste numeacuteroPoste Logiciel nomLogiciel en date du dateInstallation |

+--------------------------------------------------------------------+

Vous utiliserez SELECT hellip INTO pour extraire ces valeurs Ne tenez pas compte pour le moment deserreurs qui pourraient eacuteventuellement se produire (aucune installation de logiciel poste ou logiciel nonreacutefeacuterenceacutes dans la base etc)

62 Variables de session

Eacutecrire le bloc MySQL qui affecte hors drsquoun bloc par des variables session un numeacutero de salle et untype de poste et qui retourne des variables session permettant de composer un message indiquantles nombres de postes et drsquoinstallations de logiciels correspondants

+--------------------------------------------------------------------+

| Resultat exo2 |

+--------------------------------------------------------------------+

| x poste(s) installe(s) en salle y z installation(s) de type t |

+--------------------------------------------------------------------+

Essayez pour la salle s01 et le type UNIX Vous devez extraire 1 poste et 3 installations Ne tenez pascompte pour le moment drsquoeacuteventuelles erreurs (aucun poste trouveacute ou aucune installation reacutealiseacutee etc)

63 Transaction

Eacutecrire une transaction permettant drsquoinseacuterer un nouveau logiciel dans la base apregraves avoir passeacute enparamegravetres par des variables de session toutes ses caracteacuteristiques (numeacutero nom version et type dulogiciel) La date drsquoachat doit ecirctre celle du jour Tracer lrsquoinsertion du logiciel (message Logicielinseacutereacute dans la base)

4055_06_C06 Page 231 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

232 copy Eacuteditions Eyrolles

Il faut ensuite proceacuteder agrave lrsquoinstallation de ce logiciel sur le poste de code p7 (utiliser une variable pourpouvoir plus facilement modifier ce paramegravetre) Lrsquoinstallation doit se faire aussi agrave la date du jour Penseragrave actualiser correctement la colonne delai qui mesure le deacutelai (TIME) entre lrsquoachat et lrsquoinstallationPour ne pas que ce deacutelai soit nul (les deux insertions se feraient dans la mecircme seconde dans cettetransaction) placer une attente de 5 secondes entre lrsquoajout dans la table Logiciel et celui dans latable Installer agrave lrsquoaide de lrsquoinstruction SELECT SLEEP(5) Utiliser la fonction TIMEDIFF pourcalculer ce deacutelai

Inseacuterer par exemple le logiciel log15 de nom MySQL Query version 14 typePCWS coucirctant 95 euroTracer la transaction comme suit

+------------------------------+

| message1 |

+------------------------------+

| Logiciel insere dans la base |

+------------------------------+

1 row in set (001 sec)

+----------------------------------+

| message2 |

+----------------------------------+

| Date achat 2005-11-23 191604 |

+----------------------------------+

+----------+

| SLEEP(5) |

+----------+

| 0 |

+----------+

+-----------------------------------------+

| message3 |

+-----------------------------------------+

| Date installation 2005-11-23 191610 |

+-----------------------------------------+

+--------------------------------+

| message4 |

+--------------------------------+

| Logiciel installe sur le poste |

+--------------------------------+

Veacuterifiez lrsquoeacutetat des tables mises agrave jour apregraves la transaction Ne tenez pas compte pour le momentdrsquoeacuteventuelles erreurs (numeacutero du logiciel deacutejagrave reacutefeacuterenceacute type du logiciel incorrect installation deacutejagravereacutealiseacutee etc)

Attente de 5 secondes agrave ce niveau

4055_06_C06 Page 232 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

233

Chapitre 7

Programmation avanceacutee

Ce chapitre est consacreacute agrave des caracteacuteristiques avanceacutees du langage proceacutedural de MySQL

eacutecriture et appel de sous-programmes

programmation des curseurs

gestion des exceptions

mise en place de deacuteclencheurs

utilisation du SQL dynamique

Sous-programmes

Les sous-programmes sont des blocs nommeacutes qui sont compileacutes et qui reacutesident dans la basede donneacutees Dans le vocabulaire des bases de donneacutees on appelle les sous-programmes

storedprocedures

ou

stored routines

Ce sont des fonctions ou proceacutedures laquo catalogueacutees raquo (oulaquo stockeacutees raquo) capables drsquoinclure des paramegravetres en entreacutee Comme dans tous les langages deprogrammation les fonctions retournent un unique reacutesultat alors que les proceacutedures reacutealisentdes actions sans en donner (sauf eacuteventuellement en paramegravetre de sortie)

Eacutetant un des plus laquo jeunes raquo des SGBD MySQL tend au plus pregraves (en ajoutant toutefois desextensions) de la syntaxe normative de SQL2003 (sections

Stored Modules

et

Computationalcompleteness

) Lrsquoautre SGBD se rapprochant le plus de la norme est DB2 drsquoIBM Oracle etSQL Server de Microsoft ont un grand nombre de caracteacuteristiques absentes de la norme

Pour lrsquoinstant seules les proceacutedures sont capables drsquoinclure des paramegravetres en sortie

Un sous-programme ne se recompile pas automatiquement suite agrave la modification drsquoun objet

de la base manipuleacute dans son code (ajout drsquoune colonne dans une table par exemple)

Geacuteneacuteraliteacutes

Il est possible de retrouver le code drsquoun sous-programme au niveau du dictionnaire desdonneacutees (voir la fin du chapitre 5) Le sous-programme peut ecirctre ainsi partageacute dans un

4055_07_C07 Page 233 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

234

copy Eacuteditions Eyrolles

contexte multi-utilisateur Les avantages drsquoutiliser des sous-programmes ont eacuteteacute souligneacutes auchapitre 6 (modulariteacute portabiliteacute extensibiliteacute reacuteutilisabiliteacute inteacutegriteacute et confidentialiteacute)

Comme les blocs nous verrons que les sous-programmes ont une partie de deacuteclaration desvariables une autre contenant les instructions et eacuteventuellement une partie pour geacuterer lesexceptions (erreurs produites durant lrsquoexeacutecution)

Une proceacutedure peut ecirctre appeleacutee agrave lrsquoaide de lrsquointerface de commande (par

CALL

) dans unprogramme externe (Java PHP Chellip) par drsquoautres proceacutedures ou fonctions ou dans le corpsdrsquoun deacuteclencheur Les fonctions peuvent ecirctre invoqueacutees dans une instruction SQL (

SELECT

INSERT

et

UPDATE

) ou dans une expression (affectation de variable ou calcul)

Le cycle de vie drsquoun sous-programme est le suivant creacuteation de la proceacutedure ou de la fonction(compilation et stockage dans la base) appel et eacuteventuellement suppression du sous-programme de la base

Proceacutedures catalogueacutees

La syntaxe de creacuteation drsquoune proceacutedure catalogueacutee est la suivante Le privilegravege

CREATEROUTINE

est requis sur la base de donneacutees (ou au niveau global) en question (

ALTERROUTINE

et

EXECUTE

sont affecteacutes par la suite automatiquement)

CREATE

PROCEDURE

[

nomBase

]

nomProceacutedure

(

[ [ IN | OUT | INOUT ]

param

typeMySQL

[[ IN | OUT | INOUT ]

param2

typeMySQL

] ] )

[ LANGUAGE SQL

| [NOT] DETERMINISTIC

| CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

| SQL SECURITY DEFINER | INVOKER

| COMMENT

commentaire

]

BEGIN

[DECLARE ]

bloc drsquoinstructions

SQL et MySQL

END

deacutelimiteur

Par deacutefaut la proceacutedure est creacuteeacutee dans la base de donneacutees courante (seacutelectionneacutee) Si unnom est speacutecifieacute (

nomBase

) la proceacutedure appartiendra agrave cette base de donneacutees

IN

deacutesigne un paramegravetre drsquoentreacutee (par deacutefaut)

OUT

un paramegravetre de sortie et

INOUT

unparamegravetre drsquoentreacutee et de sortie

LANGUAGE SQL

(par deacutefaut) deacutetermine le langage de programmation de la proceacutedureMySQL nrsquoest pas encore compatible avec drsquoautres langages que le sien

4055_07_C07 Page 234 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

235

chapitre ndeg 7 Programmation avanceacutee

DETERMINISTIC

est simplement informationnel (lrsquooptimiseur srsquoen servira dans desversions ulteacuterieures) et deacutecrit le caractegravere deacuteterministe de la proceacutedure Si vous interrogezla base il serait plus naturel drsquoutiliser

NOT DETERMINISTIC

car on ne sait pas a priorice que lrsquoon va extraire (comme dans la boicircte de chocolats de

Forrest Gump)

CONTAINS SQL

renseigne sur le fait que la proceacutedure interagit avec la base

NO SQL

indi-que lrsquoinverse

READS SQL DATA

preacutecise que les interactions sont en lecture seulement

MODIFIES SQL DATA

signifie que des mises agrave jour de la base sont possibles

SQL SECURITY

deacutetermine si la proceacutedure srsquoexeacutecute avec les privilegraveges du creacuteateur(option par deacutefaut

definer-rights procedure

) ou ceux de lrsquoutilisateur qui appelle la proceacute-dure (

invoker-rights procedure

)

COMMENT

permet de commenter la proceacutedure au niveau du dictionnaire des donneacutees (voirchapitre 5)

bloc drsquoinstructions

SQL et MySQL

contient les deacuteclarations et les instructions dela proceacutedure eacutecrite dans le langage de MySQL (voir le chapitre preacuteceacutedent)

deacutelimiteur

deacutelimiteur de commandes diffeacuterent de laquo raquo (symbole utiliseacute obligatoire-ment en fin de chaque deacuteclaration et instruction du langage proceacutedural de MySQL)

Fonctions catalogueacutees

La syntaxe de creacuteation drsquoune fonction catalogueacutee est

CREATE FUNCTION

Les preacuterogativeset les options sont les mecircmes que pour les proceacutedures Nrsquooubliez pas lrsquoinstruction laquo

RETURN

variable

raquo

qui termine la fonction et retourne le reacutesultat (de mecircme type que celui deacuteclareacutedans la clause

RETURNS

CREATE

FUNCTION

[

nomBase

]

nomFonction

(

[

param

typeMySQL

[

param2

typeMySQL

] ] )

RETURNS

typeMySQL

[ LANGUAGE SQL

| [NOT] DETERMINISTIC

| CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

| SQL SECURITY DEFINER | INVOKER

| COMMENT commentaire

]

BEGIN

[DECLARE ]

bloc drsquoinstructions SQL et MySQL

contenant un laquo RETURN variable raquo

END

deacutelimiteur

4055_07_C07 Page 235 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

236 copy Eacuteditions Eyrolles

Structure drsquoun sous-programme

Dans une proceacutedure comme dans une fonction les deacuteclarations des variables curseurs etexceptions suivent directement lrsquoen-tecircte du bloc (apregraves la directive BEGIN) La figure suivanteillustre la structure drsquoune speacutecification et drsquoun corps drsquoun sous-programme MySQL Le blocdrsquoinstructions doit contenir au moins une instruction MySQL

Exemples

Consideacuterons la table Pilote Nous allons eacutecrire (dans la base bdsoutou) une fonction etune proceacutedure

La fonction EffectifsHeure(compheures) devra renvoyer le nombre de pilotesdrsquoune compagnie donneacutee (premier paramegravetre) qui ont plus drsquoheures de vol que la valeur dudeuxiegraveme paramegravetre (si aucun pilote retourne 0) Si aucune compagnie nrsquoest passeacutee enparamegravetre (mettre NULL) le calcul inclut toutes les compagnies Les eacuteventuelles erreurs nesont pas encore traiteacutees (compagnie de code inexistant par exemple)

La proceacutedure PlusExperimente(compnomheures) doit retourner le nom et lenombre drsquoheures de vol du pilote (par lrsquointermeacutediaire des deuxiegraveme et troisiegraveme paramegrave-tres) le plus expeacuterimenteacute drsquoune compagnie donneacutee (premier paramegravetre) Si plusieurs pilo-tes ont la mecircme expeacuterience un message drsquoerreur est afficheacute Si aucune compagnie nrsquoestpasseacutee en paramegravetre (mettre NULL) la proceacutedure retourne le nom du plus expeacuterimenteacute et lecode de sa compagnie (par lrsquointermeacutediaire du premier paramegravetre)

Remarquez que la fonction aurait pu ecirctre programmeacutee par une proceacutedure ayant un troisiegravemeparamegravetre de sortie

Figure 7-1 Structure drsquoun sous-programme

CREATE PROCEDURE | FUNCTION nomSousProgramme [()] [RETURNS typeMSQL ]

BEGIN[DECLARE deacuteclaration ] instructions MySQL

BEGIN [DECLARE deacuteclaration ]

instructions MySQL END hellipEND

$

4055_07_C07 Page 236 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 237

chapitre ndeg 7 Programmation avanceacutee

Une fonction

La creacuteation de la fonction est reacutealiseacutee agrave lrsquoaide du script suivant (EffectifsHeuresql)Notez que les deux paramegravetres drsquoentreacutee ne sont pas deacutefinis par la directive IN et que la clauseRETURN doit ecirctre preacutesente en fin de codage

BEGIN

DECLARE resultat SMALLINT

IF (pcomp IS NULL) THEN

SELECT COUNT() INTO resultat FROM Pilote WHERE nbHVol gt pheuresVol

ELSE

SELECT COUNT() INTO resultat FROM Pilote WHERE nbHVol gt pheuresVol

AND comp = pcomp

END IF

END

Une proceacutedure

La creacuteation de la proceacutedure est reacutealiseacutee agrave lrsquoaide du script suivant (PlusExperimentesql)Notez les deux derniers paramegravetres de sortie deacutefinis par la directive OUT et le premier servantdrsquoentreacutee ou de sortie avec la directive INOUT On peut assimiler le passage drsquoun paramegravetre parreacutefeacuterence agrave lrsquoutilisation de la directive INOUT

Figure 7-2 Proceacutedures

Pilote

brevet nom nbHVol comp

PL-1 Gilles Laborde 2450 AF PL-2 Freacutedeacuteric DAlmeyda 900 AF PL-3 Florence Peacuterissel 1000 SING PL-4 Thierry Millan 2450 CAST PL-5 Christine Royo 200 AF PL-6 Aureacutelia Ente 2450 SING

EffectifsHeure(comp heures)

(lsquoAFrsquo 300) 2

PlusExperimente(comp nom heures )

(lsquoAFrsquo ) (lsquoAFrsquo lsquo Gilles Labordersquo 2450)

function procedure

WebCREATE FUNCTION bdsoutouEffectifsHeure(pcomp VARCHAR(4)

pheuresVol DECIMAL(72)) RETURNS SMALLINT

RETURN resultat

4055_07_C07 Page 237 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

238 copy Eacuteditions Eyrolles

BEGIN

DECLARE p1 SMALLINT

IF (pcomp IS NULL) THEN

SELECT COUNT() INTO p1 FROM Pilote

WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote)

ELSE

SELECT COUNT() INTO p1 FROM Pilote

WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote WHERE comp=pcomp)

AND comp = pcomp

END IF

IF (p1 = 0) THEN

SELECT (Aucun pilote nest le plus expeacuterimenteacute) AS resultat

ELSEIF p1 gt 1 THEN

SELECT(Plusieurs pilotes sont les plus expeacuterimenteacutes) AS resultat

ELSE

IF (pcomp IS NULL) THEN

SELECT nom nbHVol comp INTO pnomPil pheuresVol pcomp

FROM Pilote WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote)

ELSE

SELECT nom nbHVol INTO pnomPil pheuresVol FROM Pilote

WHERE nbHVol=(SELECT MAX(nbHVol) FROM Pilote WHERE comp=pcomp)

AND comp = pcomp

END IF

END IF

END

Fonction nrsquointeragissant pas avec la base

La fonction EcritureComplexe renvoie une chaicircne de caractegraveres deacutesignant lrsquoeacutecriture drsquounnombre complexe sous la forme laquo a + bi raquo ou laquo a - bi raquo (EcritureComplexesql) enfonction du signe des deux paramegravetres a et b deacutefinissant la partie reacuteelle et la partie imaginairedu complexe

BEGIN

DECLARE result VARCHAR(80)

IF (imaginaire lt 0) THEN

SET result = CONCAT(Complexe reel--imaginairei)

WebCREATE PROCEDURE bdsoutouPlusExperimente

(INOUT pcomp VARCHAR(4) OUT pnomPil VARCHAR(20) OUT pheuresVol DECIMAL(72))

WebCREATE FUNCTION bdsoutouEcritureComplexe

(reel DECIMAL(72) imaginaire DECIMAL(72))

RETURNS VARCHAR(80)

4055_07_C07 Page 238 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 239

chapitre ndeg 7 Programmation avanceacutee

ELSE

SET result = CONCAT(Complexe reel+imaginairei)

END IF

RETURN result

END

Compilation

Pour compiler ces sous-programmes agrave partir de lrsquointerface de commande il faut ajouter undeacutelimiteur apregraves chaque dernier END comme suit

delimiter $

Sous programme

$

Si un message drsquoerreur apparaicirct il indique la ligne concerneacutee souvent lrsquoerreur peut ecirctre situeacuteejuste avant cette ligne Le mecircme reacutesultat peut ecirctre obtenu par la commande SHOW ERRORS

Une fois que le message laquo Query OK 0 rows affected (hellip sec) raquo apparaicirct le sous-programme est correctement compileacute

Appel drsquoun sous-programme

Le creacuteateur drsquoun sous-programme peut exeacutecuter ce dernier agrave la demande et sans aucune condi-tion preacutealable Pour exeacutecuter un sous-programme agrave partir drsquoun autre accegraves les conditionssuivantes doivent ecirctre respecteacutees

deacutetenir le privilegravege EXECUTE sur la proceacutedure en question ou sur la base qui contient lesous-programme ou au niveau global

mentionner le nom de la base (du scheacutema) contenant le sous-programme agrave lrsquoexeacutecution dece dernier (exemple drsquoappel sous lrsquointerface de commande de la proceacutedure AugmenteCa-pacite de la base bdjean pour lrsquoavion drsquoimmatriculation F-GLFS laquo CALLbdjeanAugmenteCapacite(F-GLFS) raquo)

Deacutecrivons lrsquoappel drsquoun sous-programme sous lrsquointerface de commande dans un sous-programme MySQL et dans une instruction SQL Le chapitre suivant deacutetaillera un tel appel agravepartir drsquoun programme externe (Java ou PHP)

Sous lrsquointerface de commande

En phase de tests il est inteacuteressant de pouvoir deacuteclencher un sous-programme directementdans lrsquointerface de commande La commande CALL permet drsquoappeler une proceacutedure Unefonction est exeacutecuteacutee par son nom dans une instruction SQL

Le tableau suivant deacutecrit lrsquoappel et le reacutesultat des trois sous-programmes La fonction estappeleacutee ici dans un SELECT et dans un INSERT de deux maniegraveres diffeacuterentes

4055_07_C07 Page 239 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

240 copy Eacuteditions Eyrolles

Dans un sous-programme

Invoquons les sous-programmes agrave preacutesent agrave partir drsquoun autre sous-programme Le mecircme prin-cipe peut ecirctre adopteacute pour lrsquoappel dans un deacuteclencheur La proceacutedure srsquoappelle toujours parCALL la fonction par son nom (ici elle est appeleacutee dans lrsquoaffectation drsquoune variable)

Tableau 7-1 Appels dans lrsquointerface de commande

Appel dun sous-programme Reacutesultat

delimiter

+-----------------------------------+| bdsoutouEffectifsHeure(AF300) |+-----------------------------------+| 2 |+-----------------------------------+

delimiter SET vs_compa = AFSET vs_nompil = SET vs_heures =

SELECT vs_compavs_nompilvs_heures+-----------+----------------+------------+| vs_compa | vs_nompil | vs_heures |+-----------+----------------+------------+| AF | Gilles Laborde | 245000 |+-----------+----------------+------------+

delimiter SELECT

+---------------------------------+| bdsoutouEcritureComplexe(2-5) |+---------------------------------+| Complexe 2-5i |+---------------------------------+

CREATE TABLE testTrace (col VARCHAR(80))INSERT INTO testTrace SELECT bdsoutouEcritureComplexe (-2-5)INSERT INTO testTrace VALUES )

SELECT FROM testTrace+------------------+| col |+------------------+| Complexe -2-5i || Complexe 3-7i |+------------------+

WebSELECT bdsoutouEffectifsHeure

(AF300)

CALL bdsoutouPlusExperimente(vs_compa vs_nompilvs_heures)

bdsoutouEcritureComplexe(2-5)

bdsoutouEcritureComplexe

bdsoutouEcritureComplexe(3-7)

4055_07_C07 Page 240 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 241

chapitre ndeg 7 Programmation avanceacutee

Reacutecursiviteacute

La reacutecursiviteacute nrsquoest pour lrsquoinstant pas permise dans MySQL au niveau des sous-programmes

Comme dans tout programme reacutecursif il ne faudrait pas oublier la condition de terminaison Lrsquoexemple suivant deacutecrit la programmation agrave lrsquoaide drsquoune fonction reacutecursive du calcul de lafactorielle drsquoun entier positif La compilation se deacuteroule sans erreur lrsquoappel lui nous ramegraveneagrave lrsquoordre

Tableau 7-2 Appels dans un sous-programme

Codage Appels

CREATE PROCEDURE testsp1()BEGIN DECLARE v_compa VARCHAR(4) DEFAULT AF DECLARE v_heures DECIMAL(72) DEFAULT 300 DECLARE v_nbpil SMALLINT SELECT v_nbpilEND

CALL testsp1()$+---------+| v_nbpil |+---------+| 2 |+---------+

SET vs_compa = NULL$SET vs_nompil = $SET vs_heures = $CREATE PROCEDURE testsp2()BEGIN END

CALL testsp2()$+---------------------------------+| resultat |+---------------------------------+| Plusieurs pilotes sont les plus expeacuterimenteacutes |+---------------------------------+-- Les variables de session sont -- toutes agrave NULL

SET vs_resultat = $CREATE PROCEDURE testsp3()BEGIN SET vs_resultat = END

CALL testsp3()$SELECT vs_resultat AS Reacutesultat$+-----------------+| Reacutesultat |+-----------------+| Complexe 7-2i |+-----------------+

Web

SET v_nbpil = bdsoutouEffectifsHeure(v_compav_heures)

CALL bdsoutouPlusExperimente(vs_compavs_nompilvs_heures)

bdsoutouEcritureComplexe(7-2)

4055_07_C07 Page 241 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

242 copy Eacuteditions Eyrolles

Sous-programmes imbriqueacutes

Il nrsquoest pas possible de creacuteer un sous-programme (nested subprogram) dans un autre sous-programme

Cela nrsquoest valable que pour les blocs drsquoinstructions qui peuvent eacuteventuellement en incluredrsquoautres (voir chapitre 6)

Le tableau suivant deacutecrit la deacuteclaration invalide du sous-programme Mouchard dans laproceacutedure imbriquee Ce sous-programme inseacutererait une ligne dans une table pour tracerlrsquoappel de la proceacutedure en fonction de lrsquoutilisateur et du moment de lrsquoexeacutecution

Tableau 7-3 Reacutecursiviteacute

Code MYSQL Commentaires

delimiter $CREATE FUNCTION factorielle(n INT) RETURNS INTBEGIN IF THEN RETURN (1) ELSE RETURN (n factorielle(n - 1)) END IFEND$

Condition de terminaison

Appel reacutecursif

SELECT AS Factorielle de 10$ERROR 1424 (HY000) Recursive stored routines are not allowed

Appel de la fonction

Web

n = 1

factorielle(10)

Tableau 7-4 Sous-programme imbriqueacute

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouimbriquee (INOUT p1 VARCHAR(2)) BEGIN

Deacuteclaration du sous-programme

CREATE PROCEDURE bdsoutouMouchard() BEGIN INSERT INTO testTrace VALUES (CONCAT(USER() a lanceacute imbriquee le SYSDATE())) END

Deacuteclaration du sous-programme imbriqueacute

SET p1 = OK Deacutebut du sous-programme CALL bdsoutouMouchard()END$

Appel du sous-programme imbriqueacute

Web

4055_07_C07 Page 242 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 243

chapitre ndeg 7 Programmation avanceacutee

La compilation renvoie un message drsquoerreur tregraves clair

ERROR 1303 (2F003) Cant create a PROCEDURE from within another

stored routine

La solution est de creacuteer les deux proceacutedures agrave part ou drsquoinclure un bloc BEGINhellip END dans laproceacutedure de plus haut niveau

Modification drsquoun sous-programme

La modification drsquoun sous-programme srsquoexeacutecute par la commande ALTER Pour pouvoirchanger un sous-programme si vous nrsquoecirctes pas son creacuteateur vous devez deacutetenir le privilegravegeALTER ROUTINE sur la base de donneacutees (ou au niveau global) Plusieurs caracteacuteristiquespeuvent ecirctre corrigeacutees en une seule instruction (mais ni le code ni les paramegravetres) La syntaxegeacuteneacuterale est la suivante

ALTER PROCEDURE | FUNCTION [nomBase]nomSousProg

[ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA

| SQL SECURITY DEFINER | INVOKER

| COMMENT commentaire

]

Lrsquoinstruction suivante commente le sous-programme Mouchard preacutesent dans la basebdsoutou en indiquant qursquoil interagit avec la base en eacutecriture et qursquoil srsquoexeacutecutera avec lesprivilegraveges de lrsquoaccegraves utilisateur qui lrsquoa creacuteeacute

ALTER PROCEDURE bdsoutouMouchard

MODIFIES SQL DATA

SQL SECURITY DEFINER

COMMENT Traces de qui lance quoi

Destruction drsquoun sous-programme

Pour supprimer un sous-programme si vous nrsquoecirctes pas son creacuteateur le privilegravege ALTERROUTINE est requis sur la base de donneacutees (ou au niveau global) La syntaxe de suppressiondrsquoun sous-programme est la suivante

DROP PROCEDURE | FUNCTION [IF EXISTS] [nomBase]nomSousProg

IF EXISTS eacutevite un message de warning si le sous-programme nrsquoexiste pas

Les instructions suivantes suppriment la proceacutedure catalogueacutee Mouchard de la base bdsou-tou

delimiter

DROP PROCEDURE bdsoutouMouchard

4055_07_C07 Page 243 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

244 copy Eacuteditions Eyrolles

Restrictions

Les restrictions que nous mentionnons ici srsquoappliquent eacutegalement aux deacuteclencheurs (eacutetudieacutesen fin de ce chapitre) Bien qursquoil existe des restrictions qui srsquoappliquent seulement aux fonc-tions et aux deacuteclencheurs elles peuvent srsquoappliquer agrave une proceacutedure si cette derniegravere est appe-leacutee dans le code de la fonction ou du deacuteclencheur

bull Les instructions suivantes ne peuvent ecirctre preacutesentes dans un sous-programme CHECKTABLES LOCK TABLES UNLOCK TABLES LOAD DATA LOAD TABLE et OPTIMIZE TABLE

bull Il nrsquoest pas possible de programmer des instructions SQL en dynamique (PREPARE EXE-CUTE DEALLOCATE PREPARE) dans un deacuteclencheur (possible dans une fonction ou uneproceacutedure)

bull Il nrsquoy a pas encore drsquooutil de deacutebogage pour les sous-programmes

bull Les instructions CALL ne peuvent ecirctre preacutepareacutees agrave lrsquoavance (CALL variable)

bull MySQL ne prend pas encore en charge la notion de paquetage (package) qui est un moduleregroupant plusieurs objets (variables exceptions curseurs fonctions ou proceacutedures) four-nissant un ensemble de services (un peu comme une classe dans lrsquoapproche objet)

Curseurs

Les curseurs sont tregraves utiliseacutes pour ne pas dire qursquoils sont omnipreacutesents dans toute applicationimportante Le concept analogue au niveau de JDBC est programmeacute agrave lrsquoaide de la classeResultset et sous ASP de Microsoft agrave lrsquoaide de la classe RecordSet (appeleacutee DataSetavec Net)

MySQL nrsquoest compatible qursquoavec des curseurs en lecture seulement non navigables nonmodifiables et non dynamiques

Geacuteneacuteraliteacutes

Un curseur est une zone meacutemoire qui est geacuteneacutereacutee cocircteacute serveur (mise en cache) et qui permet detraiter individuellement chaque ligne renvoyeacutee par un SELECT Un sous-programme peuttravailler avec plusieurs curseurs en mecircme temps Un curseur durant son existence (delrsquoouverture agrave la fermeture) contient en permanence lrsquoadresse de la ligne courante

La figure suivante illustre la manipulation de base drsquoun curseur Le curseur est deacutecrit apregraves lesvariables Il est ouvert dans le code du programme il srsquoeacutevalue alors et va se charger enextrayant les donneacutees de la base Le programme peut parcourir tout le curseur en reacutecupeacuterantles lignes une par une dans une variable locale Le curseur est ensuite fermeacuteLes curseurs doivent ecirctre deacuteclareacutes apregraves les variables et avant les exceptions

4055_07_C07 Page 244 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 245

chapitre ndeg 7 Programmation avanceacutee

Il nrsquoexiste pour lrsquoinstant qursquoune seule maniegravere de parcourir un curseur du premier au dernierenregistrement

Instructions

Les instructions disponibles pour travailler avec des curseurs sont deacutefinies dans le tableausuivant

Figure 7-3 Principes drsquoun curseur

CREATE PROCEDURE nomSousProgramme [( )]

BEGIN

DECLARE v2 DECLARE v3

DECLARE CURSOR curs1 FOR SELECT brevetnbhVol comp

FROM Pilote WHERE comp = lsquoAFrsquo

OPEN curs1

FETCH curs1 INTO v1v2v3

END

$

curs1

PL -1 2450 AF PL -2 900 AF PL -5 200 AF

v1 v2 v3

PL -1 2450 AF

Curseur

DECLARE v1

Tableau 7-5 Instructions pour les curseurs

Instructions Commentaires et exemples

CURSOR FOR requecircte Deacuteclaration du curseur DECLARE curs1 CURSOR FOR SELECT brevetnbHVolcomp FROM bdsoutouPilote WHERE comp = AF

OPEN nomCurseur Ouverture du curseur (chargement des lignes) Aucune exception nrsquoestleveacutee si la requecircte ne ramegravene aucune ligne OPEN curs1

FETCH nomCurseur INTO listeVariables

Positionnement sur la ligne suivante et chargement de lrsquoenregistrementcourant dans une ou plusieurs variables FETCH curs1 INTO var1var2var3

CLOSE nomCurseur Ferme le curseur Lrsquoexception laquo ERROR 1326 (24000) Cursor isnot open raquo se deacuteclenche si des accegraves au curseur sont opeacutereacutes apregravessa fermeture CLOSE curs1

4055_07_C07 Page 245 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

246 copy Eacuteditions Eyrolles

Parcours drsquoun curseur

Vous pouvez choisir drsquoutiliser une structure reacutepeacutetitive tant que ou reacutepeacuteter Le tableau suivantpreacutesente le parcours drsquoun curseur agrave lrsquoaide de ces deux techniques Ici il srsquoagit de faire lasomme des heures de vol des pilotes de la compagnie de code AF

Notez lrsquoutilisation obligatoire drsquoune exception (handler dans le vocable de MySQL) qui forcele programme agrave continuer si on arrive en fin du curseur (au-delagrave du dernier enregistrement)tout en positionnant la variable curs1 agrave vrai (1) Je dis laquo obligatoire raquo car MySQL nepropose pas pour lrsquoheure de fonctions sur les curseurs (FOUND NOT_FOUND IS_CLOSEDetc) Nous eacutetudierons plus en deacutetail les exceptions dans la prochaine section

Personnellement je preacutefegravere la programmation avec un tant que Lrsquoappel de cette proceacutedure(avec lrsquoune ou lrsquoautre des techniques) sur la table de la figure 7-2 produira le reacutesultat suivant

+---------------------------------------+

| Total heures pour les pilotes de AF |

+---------------------------------------+

| 355000 |

+---------------------------------------+

Tableau 7-6 Parcours drsquoun curseur

Tant que Reacutepeacuteter

DECLARE fincurs1 BOOLEAN DEFAULT 0DECLARE v_nbHv DECIMAL(72)DECLARE v_tot DECIMAL(82) DEFAULT 0

DECLARE CONTINUE HANDLER FOR NOT FOUND SET fincurs1 = 1

REPEAT IF NOT fincurs1 THEN SET v_tot = v_tot+v_nbHv END IF UNTIL fincurs1 END REPEAT

WHILE (NOT fincurs1) DO SET v_tot = v_tot+v_nbHv END WHILE

SELECT v_tot AS Total heures pour les pilotes de AF

Web

DECLARE curs1 CURSOR FORSELECT nbHVol FROM bdsoutouPilote WHERE comp = AF

OPEN curs1

FETCH curs1 INTO v_nbHv FETCH curs1 INTO v_nbHv

FETCH curs1 INTO v_nbHv

CLOSE curs1

4055_07_C07 Page 246 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 247

chapitre ndeg 7 Programmation avanceacutee

Accegraves concurrents (FOR UPDATE)

Si vous voulez verrouiller les lignes drsquoune table interrogeacutee par un curseur dans le but de mettreagrave jour la table sans qursquoun autre utilisateur ne la modifie en mecircme temps il faut utiliser laclause FOR UPDATE Elle srsquoemploie lors de la deacuteclaration du curseur et verrouille les lignesconcerneacutees degraves lrsquoouverture du curseur Les verrous sont libeacutereacutes agrave la fin de la transaction

Il est souvent inteacuteressant de pouvoir modifier facilement la ligne courante drsquoun curseur(UPDATE ou DELETE) agrave reacutepercuter au niveau de la table Il est conseilleacute drsquoutiliser un curseurFOR UPDATE pour verrouiller les lignes agrave actualiser

Le tableau suivant deacutecrit un bloc qui se sert du curseur FOR UPDATE pour

augmenter le nombre drsquoheures de 100 pour les pilotes de la compagnie de code AF

diminuer ce nombre de 100 pour les pilotes de la compagnie de code SING

supprimer les pilotes des autres compagnies

Tableau 7-7 Curseur avec verrouillage explicite

Code MySQL Commentaires

BEGIN DECLARE fincurs BOOLEAN DEFAULT 0 DECLARE v_brevet VARCHAR(6) DECLARE v_nbHv DECIMAL(72) DECLARE v_comp VARCHAR(4) DECLARE CONTINUE HANDLER FOR NOT FOUND SET fincurs = 1SET AUTOCOMMIT = 0OPEN cursFETCH curs INTO v_brevetv_nbHvv_compWHILE (NOT fincurs) DO IF (v_comp=AF) THEN UPDATE bdsoutouPilote SET nbHVol = nbHVol + 100 WHERE brevet = v_brevet ELSEIF (v_comp=SING) THEN UPDATE bdsoutouPilote SET nbHVol = nbHVol - 100 WHERE brevet = v_brevet ELSE DELETE FROM bdsoutouPilote WHERE brevet = v_brevet END IF FETCH curs INTO v_brevetv_nbHvv_comp END WHILECLOSE cursCOMMIT

Deacuteclaration du curseur avec verrou

Chargement et parcours du curseur

Mise agrave jour de la table Pilote par lrsquointermeacutediaire du curseur

Validation de la transaction

Web

DECLARE curs CURSOR FORSELECT brevetnbHVolcompFROM bdsoutouPilote FOR UPDATE

4055_07_C07 Page 247 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

248 copy Eacuteditions Eyrolles

Restrictions

bull Une validation (COMMIT) avant la fermeture drsquoun curseur FOR UPDATE aura des effets debord facirccheux

bull Il nrsquoest pas possible de deacuteclarer un curseur FOR UPDATE en utilisant dans la requecircte lesdirectives DISTINCT ou GROUP BY un opeacuterateur ensembliste ou une fonction drsquoagreacutegat

bull Il nrsquoexiste pas encore de directive WHERE CURRENT OF pour modifier lrsquoenregistrement cou-rant drsquoun curseur avec verrou

bull Un curseur comme un tableau ne peut pas ecirctre passeacute en paramegravetre drsquoun sous-programmeni en entreacutee (IN) ni en sortie (OUT)

Exceptions

Afin drsquoeacuteviter qursquoun programme ne srsquoarrecircte degraves la premiegravere erreur suite agrave une instruction SQL(SELECT ne retournant aucune ligne INSERT ou UPDATE drsquoune valeur incorrecte DELETEdrsquoun enregistrement laquo pegravere raquo ayant des enregistrements laquo fils raquo associeacutes etc) il est indispen-sable de preacutevoir les cas potentiels drsquoerreurs et drsquoassocier agrave chacun de ces cas la programmationdrsquoune exception (handler dans le vocabulaire de MySQL)

Dans le langage des informaticiens on dit qursquoon garde la main pendant lrsquoexeacutecution duprogramme Le meacutecanisme des exceptions (handling errors) est largement utiliseacute par tous lesdeacuteveloppeurs car il est preacutepondeacuterant dans la mise en œuvre des transactions Les exceptionspeuvent se parameacutetrer dans un sous-programme (fonction ou proceacutedure catalogueacutee) ou undeacuteclencheur

Geacuteneacuteraliteacutes

Une exception MySQL correspond agrave une condition drsquoerreur et peut ecirctre associeacutee agrave un identifi-cateur (exception nommeacutee) Une exception est deacutetecteacutee (aussi dite laquo leveacutee raquo) si elle est preacutevuedans un handler au cours de lrsquoexeacutecution drsquoun bloc (entre BEGIN et END) Une fois leveacutee ellefait continuer (ou sortir du bloc) le programme apregraves avoir reacutealiseacute une ou plusieurs instructionsque le programmeur aura explicitement speacutecifieacutees

La figure suivante illustre les deux meacutecanismes qui peuvent ecirctre mis en œuvre pour geacuterer uneexception (seuls CONTINUE et EXIT sont actuellement pris en charge par MySQL) Suppo-sons que lrsquoextraction ne ramegravene aucune ligne on peut programmer la sortie du bloc courant oucontinuer dans le bloc Supposons que lrsquoinsertion deacuteclenche une erreur on peut eacutegalementdeacutecider de sortir ou de poursuivre le traitement

4055_07_C07 Page 248 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 249

chapitre ndeg 7 Programmation avanceacutee

Si aucune erreur ne se produit le traitement se termine ou retourne agrave son appelant srsquoil srsquoagitdrsquoun sous-programme lanceacute drsquoun programme principal La syntaxe geacuteneacuterale drsquoune exceptionest la suivante Les exceptions doivent ecirctre deacuteclareacutees de preacutefeacuterence apregraves les variables et avantles curseurs

DECLARE CONTINUE | EXIT | UNDO

HANDLER FOR

SQLSTATE [VALUE] lsquovaleur_sqlstatersquo | nomException | SQLWARNING

| NOT FOUND | SQLEXCEPTION | code_erreur_mysql

instructions MySQL

[ SQLSTATE ]

La directive CONTINUE (appeleacutee handler) force agrave poursuivre lrsquoexeacutecution de programmelorsqursquoil se passe un eacuteveacutenement preacutevu dans la clause FOR

Le handler EXIT fait sortir lrsquoexeacutecution du bloc courant (entre BEGIN et END)

Le handler UNDO nrsquoest pas encore reconnu Agrave son nom on se doute de son utiliteacute agrave savoirdeacutefaire les instructions SQL qui auront eacuteteacute exeacutecuteacutees (sans avoir eacuteteacute valideacutees par un COMMIT)avant que lrsquoexception ne se deacuteclenche

SQLSTATE permet de couvrir toutes les erreurs drsquoun eacutetat donneacute

nomException srsquoapplique agrave la gestion des exceptions nommeacutees (eacutetudieacutees plus loin)

SQLWARNING permet de couvrir toutes les erreurs drsquoeacutetat SQLSTATE deacutebutant par 01

NOT FOUND permet de couvrir toutes les erreurs drsquoeacutetat SQLSTATE deacutebutant par 02

Figure 7-4 Principe geacuteneacuteral des exceptions

BEGIN

DECLARE CONTINUE | EXIT | UNDO

HANDLER FOR

SQLSTATE v | SQLEXCEPTION | NOT FOUND | erreurMySQL hellip

BEGIN

SELECT INTO FROM

INSERT

END

END

NOT FOUND

EXIT

CONTINUE

CONTINUE

EXITSQLEXCEPTION

4055_07_C07 Page 249 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

250 copy Eacuteditions Eyrolles

SQLEXCEPTION gegravere toutes les erreurs qui ne sont ni geacutereacutees par SQLWARNING ni par NOTFOUND

instructions MySQL une ou plusieurs instructions du langage de MySQL (blocappel possibles par CALL drsquoune fonction ou drsquoune proceacutedure catalogueacutee)

Il est possible de grouper plusieurs deacuteclarations drsquoexceptions ainsi que de preacutevoir plusieursconditions pour une mecircme exception En plus de pouvoir tester des erreurs pour tel ou tel eacutetat(SQLSTATE) nous verrons que lrsquoon peut reacutecupeacuterer une erreur de code donneacute (paramegravetrecode_erreur_mysql) Par exemple ERROR 1046 deacutesigne la non seacutelection drsquoune base dedonneacutees (1046 devra ecirctre eacutecrit en lieu et place de code_erreur_mysql)

Restrictions

Il nrsquoest pas encore possible de deacuterouter volontairement lrsquoexeacutecution drsquoun sous-programme aveccertaines conditions par lrsquointermeacutediaire drsquoune instruction speacutecifique comme RAISE ou RESI-GNAL Lrsquoexception serait ainsi manuellement deacuteclencheacutee et pourrait ecirctre deacutefinie par le program-meur (par exemple la condition PILOTE_TROP_JEUNE si lrsquoacircge drsquoun pilote est infeacuterieur agrave20 ans)

Il nrsquoest pas non plus permis de deacuteclarer ses propres exceptions (par exemple pour pouvoirdeacuterouter le sous-programme si lrsquoacircge drsquoun pilote est infeacuterieur agrave une valeur donneacutee)

Eacutetudions agrave preacutesent les diffeacuterents types drsquoexceptions en programmant des proceacutedures simplesinterrogeant la table Pilote illustreacutee agrave la figure 7-2

Exceptions avec EXITExaminons la clause EXIT de lrsquoinstruction DECLARE HANDLER agrave travers un exemple

Gestion de NOT FOUND

Le tableau suivant deacutecrit une proceacutedure qui gegravere une erreur aucun pilote nrsquoest associeacute agrave lacompagnie de code passeacute en paramegravetre (NOT FOUND) La proceacutedure ne se termine pas correc-tement si plusieurs lignes sont retourneacutees (erreur Result consisted of more thanone row)

4055_07_C07 Page 250 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 251

chapitre ndeg 7 Programmation avanceacutee

La trace drsquoune exeacutecution correcte de cette proceacutedure (si la requecircte retourne une seule ligne laproceacutedure ne passe pas dans le si) est la suivante

CALL bdsoutouprocException1(CAST)$

+--------------------------------------------------------+

| Resultat procException1 |

+--------------------------------------------------------+

| Le seul pilote de la compagnie CAST est Sonia Dietrich |

+--------------------------------------------------------+

Une autre exeacutecution correcte de cette proceacutedure (qui se deacuteroute hors du bloc du fait de NOTFOUND) est la suivante

CALL bdsoutouprocException1(RIEN)$

+-----------------------------------------------+

| Resultat procException1 |

+-----------------------------------------------+

| Il ny a pas de pilote pour la compagnie RIEN |

+-----------------------------------------------+

Tableau 7-8 Exception NOT FOUND traiteacutee avec EXIT

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 END IFEND

Deacuteclaration de la proceacutedure et des variables

Bloc qui deacuteclare lrsquoexception

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Affichage du reacutesultat

Fin du blocGestion de lrsquoerreur

Fin de la proceacutedure

Web

BEGIN SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END

DECLARE EXIT HANDLER FOR NOT FOUNDSET flagNOTFOUND =1

4055_07_C07 Page 251 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

252 copy Eacuteditions Eyrolles

Gestion drsquoune erreur particuliegravere

Le tableau suivant deacutecrit une ameacutelioration de la preacuteceacutedente proceacutedure par le fait de geacutererlrsquoerreur particuliegravere permettant de savoir si la requecircte renvoie plusieurs lignes (ERROR 1172(42000) Result consisted of more than one row) La proceacutedure se terminemaintenant correctement si la requecircte retourne une seule ligne ou plusieurs (message person-naliseacute en sortie de bloc)

La trace drsquoune exeacutecution correcte de cette proceacutedure (qui se deacuteroute hors du bloc du fait deplusieurs lignes retourneacutees) est la suivante

Tableau 7-9 Exceptions 1172 et NOT FOUND traiteacutees avec EXIT

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagPlusDun BOOLEAN DEFAULT 0 DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 END IF IF flagPlusDun THEN SELECT CONCAT(Il y a plusieurs pilotes pour la compagnie p_comp) AS Resultat procException1 END IFEND

Deacuteclaration de la proceacutedure et des variables

Bloc qui deacuteclare les deux exceptions

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Affichage du reacutesultat

Fin du bloc

Gestion des erreurs

Fin de la proceacutedure

Web

BEGIN DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND =1

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END

DECLARE EXIT HANDLER FOR 1172SET flagPlusDun =1

4055_07_C07 Page 252 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 253

chapitre ndeg 7 Programmation avanceacutee

CALL bdsoutouprocException1(AF)$

+-----------------------------------------------+

| Resultat procException1 |

+-----------------------------------------------+

| Il y a plusieurs pilotes pour la compagnie AF |

+-----------------------------------------------+

Appel drsquoune proceacutedure dans lrsquoexception

Le tableau suivant deacutecrit lrsquoappel drsquoune proceacutedure dans le cas de lrsquoerreur NOT FOUND La proceacute-dure principale exeacutecute le sousndashprogramme puis sort du bloc principal et se termine correctement

La trace drsquoune exeacutecution correcte de cette proceacutedure (qui se deacuteroute vers le sous-programmeappeleacute du fait de NOT FOUND) est la suivante

+-----------------------------------------------+

| Resultat procpasTrouve |

+-----------------------------------------------+

| Il ny a pas de pilote pour la compagnie RIEN |

+-----------------------------------------------+

Il est aiseacute de transposer ce raisonnement agrave plusieurs exceptions appelant diffeacuterents sous-programmes

Tableau 7-10 Exception NOT FOUND traiteacutee avec EXIT et CALL

Code MySQL Commentaires

CREATE PROCEDURE bdsoutoupasTrouve (IN p_comp VARCHAR(4)) BEGIN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procpasTrouveEND

Codage du sous-programme appeleacute lors de lrsquoexception

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE var1 VARCHAR(20)

Proceacutedure qui deacuteclare lrsquoexception

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp = p_comp SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1

Requecircte pouvant deacuteclencher lrsquoexception preacutevueAffichage du reacutesultat

END Fin de la proceacutedure principale

Web

DECLARE EXIT HANDLER FOR NOT FOUNDCALL bdsoutoupasTrouve(p_comp)

4055_07_C07 Page 253 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

254 copy Eacuteditions Eyrolles

Exceptions avec CONTINUEEacutetudions agrave preacutesent la clause CONTINUE de lrsquoinstruction DECLARE HANDLER

Gestion de NOT FOUND

Le tableau suivant deacutecrit la mecircme proceacutedure geacuterant lrsquoerreur NOT FOUND La proceacutedure setermine correctement si la requecircte retourne une seule ligne mais pas lorsqursquoelle en renvoieplusieurs (erreur Result consisted of more than one row)

Gestion drsquoune erreur particuliegravere

Le tableau suivant deacutecrit la mecircme proceacutedure qui gegravere en plus lrsquoerreur Result consistedof more than one row La proceacutedure se termine correctement si la requecircte retourne uneseule ou plusieurs lignes

Tableau 7-11 Exception NOT FOUND traiteacutee avec CONTINUE

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

Deacuteclaration de la proceacutedure et des variables

Bloc qui deacuteclare lrsquoexception

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 ELSE SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END IF

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Test de gestion de lrsquoerreur

Affichage du reacutesultat

END Fin de la proceacutedure

Web

DECLARE CONTINUE HANDLER FOR NOT FOUNDSET flagNOTFOUND =1

4055_07_C07 Page 254 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 255

chapitre ndeg 7 Programmation avanceacutee

Gestion des autres erreurs (SQLEXCEPTION)

Si une erreur non preacutevue en tant qursquoexception (dans les clauses DECLARE HANDLER) seproduisait le programme se terminerait anormalement en renvoyant lrsquoerreur en question Ladirective SQLEXCEPTION couvre toutes les erreurs qui ne sont administreacutees ni par SQLWAR-NING ni par NOT FOUND

Dans notre exemple (seacutelection drsquoune colonne drsquoune table) seule une erreur laquo interne raquo pour-rait eacuteventuellement se produire (base de donneacutees ou table inexistante colonne de la tableinexistante ou drsquoun type diffeacuterent de VARCHAR(4) ou autre erreur systegraveme)

MySQL ne permet pas pour lrsquoinstant de reacutecupeacuterer dynamiquement au sein drsquoun sous-pro-gramme le code et le message de lrsquoerreur associeacutee agrave une exception leveacutee suite agrave une instruc-tion SQL et qui nrsquoa pas eacuteteacute preacutevue dans un handler

Tableau 7-12 Exceptions 1172 et NOT FOUND traiteacutees avec CONTINUE

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE flagPlusDun BOOLEAN DEFAULT 0 DECLARE var1 VARCHAR(20)

Deacuteclaration de la proceacutedure et des variables

DECLARE CONTINUE HANDLER FOR NOT FOUND SET flagNOTFOUND =1

Bloc qui deacuteclare les deux exceptions

SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp=p_comp

IF flagNOTFOUND THEN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat procException1 ELSEIF flagPlusDun THEN SELECT CONCAT(Il y a plusieurs pilotes pour la compagnie p_comp) AS Resultat procException1 ELSE SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1 END IF

Requecircte pouvant deacuteclencher lrsquoexception preacutevue

Test de gestion des erreurs

Affichage du reacutesultat

END Fin de la proceacutedure

Web

DECLARE CONTINUE HANDLER FOR 1172SET flagPlusDun =1

4055_07_C07 Page 255 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

256 copy Eacuteditions Eyrolles

En drsquoautres termes il faudra soit

interrompre brusquement votre proceacutedure avec diffeacuterents cas drsquoerreurs pour lister lescodes erreur geacuteneacutereacutes en sortie

vous contenter de geacuterer globalement les autres exceptions tout en ne sachant pas de quel-les erreurs il srsquoagit

Le tableau suivant deacutecrit la preacuteceacutedente proceacutedure qui controcircle en plus toutes les autres erreursnon preacutevues en appelant le sous-programme autreErreur()

Tableau 7-13 Exceptions toutes traiteacutees avec EXIT et SQLEXCEPTION

Code MySQL Commentaires

CREATE PROCEDURE bdsoutoutropdeLignes (IN p_comp VARCHAR(4))BEGIN SELECT CONCAT(Il y a plusieurs pilotes pour la compagnie p_comp) AS Resultat tropdeLignesEND

Codage des sous-programmesappeleacutes lors des exceptions

CREATE PROCEDURE bdsoutoupasTrouve (IN p_comp VARCHAR(4)) BEGIN SELECT CONCAT(Il ny a pas de pilote pour la compagnie p_comp) AS Resultat pasTrouveEND

CREATE PROCEDURE bdsoutouautreErreur()BEGIN SELECT Erreur mais laquelle AS Resultat autreErreur 3 casEND

CREATE PROCEDURE bdsoutouprocException1 (IN p_comp VARCHAR(4)) BEGIN DECLARE var1 VARCHAR(20) DECLARE EXIT HANDLER FOR 1172 CALL bdsoutoutropdeLignes(p_comp) DECLARE EXIT HANDLER FOR NOT FOUND CALL bdsoutoupasTrouve(p_comp) SELECT nom INTO var1 FROM bdsoutouPilote WHERE comp = p_comp SELECT CONCAT(Le seul pilote de la compagnie p_comp est var1) AS Resultat procException1

Proceacutedure principale qui deacuteclareles deux exceptions et toutes lesautres

Requecircte pouvant deacuteclencherlrsquoexception preacutevueAffichage du reacutesultat

END Fin de la proceacutedure

Web

DECLARE EXIT HANDLER FOR SQLEXCEPTIONCALL bdsoutouautreErreur()

4055_07_C07 Page 256 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 257

chapitre ndeg 7 Programmation avanceacutee

La trace drsquoune exeacutecution de cette proceacutedure (quelle que soit la valeur du paramegravetre passeacute enentreacutee) suite agrave la suppression de la table Pilote dans la base bdsoutou est la suivante

CALL bdsoutouprocException1(AF)$

+-----------------------+

| Resultat autreErreur |

+-----------------------+

| Erreur mais laquelle |

+-----------------------+

Mecircme erreur sur diffeacuterentes instructions

Plusieurs cas de figure sont possibles suivant qursquoon deacutesire maicirctriser une exception ou terminertoutes les exceptions avant la fin du sous-programme

Gestion drsquoune seule exception

Le tableau suivant deacutecrit une proceacutedure qui gegravere deux fois lrsquoerreur non trouveacutee (NOT FOUND)sur deux requecirctes distinctes La premiegravere requecircte extrait le nom du pilote de code passeacute en para-megravetre La deuxiegraveme donne le nom du pilote ayant un nombre drsquoheures de vol eacutegal agrave celui passeacuteen paramegravetre Le sous-programme se termine correctement si les deux requecirctes ne retournentqursquoun seul enregistrement Les autres erreurs potentielles ne sont pas prises en compte

Le principe est drsquoutiliser une variable indiquant quelle est la requecircte qui a fait sortir du blocpar lrsquoexception leveacutee

Exeacutecutons cette proceacutedure avec diffeacuterents paramegravetres on obtient

CALL bdsoutouprocException2(PL-1 1000)$

+------------------------------------------------------+

| CONCAT(Le pilote de code p_brevet est v_nom) |

+------------------------------------------------------+

| Le pilote de code PL-1 est Gilles Laborde |

+------------------------------------------------------+

+----------------------------------------------------------------+

| CONCAT(Le pilote ayant p_heures heures de vol est v_nom) |

+----------------------------------------------------------------+

| Le pilote ayant 1000 heures de vol est Florence Peacuterissel |

+----------------------------------------------------------------+

CALL bdsoutouprocException2(PL-0 2450)$

+-----------------------------------------------+

| CONCAT(Pas de pilote de brevet p_brevet) |

+-----------------------------------------------+

| Pas de pilote de brevet PL-0 |

+-----------------------------------------------+

4055_07_C07 Page 257 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

258 copy Eacuteditions Eyrolles

Dans cette proceacutedure une erreur sur la premiegravere requecircte interrompt le programme (apregraves avoirtraiteacute lrsquoexception) et de ce fait la deuxiegraveme requecircte nrsquoest pas eacutevalueacutee Pour cela il est inteacuteres-sant drsquoutiliser des blocs imbriqueacutes pour poursuivre le traitement apregraves avoir traiteacute une ouplusieurs exceptions

Gestion de plusieurs exceptions

Le tableau suivant deacutecrit une proceacutedure qui traite toutes les mecircmes exceptions en seacutequenceCe meacutecanisme permet de continuer lrsquoexeacutecution apregraves que MySQL a leveacute une exception Danscette proceacutedure les deux requecirctes sont eacutevalueacutees indeacutependamment du reacutesultat retourneacute parchacune drsquoelles

Tableau 7-14 Une exception NOT FOUND traiteacutee pour deux instructions

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException2 (IN p_brevet VARCHAR(6)IN p_heures DECIMAL(72)) BEGIN DECLARE v_nom VARCHAR(20) DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 DECLARE v_requete TINYINT

IF flagNOTFOUND THEN IF v_requete = 1 THEN SELECT CONCAT(Pas de pilote de brevet p_brevet) ELSEIF v_requete = 2 THEN SELECT CONCAT(Pas de pilote ayant ce nombre dheures de vol p_heures) END IF END IFEND

Bloc avec les requecirctes deacuteclenchant potentiellement une exception preacutevue

Traitement pour savoir quelle requecircte a provoqueacute lrsquoexception

Web

BEGIN

SET v_requete = 1 SELECT nom INTO v_nom FROM bdsoutouPilote WHERE brevet = p_brevet SELECT CONCAT(Le pilote de code p_brevet est v_nom) SET v_requete = 2 SELECT nom INTO v_nom FROM bdsoutouPilote WHERE nbHVol = p_heures SELECT CONCAT(Le pilote ayant p_heures heures de vol est v_nom) END

DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND =1

4055_07_C07 Page 258 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 259

chapitre ndeg 7 Programmation avanceacutee

Lrsquoexeacutecution suivante de cette proceacutedure deacuteclenche les deux exceptions (ce qui nrsquoeacutetait pas lecas dans la proceacutedure preacuteceacutedente)

CALL bdsoutouprocException3(PL-0 500)$

+-----------------------------------------------+

| CONCAT(Pas de pilote de brevet p_brevet) |

+-----------------------------------------------+

| Pas de pilote de brevet PL-0 |

+-----------------------------------------------+

+-----------------------------------------------------------------+

| CONCAT(Pas de pilote ayant ce nombre dheures de vol p_heures) |

+-----------------------------------------------------------------+

| Pas de pilote ayant ce nombre dheures de vol 500 |

+-----------------------------------------------------------------+

Il resterait agrave programmer lrsquoexception ERROR 1172 (Result consisted of morethan one row) pour geacuterer au niveau de la seconde requecircte lrsquoextraction de plusieurs pilotes

Tableau 7-15 Exceptions NOT FOUND toutes traiteacutees

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocException3 (IN p_brevet VARCHAR(6)IN p_heures DECIMAL(72))BEGIN DECLARE v_nom VARCHAR(20) DECLARE flagNOTFOUND BOOLEAN DEFAULT 0 SELECT nom INTO v_nom FROM bdsoutouPilote WHERE brevet = p_brevet IF flagNOTFOUND THEN SELECT CONCAT(Pas de pilote de brevet p_brevet) SET flagNOTFOUND = 0 ELSE SELECT CONCAT(Le pilote de code p_brevet est v_nom) END IF

Gestion de lrsquoexception de la premiegravere requecircte

SELECT nm INTO v_nom FROM bdsoutouPilote WHERE nbHVol = p_heures IF flagNOTFOUND THEN SELECT CONCAT(Pas de pilote ayant ce nombre d heures de vol p_heures) ELSE SELECT CONCAT(Le pilote ayant p_heures heures de vol est v_nom) END IFEND

Gestion de lrsquoexception de la deuxiegraveme requecircte

Web

DECLARE CONTINUE HANDLER FOR NOT FOUNDSET flagNOTFOUND = 1

4055_07_C07 Page 259 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

260 copy Eacuteditions Eyrolles

ayant un mecircme nombre drsquoheures de vol Deux solutions srsquooffrent agrave vous dans un sous-blocavec EXIT ou dans le mecircme bloc avec un CONTINUE et une variable pour tester lrsquoeacuteventuelleredirection

Afin de deacuteclarer drsquoautres exceptions il faut consulter la liste des erreurs dans la documentationofficielle (Appendix B Error Codes and Messages) de maniegravere agrave connaicirctre le numeacutero drsquoerreurMySQL (paramegravetre code_erreur_mysql dans la syntaxe DECLARE HANDLER)

Vous pouvez aussi eacutecrire un bloc qui programme volontairement lrsquoerreur pour voir sous lrsquointer-face de commande le numeacutero que MySQL renvoie

Exceptions nommeacutees

Pour intercepter une erreur MySQL et lui attribuer au passage un identificateur il faut utiliserla clause DECLARE CONDITION La syntaxe est la suivante

Deacuteclaration

DECLARE nomException CONDITION FOR

SQLSTATE [VALUE] lsquovaleur_sqlstatersquo | code_erreur_mysql

Il est ainsi possible de regrouper plusieurs types drsquoerreurs (avec SQLSTATE ou cibler une erreuren particulier en indiquant le code erreur de MySQL) Une fois lrsquoexception nommeacutee il est possi-ble de lrsquoutiliser dans la deacuteclaration de lrsquoeacuteveacutenement associeacute via la directive DECLARE HANDLER

Deacuteclenchement

Consideacuterons les deux tables suivantes La colonne comp de la table Pilote est une cleacute eacutetran-gegravere vers la table Compagnie Programmons une proceacutedure qui supprime une compagnie decode passeacute en paramegravetre

Le tableau suivant deacutecrit la proceacutedure procExceptionNommee qui intercepte une erreurreacutefeacuterentielle (SQLSTATE agrave 23 000) Il srsquoagit de controcircler le programme si la compagnie agravedeacutetruire est encore rattacheacutee agrave un enregistrement reacutefeacuterenceacute dans la table Pilote

Figure 7-5 Deux tables

Compagnie

comp ville nomComp

AF Paris Air FranceSING Singapour Singapore AL

CAST Blagnac Castanet AL EJET Dublin Easy Jet

Pilote

brevet nom nbHVol comp

PL-1 Gilles Laborde 2450 AF PL-2 Freacutedeacuteric DAlmeyda 900 AF PL-3 Florence Peacuterissel 1000 SING PL-4 Thierry Millan 2450 CAST PL-5 Christine Royo 200 AF PL-6 Aureacutelia Ente 2450 SINGagrave deacutetruire

4055_07_C07 Page 260 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 261

chapitre ndeg 7 Programmation avanceacutee

Les traces de lrsquoexeacutecution de cette proceacutedure sont les suivantes Notez que si on appelle cetteproceacutedure en passant en paramegravetre une compagnie inexistante le sous-programme se terminenormalement sans passer dans la section drsquoerreur

CALL bdsoutouprocExceptionNommee(AF)$

+-----------------------------------------------------+

| Resultat procExceptionNommee |

+-----------------------------------------------------+

| Deacutesoleacute il reste encore un pilote agrave la compagnie AF |

+-----------------------------------------------------+

CALL bdsoutouprocExceptionNommee(EJET)$

+------------------------------+

| Resultat procExceptionNommee |

+------------------------------+

| Compagnie EJET deacutetruite |

+------------------------------+

Tableau 7-16 Programmation drsquoune exception nommeacutee

Code MySQL Commentaires

CREATE PROCEDURE bdsoutouprocExceptionNommee (IN p_comp VARCHAR(4))BEGIN DECLARE flagerr BOOLEAN DEFAULT 0

Deacuteclaration de lrsquoexception nommeacutee

Corps du traitement (valida-tion)

BEGIN DECLARE EXIT HANDLER FOR SET flagerr =1 SET AUTOCOMMIT=0 DELETE FROM Compagnie WHERE comp = p_comp SELECT CONCAT(Compagnie p_comp deacutetruite) AS Resultat procExceptionNommee END IF flagerr THEN ROLLBACK SELECT CONCAT(Deacutesoleacute il reste encore un pilote agrave la compagnie p_comp) AS Resultat procExceptionNommee ELSE COMMIT END IFEND

Gestion de lrsquoexception

Web

DECLARE erreur_ilResteUnPilote CONDITIONFOR SQLSTATE 23000

erreur_ilResteUnPilote

4055_07_C07 Page 261 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

262 copy Eacuteditions Eyrolles

Deacuteclencheurs

Concernant MySQL les deacuteclencheurs nrsquoexistent que depuis la version 5 Comme nous leverrons ils sont limitatifs en termes de fonctionnaliteacutes et relativement instables (P Gulutzancitait en parlant de la version becircta dans son livre blanc toujours preacutesent (au moment de lrsquoimpres-sion de ce livre) en page drsquoaccueil du site de MySQL MySQL 50 Triggers laquo Triggers are verynew There are bugs hellip Do not try triggers with a database that has important data in ithellip raquo)

Bien que beaucoup drsquoameacuteliorations aient eacuteteacute apporteacutees les deacuteclencheurs qui modifient lestables ne sont pas encore agrave mon sens tout agrave fait fiables Prudence donc avec vos donneacuteesToutes les limitations que nous allons deacutetailler seront sans doute reacutesolues au fur et agrave mesuredes prochaines versions majeures du serveur Songez qursquoavant la version 5010 lesdeacuteclencheurs ne pouvaient mecircme pas acceacuteder agrave la base

Geacuteneacuteraliteacutes

Drsquoun point de vue geacuteneacuteral et sans parler de MySQL la plupart des deacuteclencheurs (triggers)peuvent ecirctre vus comme des sous-programmes reacutesidents associeacutes agrave un eacuteveacutenement particulier(insertion modification drsquoune ou de plusieurs colonnes suppression) sur une table (ou unevue) Une table (ou vue) peut laquo heacuteberger raquo plusieurs deacuteclencheurs ou aucun Pour certainsSGBD il existe drsquoautres types de deacuteclencheurs que ceux associeacutes agrave une table (ou vue) afin dereacutepondre agrave des eacuteveacutenements qui ne concernent pas les donneacutees (exemple connexion drsquounutilisateur particulier suppression drsquoune table deacutemarrage ou arrecirct du serveur deacuteconnexiondrsquoun utilisateur etc)

Agrave la diffeacuterence des sous-programmes lrsquoexeacutecution drsquoun deacuteclencheur nrsquoest pas explicite (parCALL par exemple) crsquoest lrsquoeacuteveacutenement de mise agrave jour de la table qui lance automatiquement lecode programmeacute dans le deacuteclencheur On dit que le deacuteclencheur laquo se deacuteclenche raquo (lrsquoanglais letraduit mieux fired trigger)

Agrave quoi sert un deacuteclencheur

En theacuteorie un deacuteclencheur permet de

Programmer toutes les regravegles de gestion qui nrsquoont pas pu ecirctre mises en place par descontraintes au niveau des tables Par exemple la condition une compagnie ne fait volerun pilote que srsquoil a totaliseacute plus de 60 heures de vol dans les 2 derniers mois sur le typedrsquoappareil du vol en question ne pourra pas ecirctre programmeacutee par une contrainte et neacuteces-sitera lrsquoutilisation drsquoun deacuteclencheur

Deacuteporter des contraintes au niveau du serveur et alleacuteger ainsi la programmation client Renforcer des aspects de seacutecuriteacute et drsquoaudit Programmer lrsquointeacutegriteacute reacutefeacuterentielle et la reacuteplication dans des architectures distribueacutees

avec lrsquoutilisation de liens de bases de donneacutees

4055_07_C07 Page 262 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 263

chapitre ndeg 7 Programmation avanceacutee

En theacuteorie les eacuteveacutenements deacuteclencheurs peuvent ecirctre

une instruction INSERT UPDATE ou DELETE sur une table (ou vue) On parle de deacuteclen-cheurs LMD

une instruction CREATE ALTER ou DROP sur un objet (table vue index etc) On parlede deacuteclencheurs LDD

le deacutemarrage ou lrsquoarrecirct de la base (startup ou shutdown) une erreur speacutecifique (not foundduplicate key etc) une connexion ou une deacuteconnexion drsquoun utilisateur On parle dedeacuteclencheurs drsquoinstances

En pratique dans MySQL seuls les eacuteveacutenements de la premiegravere cateacutegorie sont pris en compte

Meacutecanisme geacuteneacuteral

Auparavant consideacutereacutes au niveau table les deacuteclencheurs sont deacutesormais attacheacutes agrave plus justetitre au niveau database En conseacutequence le nom drsquoun deacuteclencheur doit ecirctre unique pourchaque base de donneacutees En revanche diffeacuterentes bases peuvent heacuteberger un deacuteclencheur demecircme nom

La figure suivante illustre les quatre eacutetapes agrave suivre pour mettre complegravetement en œuvre undeacuteclencheur (de la creacuteation agrave son test) Il faut drsquoabord le coder (comme un sous-programme)puis le compiler (il est pour lrsquoinstant stockeacute indeacutependamment de la table mais il devrait y ecirctreinclus dans les prochaines versions) Par la suite au cours du temps chaque eacuteveacutenement (quicaracteacuterise le deacuteclencheur) aura pour conseacutequence son exeacutecution

Syntaxe

Pour pouvoir creacuteer un deacuteclencheur vous devez disposer du privilegravege SUPER (le privilegravegeCREATE TRIGGER est agrave venir) Un deacuteclencheur est composeacute de deux parties la descriptionde lrsquoeacuteveacutenement traqueacute et celle de lrsquoaction agrave reacutealiser lorsque lrsquoeacuteveacutenement se produit La syntaxede creacuteation drsquoun deacuteclencheur est la suivante

Figure 7-6 Meacutecanisme des deacuteclencheurs

1 Eacutecriture

CREATE TRIGGER trig1 BEFORE | AFTER nature de lrsquoeacuteveacutenement e1

ON Tab1Bloc drsquoinstructions

2

Compilation

3 Eacuteveacutenement e1sur Tab1

4 Actions codeacutees dans trig1

Tab1trig1

4055_07_C07 Page 263 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

264 copy Eacuteditions Eyrolles

CREATE TRIGGER nomDeacuteclencheur

BEFORE | AFTER DELETE | INSERT | UPDATE

ON nomTable

FOR EACH ROW

instruction |

[etiquette] BEGIN

instructions

END [etiquette]

Les options de cette commande sont les suivantes

BEFORE | AFTER preacutecise la chronologie entre lrsquoaction agrave reacutealiser par le deacuteclencheur LMD etla reacutealisation de lrsquoeacuteveacutenement (BEFORE INSERT exeacutecutera le deacuteclencheur avant de reacutealiserlrsquoinsertion)

DELETE | INSERT | UPDATE preacutecise la nature de lrsquoeacuteveacutenement pour les deacuteclencheurs LMD

ndash Pour DELETE le deacuteclencheur examine les eacuteveacutenements DELETE et REPLACE

ndash Pour INSERT le deacuteclencheur prend en compte les eacuteveacutenements suivants INSERTCREATE SELECT LOAD DATA et REPLACE

ndash Pour UPDATE le deacuteclencheur considegravere seulement lrsquoeacuteveacutenement UPDATE

ON nomTable speacutecifie la table associeacutee au deacuteclencheur LMD

FOR EACH ROW diffeacuterencie les deacuteclencheurs LMD au niveau ligne (le niveau eacutetat nrsquoestpas encorepris en charge)

instruction ou instructions compose le corps du code du deacuteclencheur

Il nrsquoest pas possible de deacutefinir deux deacuteclencheurs distincts sur le mecircme eacuteveacutenement drsquoune tabledonneacutee En revanche il est possible drsquoavoir deux deacuteclencheurs distincts sur la mecircme actiondans une table donneacutee (un deacuteclencheur pour BEFORE UPDATE et un autre pour AFTER UPDATEpar exemple)

Attention agrave ne pas creacuteer de deacuteclencheurs recursifs (exemple drsquoun deacuteclencheur qui exeacutecute uneinstruction lanccedilant elle-mecircme le deacuteclencheur ou deux deacuteclencheurs srsquoappelant en cascadejusqursquoagrave lrsquooccupation de toute la meacutemoire reacuteserveacutee)

Eacutetudions agrave preacutesent plus preacuteciseacutement les caracteacuteristiques du seul type de deacuteclencheur qursquoil estactuellement possible de programmer

Deacuteclencheurs LMD (de lignes)

Pour ce type de deacuteclencheur lrsquoeacuteveacutenement agrave deacuteterminer est une mise agrave jour particuliegravere de labase (ajout modification ou suppression dans une table ou une vue)

4055_07_C07 Page 264 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 265

chapitre ndeg 7 Programmation avanceacutee

Lrsquoexeacutecution est pour lrsquoheure deacutependante du nombre de lignes toucheacutees par lrsquoeacuteveacutenementSeuls les deacuteclencheurs de lignes (row trigger) sont permis car la directive FOR EACH ROWest obligatoire Ils sont pratiques quand on deacutesire utiliser autant de fois le deacuteclencheur qursquoil ya de lignes concerneacutees par une mise agrave jour

Si on deacutesirait exeacutecuter une seule fois le deacuteclencheur quel que soit le nombre de lignesconcerneacutees il faudrait employer un deacuteclencheur drsquoeacutetat (statement trigger) qui nrsquoest pas encorereconnu Pour ce faire il faudrait ne pas indiquer la directive FOR EACH ROW ou preacuteciser FOREACH STATEMENT agrave la place (agrave confirmer avec une prochaine version incluant cetteextension)

Dans lrsquoexemple drsquoune table t1 ayant cinq enregistrements si on programme un deacuteclencheur deniveau ligne avec lrsquoeacuteveacutenement AFTER DELETE et qursquoon lance DELETE FROM t1 ledeacuteclencheur effectuera cinq fois ses instructions (une fois apregraves chaque suppression) Letableau suivant explique ce meacutecanisme

Seuls les deacuteclencheurs de lignes peuvent acceacuteder aux anciennes et aux nouvelles valeurs descolonnes de la ligne affecteacutee par la mise agrave jour preacutevue par lrsquoeacuteveacutenement Les identificateurs OLDet NEW sont programmeacutes pour cela Ce sont des extensions de MySQL agrave la norme SQL(MySQL suit ainsi Oracle dans ce domaine qui propose OLD et NEW)

Un deacuteclencheur de type AFTER ne se lance sur une table t que si le deacuteclencheur de typeBEFORE de la table t (srsquoil existe) et que lrsquoinstruction associeacutee agrave lrsquoeacuteveacutenement se sont correcte-ment deacuterouleacutes

Quand utiliser la directive OLD

Chaque enregistrement qui tente drsquoecirctre supprimeacute drsquoune table qui inclut un deacuteclencheur detype DELETE FOR EACH ROW est deacutesigneacute par OLD au niveau du code du deacuteclencheurLrsquoaccegraves aux colonnes de ce pseudo-enregistrement dans le corps du deacuteclencheur se fait par lanotation pointeacutee

Consideacuterons lrsquoexemple suivant et programmons la regravegle de gestion tout pilote qui perd unequalification doit voir son compteur automatiquement deacutecreacutementer Programmons le deacuteclen-cheur TrigDelQualif qui surveille les suppressions de la table Qualifications et dimi-nue de un la colonne nbQualif pour le pilote concerneacute par la suppression de sa qualification

Tableau 7-17 Exeacutecution drsquoun deacuteclencheur LMD

Nature delrsquoeacuteveacutenement

Eacutetat (statement trigger)sans FOR EACH ROW

Ligne (row trigger)avec FOR EACH ROW

BEFORE Exeacutecution une fois avant la mise agrave jour Exeacutecution avant chaque ligne mise agrave jour

AFTER Exeacutecution une fois apregraves la mise agrave jour Exeacutecution apregraves chaque ligne mise agrave jour

4055_07_C07 Page 265 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

266 copy Eacuteditions Eyrolles

Lrsquoeacuteveacutenement deacuteclencheur est ici AFTER DELETE car il faudra srsquoassurer que la suppressionnrsquoest pas entraveacutee par drsquoeacuteventuelles contraintes reacutefeacuterentielles On utilise un deacuteclencheur FOREACH ROW car srsquoil se produit une suppression de toute la table (DELETE FROM Qualifi-cations) on exeacutecutera autant de fois le deacuteclencheur qursquoil y a de lignes deacutetruites

Chaque enregistrement qui va ecirctre supprimeacute de la table Qualifications est deacutesigneacute parOLD au niveau du code du deacuteclencheur Lrsquoaccegraves aux colonnes de ce pseudo-enregistrementdans le corps du deacuteclencheur se fait par la notation pointeacutee

Le code minimal de ce deacuteclencheur (on ne prend pas en compte le fait qursquoil nrsquoexiste pas depilote de ce code brevet) est deacutecrit dans le tableau suivant

En consideacuterant les donneacutees initiales des tables le test de ce deacuteclencheur sous lrsquointerface decommande est le suivant Par ailleurs la table Qualifications ne contient plus que troisenregistrements

Figure 7-7 Principe du deacuteclencheur TrigDelQualif

BREVET TYPA EXPIRE

------ ---- --------

PL - 1 A340 220605

PL - 1 A330 050205

PL - 1 A320 160104

PL - 2 A320 180104

PL - 3 A330 220106

TypeAvion

TYPA NOMTYPE

--- - --------------------------

A320 Bireacuteacteur Airbus 320

A330 Bireacuteacteur Airbus 330

A340 Quadrireacuteacteur Airbus 340

Pilote

BREVET NOM NBHVOL COMP NBQUALIF------ -------------------- ---------- ---- ----------

DeacuteclencheurTrigDelQualif

1

2

- 13

OLD

DELETE

PL-1 P Caboche 450 AF 3

PL-2 G Lebur 3400 AF 1

PL-3 X Leclercq 900 SING 1

Qualifications

A380 Big-Quadrireacuteacteur 380

Tableau 7-18 Deacuteclencheur apregraves suppression

Code MySQL Commentaires

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

BEGIN UPDATE Pilote SET nbQualif = nbQualif - 1 WHERE brevet = END

Corps du deacuteclencheurMise agrave jour du pilote concerneacute par la suppression

WebCREATE TRIGGER TriDelQualifAFTER DELETE ON QualificationsFOR EACH ROW

OLDbrevet

4055_07_C07 Page 266 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 267

chapitre ndeg 7 Programmation avanceacutee

Quand utiliser la directive NEW

Chaque enregistrement qui tente drsquoecirctre ajouteacute dans la table Qualifications est deacutesigneacutepar NEW au niveau du code du deacuteclencheur Lrsquoaccegraves aux colonnes de ce pseudo-enregistre-ment dans le corps du deacuteclencheur se fait par la notation pointeacutee

Consideacuterons le mecircme exemple et eacutecrivons la regravegle de gestion tout pilote qui gagne une quali-fication doit voir son compteur automatiquement increacutementer Programmons le deacuteclencheurTrigInsQualif qui surveille les insertions sur la table Qualifications et augmente deun la colonne nbQualif pour le pilote concerneacute

Lrsquoeacuteveacutenement deacuteclencheur est ici AFTER INSERT car il faudra srsquoassurer avant de fairelrsquoinsertion que le code du pilote et celui de lrsquoavion sont corrects (existant dans les tableslaquo pegravere raquo) On utilise un deacuteclencheur FOR EACH ROW car on deacutesire qursquoil srsquoexeacutecute autant defois qursquoil y a de lignes concerneacutees par lrsquoeacuteveacutenement deacuteclencheur

Le code minimal de ce deacuteclencheur (on ne prend en compte aucune erreur potentielle) estdeacutecrit dans le tableau suivant

Tableau 7-19 Test du deacuteclencheur AFTER DELETE

Eacuteveacutenement deacuteclencheur Reacutesultat

DELETE FROM Qualifications WHERE typa = A320

SELECT FROM Pilote+--------+-------------+---------+-------+----------+| brevet | nom | nbHVol | compa | nbQualif |+--------+-------------+---------+-------+----------+| PL-1 | P Caboche | 45000 | AF | || PL-2 | G Lebur | 340000 | AF | || PL-3 | X Leclercq | 90000 | SING | 1 |+--------+-------------+---------+-------+----------+

Figure 7-8 Principe du deacuteclencheur TrigInsQualif

20

Qualifications BREVET TYPA EXPIRE------ ---- --------PL-1 A340 220605PL-1 A330 050205PL-1 A320 160104PL-2 A320 180104PL-3 A330 220106

TypeAvionTYPA NOMTYPE---- --------------------------A320 Bireacuteacteur Airbus 320A330 Bireacuteacteur Airbus 330A340 Quadrireacuteacteur Airbus 340A380 Big -Quadrireacuteacteur 380

PiloteBREVET NOM NBHVOL COMP NBQUALIF------ -------------------- ---------- ---- ----------PL-1 P Caboche 450 AF 3PL-2 G Lebur 3400 AF 1PL-3 X Leclercq 900 SING 1

Deacuteclencheur

TrigInsQualif

PL-2 A380 200606

INSERT1

2

+13

NEW

4055_07_C07 Page 267 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

268 copy Eacuteditions Eyrolles

En consideacuterant les donneacutees initiales des tables le test de ce deacuteclencheur (reacutealiseacute le20 deacutecembre 2005) sous lrsquointerface de commande est le suivant

Quand utiliser agrave la fois les directives NEW et OLD

Seuls les deacuteclencheurs de type UPDATE FOR EACH ROW permettent de manipuler agrave la fois lesdirectives NEW et OLD En effet la mise agrave jour drsquoune ligne dans une table fait intervenir unenouvelle donneacutee qui en remplace une ancienne Lrsquoaccegraves aux anciennes valeurs se fera par lanotation pointeacutee du pseudo-enregistrement OLD Lrsquoaccegraves aux nouvelles valeurs se fera par NEW

La figure suivante illustre ce meacutecanisme dans le cas de la modification de la colonne brevet dudernier enregistrement de la table Qualifications Le deacuteclencheur doit programmer deuxmises agrave jour dans la table Pilote

Tableau 7-20 Deacuteclencheur apregraves insertion

Deacuteclencheur Commentaires

BEGIN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = END

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheurMise agrave jour du pilote concerneacute par la qualification

CREATE TRIGGER TrigInsQualifAFTER INSERT ON QualificationsFOR EACH ROW

NEWbrevet

Tableau 7-21 Test du deacuteclencheur AFTER INSERT

Eacuteveacutenement deacuteclencheur Reacutesultat

INSERT INTO Qualifications VALUES(PL-2 A380 SYSDATE())

SELECT FROM Qualifications $+--------+------+------------+| brevet | typa | expire |+--------+------+------------+| PL-1 | A340 | 2005-06-22 || PL-1 | A330 | 2005-02-05 || PL-1 | A320 | 2004-01-16 || PL-2 | A320 | 2004-01-18 || PL-3 | A330 | 2006-01-22 || |+--------+------+------------+SELECT FROM Pilote$+--------+-------------+---------+-------+----------+| brevet | nom | nbHVol | compa | nbQualif |+--------+-------------+---------+-------+----------+| PL-1 | P Caboche | 45000 | AF | 3 || PL-2 | G Lebur | 340000 | AF | 2 || PL-3 | X Leclercq | 90000 | SING | 1 |+--------+-------------+---------+-------+----------+

Web

PL-2 | A380 | 2005-12-20

4055_07_C07 Page 268 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 269

chapitre ndeg 7 Programmation avanceacutee

Lrsquoeacuteveacutenement deacuteclencheur est ici AFTER UPDATE car il faudra srsquoassurer que la suppressionnrsquoest pas entraveacutee par drsquoeacuteventuelles contraintes reacutefeacuterentielles Le code minimal de ce deacuteclen-cheur est deacutecrit dans le tableau suivant

En consideacuterant les donneacutees preacutesenteacutees agrave la figure preacuteceacutedente le test de ce deacuteclencheur est lesuivant

Figure 7-9 Principe du deacuteclencheur TrigUpdQualif

Qualifications BREVET TYPA EXPIRE------ ---- --------PL-1 A340 220605PL-1 A330 050205PL-1 A320 160104PL-2 A320 180104PL-3 A330 220106

PiloteBREVET NOM NBHVOL COMP NBQUALIF------ -------------------- ---------- ---- ----------PL-1 P Caboche 450 AF 3PL-2 G Lebur 3400 AF 1PL-3 X Leclercq 900 SING 1

DeacuteclencheurTrigUpdQualif

PL-2

UPDATE

1

2

+13

NEW

OLD

-1

Tableau 7-22 Deacuteclencheur apregraves modification

Deacuteclencheur Commentaires

BEGIN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = UPDATE Pilote SET nbQualif = nbQualif - 1 WHERE brevet = END

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheur

Mise agrave jour des pilotes concerneacutes par la modification de la qualification

WebCREATE TRIGGER TrigUpdQualifAFTER UPDATE ON QualificationsFOR EACH ROW

NEWbrevet

OLDbrevet

4055_07_C07 Page 269 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

270 copy Eacuteditions Eyrolles

Bilan de NEW et OLD

Le tableau suivant reacutesume les valeurs contenues dans les pseudo-enregistrements OLD et NEWpour les deacuteclencheurs FOR EACH ROW Retenez que seuls les deacuteclencheurs UPDATE peuventmanipuler agrave bon escient les deux types de directives

MySQL preacutevient clairement agrave la compilation que vous utilisez une variable OLD dans undeacuteclencheur INSERT ndash ou NEW dans un deacuteclencheur DELETE ndash par deux messages de mecircmecode mais de libelleacutes diffeacuterents suivant les cas

ERROR 1363 (HY000) There is no NEW row in on DELETE trigger

ERROR 1363 (HY000) There is no OLD row in on INSERT trigger

Une colonne preacutefixeacutee de OLD est en lecture seule dans le corps drsquoun deacuteclencheur

Une colonne preacutefixeacutee de NEW ne peut ecirctre accessible qursquoagrave lrsquoaide du privilegravege SELECT associeacute

Tableau 7-23 Test du deacuteclencheur AFTER UPDATE

Eacuteveacutenement deacuteclencheur Reacutesultat

UPDATE Qualifications SET brevet = PL-2 WHERE brevet = PL-3 AND typa = A330$

SELECT FROM Pilote$+--------+-------------+---------+-------+----------+| brevet | nom | nbHVol | compa | nbQualif |+--------+-------------+---------+-------+----------+| PL-1 | P Caboche | 45000 | AF | || PL-2 | G Lebur | 340000 | AF | || PL-3 | X Leclercq | 90000 | SING | 0 |+--------+-------------+---------+-------+----------+

SELECT FROM Qualifications$+--------+------+------------+| brevet | typa | expire |+--------+------+------------+| PL-1 | A340 | 2005-06-22 || PL-1 | A330 | 2005-02-05 || PL-1 | A320 | 2004-01-16 || PL-2 | A320 | 2004-01-18 || | A330 | 2006-01-22 |+--------+------+------------+

32

PL-2

Tableau 7-24 Valeurs de OLD et NEW

Nature de lrsquoeacuteveacutenement OLDcolonne NEWcolonne

INSERT Impossible Nouvelle valeur

UPDATE Ancienne valeur Nouvelle valeur

DELETE Ancienne valeur Impossible

4055_07_C07 Page 270 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 271

chapitre ndeg 7 Programmation avanceacutee

Appel de sous-programmes

Un deacuteclencheur peut appeler directement par CALL (ou dans son corps) un sous-programmeMySQL

bull Un deacuteclencheur ne peut pas lancer une proceacutedure catalogueacutee retournant des donneacutees auclient (traces avec SELECT) ou utilisant du SQL dynamique (eacutetudieacute plus loin) En revanche lesproceacutedures employeacutees peuvent renvoyer des reacutesultats via leurs paramegravetres de sortie (OUT)

bull Les proceacutedures appeleacutees ne peuvent constituer aucune transaction (oubliez donc de pou-voir faire START TRANSACTION COMMIT et ROLLBACK)

Le tableau suivant deacutecrit lrsquoutilisation drsquoun sous-programme (procTrigg) dans un deacuteclen-cheur (espionAjoutPilote) qui srsquoexeacutecutera avant chaque ajout drsquoun nouveau pilote Lesous-programme ajoute simplement une ligne dans la table Trace

CREATE PROCEDURE bdsoutouprocTrigg(IN param DATETIME)

BEGIN

INSERT INTO Trace VALUES

(CONCAT(Insertion pilote appel de bdsoutouprocTrigg le param))

END

La trace drsquoexeacutecution en consideacuterant les donneacutees initiales des tables est la suivante

mysqlgt (INSERT INTO Pilote VALUES (PL-4 C Soutou 100 AF0)$

Query OK 1 row affected (004 sec)

mysqlgt SELECT FROM Pilote$

+--------+-------------+---------+-------+----------+

| brevet | nom | nbHVol | compa | nbQualif |

+--------+-------------+---------+-------+----------+

| PL-1 | P Caboche | 45000 | AF | 3 |

| PL-2 | G Lebur | 340000 | AF | 1 |

| PL-3 | X Leclercq | 90000 | SING | 1 |

| |

+--------+-------------+---------+-------+----------+

Tableau 7-25 Appel drsquoun sous-programme dans un deacuteclencheur

Deacuteclencheur Commentaire

CREATE TRIGGER bdsoutouespionAjoutPilote BEFORE INSERT ON Pilote FOR EACH ROWBEGIN END

Appel dans le corps du deacuteclencheur drsquoune proceacutedure MySQL en passant un paramegravetre drsquoentreacutee

Web

CALL bdsoutouprocTrigg(SYSDATE())

PL-4 | C Soutou | 10000 | AF | 0

4055_07_C07 Page 271 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

272 copy Eacuteditions Eyrolles

mysqlgt SELECT FROM Trace$

+-----------------------------------------------------------------+

| col |

+-----------------------------------------------------------------+

| |

+-----------------------------------------------------------------+

Dictionnaire des donneacutees

Eacutetudieacutee au chapitre 5 la base INFORMATION_SCHEMA inclut la vue TRIGGERS qui renseigneles caracteacuteristiques des deacuteclencheurs qui eacutetaient auparavant consideacutereacutes au niveau table Ilssont deacutesormais reconnus agrave juste titre au niveau database Il faut deacutetenir le privilegravege SUPERpour acceacuteder agrave cette vue

La requecircte suivante interroge cette vue et permet de retrouver les noms et les caracteacuteristiquesrelatives aux eacuteveacutenements deacuteclencheurs des trois triggers de la base de donneacutees bdsoutou

SELECT TRIGGER_NAMEEVENT_OBJECT_TABLE Table

EVENT_MANIPULATION Evenement ACTION_TIMING

EVENT_OBJECT_SCHEMA Base

FROM INFORMATION_SCHEMATRIGGERS

WHERE TRIGGER_SCHEMA=bdsoutou

+---------------+----------------+-----------+---------------+----------+

| TRIGGER_NAME | Table | Evenement | ACTION_TIMING | Base |

+---------------+----------------+-----------+---------------+----------+

| TrigInsQualif | Qualifications | INSERT | AFTER | bdsoutou |

| TrigUpdQualif | Qualifications | UPDATE | AFTER | bdsoutou |

| TriDelQualif | Qualifications | DELETE | AFTER | bdsoutou |

+---------------+----------------+-----------+---------------+----------+

Notez que MySQL utilise

la colonne TRIGGER_NAME pour deacutesigner le nom du deacuteclencheur drsquoune database

la colonne TRIGGER_SCHEMA pour deacutesigner le nom de la base de donneacutees agrave laquelle ilappartient

les colonnes EVENT_OBJECT_TABLE et EVENT_OBJECT_SCHEMA pour deacutesignerrespectivement le nom de la table qui accueille ce deacuteclencheur ainsi que la base de donneacuteesqui la contient (elle peut ecirctre diffeacuterente de celle du deacuteclencheur ici nous raisonnons sur lamecircme)

la colonne EVENT_MANIPULATION pour deacutesigner lrsquoeacuteveacutenement deacuteclencheur

la colonne ACTION_TIMING pour preacuteciser la chronologie de lrsquoeacuteveacutenement deacuteclencheur

La requecircte suivante interroge cette mecircme vue pour extraire le code du deacuteclencheur de typeafter update heacutebergeacute par la table Qualifications dans la base de donneacutees bdsoutou

Insertion pilote appel de bdsoutouprocTrigg le 2005-12-20 082720

4055_07_C07 Page 272 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 273

chapitre ndeg 7 Programmation avanceacutee

SELECT ACTION_STATEMENT FROM INFORMATION_SCHEMATRIGGERS WHERE TRIGGER_SCHEMA=bdsoutou AND EVENT_OBJECT_TABLE=Qualifications AND EVENT_MANIPULATION=UPDATE AND ACTION_TIMING=AFTER+-----------------------------------------------------------------------------+| ACTION_STATEMENT |+-----------------------------------------------------------------------------+|BEGIN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = NEWbrevet UPDATE Pilote SET nbQualif = nbQualif - 1 WHERE brevet = OLDbrevet END |+-----------------------------------------------------------------------------+

Remarquons que MySQL utilise la colonne ACTION_STATEMENT pour contenir le corps dudeacuteclencheur (visible aussi par SHOW TRIGGERS)

La colonne ACTION_ORIENTATION est pour lrsquoinstant toujours eacutevalueacutee agrave ROW (deacuteclencheurdrsquoeacutetat pas encore opeacuterationnel)

Les colonnes ACTION_REFERENCE_OLD_ROW et ACTION_REFERENCE_NEW_ROW contiennentpour lrsquoinstant toujours respectivement OLD et NEW (il nrsquoest pas encore possible de renommerces identificateurs)

Dans le but drsquoecirctre davantage en phase avec la norme dans les prochaines versions les colon-nes suivantes contiennent pour lrsquoheure toujours la valeur NULL TRIGGER_CATALOG EVENT_OBJECT_CATALOG ACTION_CONDITION ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE et CREATED Les deux premiegraveres colonnes sont relatives agrave la notionde catalogue la suivante a la possibiliteacute de conditionner un deacuteclencheur (clause WHEN drsquoOra-cle) la derniegravere contiendrait le moment de creacuteation du deacuteclencheur

Programmation drsquoune contrainte de veacuterification

Nous avons vu que les contraintes de veacuterification (CHECK) ne sont pas encore prises encharge Nous avons eacutetudieacute au chapitre 5 la possibiliteacute drsquoen programmer agrave lrsquoaide de vues Icinous allons creacuteer un deacuteclencheur srsquoen chargeant Attention il nrsquoest pas toujours possibledrsquoutiliser un deacuteclencheur pour valider une contrainte de veacuterification

Consideacuterons lrsquoexemple du chapitre 5 (Figure 5-10 Vue simulant la contrainte CHECK) quideacutecrit la table Pilote et la contrainte veacuterifiant qursquoun pilote

ne peut ecirctre commandant de bord qursquoagrave la condition qursquoil ait entre 1 000 et 4 000 heures devol

ne peut ecirctre copilote qursquoagrave la condition qursquoil ait entre 100 et 1 000 heures de vol

ne peut ecirctre instructeur qursquoagrave partir de 3 000 heures de vol

Le tableau suivant deacutecrit le code du deacuteclencheur Ici on choisit de forcer la valeur de lacolonne grade pour conserver la coheacuterence avec les conditions initiales

4055_07_C07 Page 273 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

274 copy Eacuteditions Eyrolles

Si aucune condition nrsquoest veacuterifieacutee lrsquoajout se reacutealise sans aucun changement Le test de cedeacuteclencheur est le suivant On remarque que les quatre premiers INSERT sont inchangeacutes alorsque les deux derniers sont modifieacutes (mais pas annuleacutes )

Tableau 7-26 Deacuteclencheur simulant un CHECK

Deacuteclencheur Commentaires

BEGIN IF ( = CDB AND ( lt1000)) THEN SET = COPI END IF IF (NEWgrade = CDB AND ( gt4000)) THEN SET = INST END IF IF (NEWgrade = COPI AND ( gt1000)) THEN SET = CDB END IF IF ( = INST AND ( lt3000)) OR ( lt100) THEN SET = NULL END IFEND

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheur

Test des conditions et mise agrave jour eacuteventuelle de la nouvelle valeur agrave inseacuterer au niveau de la colonne grade

WebCREATE TRIGGER TrigInsGradeBEFORE INSERT ON Pilote FOR EACH ROW

NEWgrade NEWnbHVolNEWgrade

NEWnbHVolNEWgrade

NEWnbHVolNEWgrade

NEWgrade NEWnbHVolNEWnbHVol

NEWgrade

Tableau 7-27 Test du deacuteclencheur BEFORE INSERT

Insertions valides Insertions non valides

INSERT INTO Pilote VALUES (PL-1Daniel Vielle1000CDB)INSERT INTO Pilote VALUES (PL-2Benoit Treihlou450COPI)INSERT INTO Pilote VALUES (PL-3Pierre Filoux9000INST)INSERT INTO Pilote VALUES (PL-4Philippe Minier1000COPI)

INSERT INTO Pilote VALUES (PL-5Trop jeune )

INSERT INTO Pilote VALUES (PL-6Inexperimente )

SELECT FROM Pilote+--------+-----------------+---------+-------+| brevet | nom | nbHVol | grade |+--------+-----------------+---------+-------+| PL-1 | Daniel Vielle | 100000 | CDB || PL-2 | Benoit Treihlou | 45000 | COPI || PL-3 | Pierre Filoux | 900000 | INST || PL-4 | Philippe Minier | 100000 | COPI || PL-5 | Trop jeune | || PL-6 | Inexperimente | |+--------+-----------------+---------+-------+

100CDB

2999INST

10000 | COPI299900 | NULL

4055_07_C07 Page 274 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 275

chapitre ndeg 7 Programmation avanceacutee

Invalidation dans le deacuteclencheur

Une fonctionnaliteacute importante des deacuteclencheurs consiste agrave pouvoir invalider lrsquoeacuteveacutenement quia deacuteclencheacute lrsquoaction En drsquoautres termes crsquoest pouvoir faire dire au deacuteclencheur non agrave uneinsertion une modification ou agrave une suppression Ces cas concernent les deacuteclencheurs lignesde type BEFORE puisqursquoil faudra veacuterifier des conditions dans le corps du deacuteclencheur avanteacuteventuellement drsquoaccepter lrsquoeacuteveacutenement

Dans un deacuteclencheur de type BEFORE

Il est possible de modifier une colonne preacutefixeacutee de NEW agrave la condition de deacutetenir le privi-legravege UPDATE associeacute Cela signifie que lrsquoon peut changer un enregistrement avant delrsquoinseacuterer

La valeur drsquoune colonne AUTO_INCREMENT preacutefixeacutee par NEW est 0 (et ne suit pas laseacutequence existante) La valeur actualiseacutee de la seacutequence ne sera effective que lors delrsquoinsertion

Dans tout deacuteclencheur (de type BEFORE ou AFTER) une erreur lors de lrsquoexeacutecution et toutes lesinstructions du bloc sont invalideacutees

Principe

Sans parler de MySQL lrsquoinvalidation dans un deacuteclencheur se traduit en geacuteneacuteral par le deacuteclen-chement drsquoune exception (qui fait avorter lrsquoinstruction LMD) et par le retour drsquoun messagedrsquoerreur personnaliseacute

Les proceacutedures et deacuteclencheurs MySQL ne permettent pour lrsquoinstant ni de provoquer uneexception systegraveme ni de retourner un code SQL personnaliseacute

Il nrsquoest pas non plus possible drsquoutiliser ROLLBACK dans un deacuteclencheur (ERROR 1422(HY000) Explicit or implicit commit is not allowed in stored functionor trigger)

Une seule solution qui nrsquoest pas du tout satisfaisante comme nous allons le voir consisteraitagrave provoquer artificiellement une erreur (mais pas une erreur systegraveme par exemple acceacuteder agraveune table inexistante) Il faut une erreur seacutemantiquement correcte qui pose problegraveme agravelrsquoexeacutecution (NULL dans une cleacute primaire)

Si vous programmez une erreur systegraveme (SELECT drsquoune table inexistante) elle sera releveacuteedans tous les cas drsquoexeacutecution du deacuteclencheur

Lrsquoinconveacutenient majeur de cette astuce est que le message drsquoerreur ne sera jamais explicite caril ne sera pas en rapport avec la contrainte qui nrsquoest pas satisfaite dans le deacuteclencheur

4055_07_C07 Page 275 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

276 copy Eacuteditions Eyrolles

Exemple

Consideacuterons agrave nouveau lrsquoexemple preacuteceacutedent et programmons la contrainte que tout pilote nepeut ecirctre qualifieacute sur plus de trois types drsquoappareils Ici il srsquoagit drsquoassurer la coheacuterence entrela valeur de la colonne nbQualif de la table Pilote et les enregistrements de la tableQualifications

Lrsquoeacuteveacutenement deacuteclencheur est ici BEFORE INSERT car il faudra srsquoassurer de la conditionavant drsquoautoriser Le code minimal de ce deacuteclencheur est deacutecrit dans le tableau suivant ensupposant qursquoon dispose drsquoune table de travail CREATE TABLE Trace(colVARCHAR(80) PRIMARY KEY)

En consideacuterant les donneacutees initiales le test de ce deacuteclencheur est le suivant On remarque quele premier INSERT est bien eacuteviteacute (le pilote PL-1 a deacutejagrave trois qualifications) Bizarrementlrsquoajout du message dans la table Trace nrsquoest pas effectueacute car le deacuteclencheur invalide tout sontraitement en cas drsquoerreur La seconde insertion en revanche est bien effectueacutee (le pilote PL-3 nrsquoa qursquoune seule qualification)

Tableau 7-28 Deacuteclencheur avant insertion

Deacuteclencheur Commentaires

CREATE TRIGGER TrigInsQualif ON Qualifications FOR EACH ROWBEGINDECLARE v_compteur TINYINT(1)DECLARE v_nom VARCHAR(30) SELECT nbQualif nom INTO v_compteur v_nom FROM Pilote WHERE brevet = NEWbrevet IF v_compteur lt 3 THEN UPDATE Pilote SET nbQualif = nbQualif + 1 WHERE brevet = NEWbrevet ELSE

Deacuteclaration de lrsquoeacuteveacutenement deacuteclencheur

Corps du deacuteclencheur

Test de la condition

Mise agrave jour du pilote concerneacute par lrsquoajout de la qualification

INSERT INTO TRACE VALUES (CONCAT(Le pilote v_nom a deacutejagrave 3 qualifications)) END IFEND

Instruction jamais reacutealiseacutee

Erreur volontaire

WebBEFORE INSERT

INSERT INTO TRACE VALUES (NULL)

4055_07_C07 Page 276 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 277

chapitre ndeg 7 Programmation avanceacutee

Citons le travail de Roland Bouman un Hollandais qui a eacutecrit une fonction (UDF user-definedfunction) en C qui se comporte comme une fonction native (built-in) simulant le RAISE_APPLICATION_ERROR Cette fonction permet de retourner un message personnaliseacute agrave partirdu corps drsquoun deacuteclencheur (httprpboumanblogspotcom200511using-udf-to-raise-errors-from-insidehtml)

Tables mutantes

Alors qursquoil nrsquoest pas en geacuteneacuteral possible de manipuler la table sur laquelle se porte le deacuteclen-cheur dans le corps du deacuteclencheur lui-mecircme Oracle parle de mutating tables et MySQLpermet drsquoacceacuteder agrave la table en lecture Si on tente drsquoy parvenir en mise agrave jour (INSERTUPDATE ou DELETE) lrsquoerreur est laquo ERROR 1442 (HY000) Cant update tablexxx in stored functiontrigger because it is already used bystatement which invoked this stored functiontrigger raquo

Lrsquoexemple suivant deacutecrit la programmation drsquoun deacuteclencheur qui compte les lignes drsquounetable apregraves chaque nouvelle insertion

Tableau 7-29 Test du deacuteclencheur BEFORE INSERT

Eacuteveacutenement deacuteclencheur Reacutesultat

--ajout incorrectINSERT INTO Qualifications VALUES ( A380SYSDATE())$

ERROR 1048 (23000) Column col cannot be null-- ne fait pas lINSERT dans Qualifications -- ni dans Trace

-- ajout correctINSERT INTO Qualifications VALUES ( A380SYSDATE())$

Query OK 1 row affected (009 sec)-- fait lINSERT dans Qualifications et met agrave jour-- la table Pilote (colonne nbQualif)

PL-1

PL-3

Tableau 7-30 Deacuteclencheur (table mutante)

Deacuteclencheur Trace

SET vs_nombre=0$

CREATE TRIGGER TrigMutant AFTER INSERT ON Trace FOR EACH ROWBEGIN

SELECT COUNT() INTO vs_nombre FROM TraceEND$

SELECT vs_nombre$+------------+| vs_nombre |+------------+| 0 |+------------+INSERT INTO Trace VALUES (Test TrigMutant)$SELECT vs_nombre$+------------+| vs_nombre |+------------+| 1 |+------------+

Web

4055_07_C07 Page 277 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

278 copy Eacuteditions Eyrolles

Restrictions

Pour en finir avec les deacuteclencheurs je vais terminer la laquo litanie raquohellip

bull Pas de deacuteclencheur sur une table temporaire ou une vue ou sur un eacuteveacutenement systegraveme(connexion arrecirct de la base etc)

bull Pas de possibiliteacute de combiner plusieurs eacuteveacutenements par 2 ou par 3 (INSERT OR UPDATEINSERT OR DELETE etc)

bull Les deacuteclencheurs eacutetat (statement trigger) ne sont pas encore reconnus

bull Il nrsquoest pas possible de deacutesactiver un deacuteclencheur sans le deacutetruire

bull Les deacuteclencheurs ne peuvent ecirctre eacutecrits qursquoavec le langage proceacutedural de MySQL (qui sertaussi aux proceacutedures et aux fonctions catalogueacutees)

bull Un deacuteclencheur ne peut constituer aucune transaction ainsi les instructions suivantes sontinterdites COMMIT ROLLBACK SAVEPOINT START TRANSACTION et SET CONSTRAINT

bull Les deacuteclencheurs ne sont pas activeacutes par des actions en cascade reacutesultant drsquoopeacuterations surdes cleacutes primaires ou eacutetrangegraveres (CASCADE voir le chapitre 2)

Suppression drsquoun deacuteclencheur

Pour pouvoir supprimer un deacuteclencheur vous devez disposer du privilegravege SUPER (le privilegravegeDROP TRIGGER est agrave venir) La syntaxe de lrsquoinstruction DROP TRIGGER est la suivante

DROP TRIGGER [nomBase]nomDeacuteclencheur

Si le nom de la base est omis MySQL cherchera agrave deacutetruire le deacuteclencheur dans la base dedonneacutees en cours drsquoutilisation

Le fait de deacutetruire une table a pour conseacutequence drsquoeffacer aussi tous les deacuteclencheurs qui luisont associeacutes

Le fait de deacutetruire une base supprime toutes les tables Par conseacutequent les deacuteclencheurs pas-sent ainsi tous laquo agrave la casserole raquo

SQL dynamique

MySQL parle de server-side prepared statements (eacutetats preacutepareacutes) pour eacutevoquer le fait depouvoir programmer en SQL dynamique En plus des directives SQL (LMD LID) il estpossible de construire automatiquement certaines instructions SQL du LDD

4055_07_C07 Page 278 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 279

chapitre ndeg 7 Programmation avanceacutee

Il est bien sucircr possible de construire des instructions SQL agrave partir drsquoun programme C (MySQLC API client library) Java (MySQL ConnectorJ) Net (MySQL ConnectorNET) ou PHP parune API eacutecrite en C (mysqli extension)

Par exemple on pourra creacuteer une table dont le nom passera en paramegravetre et qui aura unnombre variable de colonnes Il sera aussi permis de construire automatiquement une requecircteSQL en fonction des choix drsquoun utilisateur En plus des ordres simples on pourra eacutegalementparameacutetrer une suite drsquoinstructions dans un bloc MySQL

Une instruction SQL dynamique est stockeacutee en tant que chaicircne de caractegraveres qui sera eacutevalueacuteeagrave lrsquoexeacutecution et non agrave la compilation (en opposition aux instructions SQL statiques quipeuplent la majoriteacute des sous-programmes)

Seules les instructions suivantes peuvent ecirctre construites dynamiquement (dans un preparedstatement) CREATE TABLE DELETE DO INSERT REPLACE SELECT SET UPDATE et la plu-part des commandes SHOW

Les eacutetats preacutepareacutes ne peuvent ecirctre utiliseacutes dans un deacuteclencheur (seuls les sous-programmespeuvent en beacuteneacuteficier pour lrsquoheure)

Lrsquoinstruction

DO expression1 [expression2]

exeacutecute lrsquoexpression (ou les expressions) sans retourner aucun reacutesultat On peut lrsquoassimiler agraveun raccourci de SELECT expression1 mais sans renvoi de reacutesultat Elle peut ecirctreutile pour des fonctions agrave effet de bord (comme la relacircche de verrou RELEASE_LOCK())

Syntaxe

La construction dynamique drsquoinstructions SQL (prepared statements) est baseacutee sur les troisdirectives suivantes

PREPARE nomEtat FROM eacutetatPreacutepareacute

EXECUTE nomEtat [USING var1 [ var2] ]

DEALLOCATE | DROP PREPARE nomEtat

Lrsquoinstruction PREPARE associe un nom (insensible agrave la casse) agrave une instruction dynamique

eacutetatPreacutepareacute est soit une chaicircne soit une variable de session contenant le texte delrsquoinstruction SQL construite (instruction simple pas drsquoinstructions multiples) Dans cettechaicircne le caractegravere laquo raquo (appeleacute placeholder) permet de se substituer agrave un paramegravetre

Lrsquoinstruction EXECUTE lance lrsquoordre parameacutetreacute avec eacuteventuellement la clause USING quireliera les paramegravetres aux variables de session

Pour en terminer avec un ordre preacutepareacute utilisez DEALLOCATE PREPARE qui supprime lecontenu de lrsquoordre (une fin de session deacutesalloue tous les ordres ouverts)

4055_07_C07 Page 279 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

280 copy Eacuteditions Eyrolles

Exemples

Consideacuterons la table Avion contenant deux enregistrements

CREATE TABLE Avion

(immat VARCHAR(6) typeAv CHAR(8) nbHVol DECIMAL(72) comp VARCHAR(4))

INSERT INTO Avion VALUES (F-GLFS A320 1000 AF)

INSERT INTO Avion VALUES (F-WOWW A380 1500 AF)

Instruction DELETE

Le tableau suivant deacutecrit la construction dynamique de lrsquoordre de suppression des avions dontle nombre drsquoheures de vol est supeacuterieur agrave un paramegravetre speacutecifieacute par une variable de session (icieacutevalueacutee agrave 1 000)

Lrsquoappel (CALL bdsoutousousProg()) de cette proceacutedure aura pour conseacutequence dedeacutetruire lrsquoavion immatriculeacute F-WOWW

Instruction SELECT

Le tableau suivant deacutecrit la construction dynamique de lrsquoextraction des avions dont le nombredrsquoheures de vol est eacutegal agrave un paramegravetre speacutecifieacute par une variable de session (ici eacutevalueacutee agrave1 000) La requecircte est elle-mecircme stockeacutee dans une variable de session

Lrsquoappel de cette proceacutedure aura pour conseacutequence drsquoextraire lrsquoavion immatriculeacute F-GLFS

Tableau 7-31 Utilisation de DELETE

Code MySQL Commentaires

SET vs_nbhVol = 1000 $ Deacuteclaration de la variable de session

CREATE PROCEDURE bdsoutousousProg()BEGIN END

Preacuteparation de lrsquoordreExeacutecution

Web

PREPARE etat FROMDELETE FROM Avion WHERE nbHVol gt

EXECUTE etat USING vs_nbhVolDEALLOCATE PREPARE etat

Tableau 7-32 Utilisation de SELECT

Code MySQL Commentaires

SET vs_chaine = SET vs_nbhVol = 1000$

Deacuteclaration des variables de session

CREATE PROCEDURE bdsoutousousProg()BEGIN END

Preacuteparation de lrsquoordreExeacutecution

WebSELECT FROM Avion WHERE nbHVol=$

PREPARE etat FROM vs_chaineEXECUTE etat USING vs_nbhVolDEALLOCATE PREPARE etat

4055_07_C07 Page 280 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 281

chapitre ndeg 7 Programmation avanceacutee

Instruction UPDATE

Le tableau suivant deacutecrit la construction dynamique de lrsquoinstruction de modification (augmen-tation du nombre drsquoheures de vol drsquoun pourcentage passeacute en premier paramegravetre) drsquoun aviondont lrsquoimmatriculation passe en deuxiegraveme paramegravetre Notez qursquoil nrsquoest pas besoin de doublerle guillemet dans la speacutecification du deuxiegraveme placeholder paramegravetre immat (bien qursquoilsrsquoagisse drsquoune chaicircne de caractegraveres)

Lrsquoappel de cette proceacutedure aura pour conseacutequence drsquoaumenter de 10 le nombre drsquoheures devol de lrsquoavion immatriculeacute F-GLFS

Si lrsquoimmatriculation avait eacuteteacute une constante il aurait fallu doubler le guillemet dans lrsquoaffectationde la variable de session

SET vs_chaine =UPDATE Avion SET nbHVol=nbHVol WHERE immat=F-GLFS$

Restrictions

Les placeholders (points drsquointerrogation) des eacutetats preacutepareacutes ne peuvent pas remplacer desnoms de tables de vues drsquoindex de colonnes etc dans une instruction de sorte agrave construireun ordre dynamiquement Ils ne peuvent que remplacer des donneacutes

bull dans la clause WHERE pour des SELECT UPDATE (dans la clause SET aussi) ou DELETE

bull dans la clause VALUES pour un INSERT

Utilisations

Le tableau suivant reacutesume quelques cas permis et les cas non valides associeacutes Nrsquooubliez pas dedoubler chaque guillemet pour affecter une telle chaicircne de caractegraveres dans une variable de session

Tableau 7-33 Utilisation de UPDATE

Code MySQL Commentaires

SET vs_chaine = SET vs_immat = F-GLFS$SET vs_pourcent = 11$

Deacuteclaration des variables de session

CREATE PROCEDURE bdsoutousousProg()BEGIN END

Preacuteparation de lrsquoordreExeacutecution

WebUPDATE Avion SET nbHVol=nbHVol

WHERE immat=$

PREPARE etat FROM vs_chaineEXECUTE etat USING vs_pourcentvs_immatDROP PREPARE etat

4055_07_C07 Page 281 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

282 copy Eacuteditions Eyrolles

Afin de pallier cette limitation il faut construire lrsquoinstruction dynamique agrave lrsquoaide de la fonc-tion CONCAT en incluant eacuteventuellement des placeholders aux endroits permis

Exemple sans placeholder

La proceacutedure catalogueacutee suivante creacutee dynamiquement dans la base bdsoutou une table denom passeacute en premier paramegravetre Le nom de la seconde colonne de la table (ici de type INT)est passeacute en second paramegravetre de la proceacutedure

Lrsquoappel suivant de cette proceacutedure aura pour effet de creacuteer la table Helico La commandeDESCRIBE confirme la structure de la nouvelle table

CALL bdsoutousousProg(Helicoturbine)$

Query OK 0 rows affected (021 sec)

DESCRIBE bdsoutouHelico $

Tableau 7-34 Utilisation des placeholders

Possibles Impossibles

SELECT FROM table WHERE col = SELECT FROM table WHERE

SELECT FROM WHERE

SELECT FROM table WHERE gt 1000

INSERT INTO table VALUES () INSERT INTO VALUES(F-FRTY)

UPDATE table SET col= WHERE col = UPDATE table SET = WHERE col =

UPDATE SET

DELETE FROM table WHERE col = DELETE FROM table WHERE =

DELETE FROM

Tableau 7-35 Creacuteation dynamique drsquoune table

Code MySQL Commentaires

CREATE PROCEDURE bdsoutousousProg (IN v_param1 VARCHAR(10) IN v_param2 VARCHAR(10))BEGIN SET vs_chaine = CONCAT ( PREPARE etat FROM vs_chaine EXECUTE etat DEALLOCATE PREPARE etatEND

Construction de la chaicircne

lsquoCREATE TABLE IF NOT EXISTS bdsoutou (immat CHAR(4) INT)rsquo

Creacuteation de la table

Web

CREATE TABLE IF NOT EXISTSbdsoutouv_param1 (immat CHAR(4) v_param2 INT))

v_param1

v_param2

4055_07_C07 Page 282 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 283

chapitre ndeg 7 Programmation avanceacutee

+---------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+---------+---------+------+-----+---------+-------+

| immat | char(4) | YES | | NULL | |

| turbine | int(11) | YES | | NULL | |

+---------+---------+------+-----+---------+-------+

2 rows in set (039 sec)

Exemple avec placeholder

La proceacutedure catalogueacutee suivante creacutee dynamiquement la requecircte drsquoextraction du type et dunombre drsquoheures de vol (colonnes de noms passeacutes en premier et en deuxiegraveme paramegravetres) dela table de nom passeacute en troisiegraveme paramegravetre en fonction drsquoune condition sur une colonne (denom passeacute en quatriegraveme paramegravetre) Cette condition fait intervenir un paramegravetre (placeholder)valant ici F-GLFS

Lrsquoappel de cette proceacutedure avec les paramegravetres suivants aura pour effet drsquoextraire les valeursdes deux colonnes du premier enregistrement de la table Avion preacutesenteacutee au deacutebut de cettesection

CALL bdsoutousousProg(typeAvnbHVolAvionimmat)$

+--------+---------+

| typeAv | nbHVol |

+--------+---------+

| A320 | 100000 |

+--------+---------+

1 row in set (001 sec)

Query OK 0 rows affected (001 sec)

Tableau 7-36 Creacuteation dynamique drsquoune requecircte avec placeholder

Code MySQL Commentaires

CREATE PROCEDURE bdsoutousousProg(IN v_param1 CHAR(6) IN v_param2 CHAR(6) IN v_param3 CHAR(5) IN v_param4 CHAR(5))BEGIN SET vs_immat = F-GLFS SET vs_chaine = CONCAT( PREPARE etat FROM vs_chaine EXECUTE etat USING vs_immat DEALLOCATE PREPARE etatEND

Avec lrsquoappel suivant construction de la chaicircne lsquoSELECT typeAvnbHVol FROM bdsoutouAvion WHERE immat=rsquo

Exeacutecution de la requecircte parameacutetreacutee

Web

SELECT v_param1v_param2 FROM bdsoutouv_param3 WHERE v_param4 = )

4055_07_C07 Page 283 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

284 copy Eacuteditions Eyrolles

Exercices

Lrsquoobjectif de ces exercices est drsquoeacutecrire des sous-programmes MySQL manipulant des curseurset geacuterant des exceptions sur la base de donneacutees Parc informatique

71 Curseur

On deacutesire connaicirctre pour chaque logiciel installeacute le temps (nombre de jours entier deacutecimal) passeacuteentre lrsquoachat et lrsquoinstallation Ce calcul devra renseigner la colonne delai de la table Installerpour lrsquoinstant nulle

Utiliser une table testTrace(message VARCHAR(80) (et lrsquoafficher en fin de sous-programme)pour stocker

bull les incoheacuterences (date drsquoinstallation anteacuterieure agrave la date drsquoachat date drsquoinstallation ou date drsquoachatinconnue)

bull le nombre entier de jours seacuteparant lrsquoachat de lrsquoinstallation (utiliser DATEDIFF)

bull une chaicircne simulant un format TIME eacutetendu qui repreacutesente le nombre de jours deacutecimal seacuteparantlrsquoachat de lrsquoinstallation (par exemple si le nombre de jours deacutecimal vaut laquo 145 raquo il faudra cons-truire la chaicircne laquo 14 j 120000 raquo)

Eacutecrire la proceacutedure calculTemps pour programmer ce processus Un exemple de tabletestTrace agrave produire en sortie

+------------------------------------------------------------------+

| message |

+------------------------------------------------------------------+

| Logiciel Oracle 6 sur Poste 2 attente 2924 jour(s) |

| En format TIME eacutetendu 2924 j 000000 |

| Logiciel Oracle 8 sur Poste 2 attente 1463 jour(s) |

| hellip |

| Logiciel I I S installeacute sur Poste 7 11 jour(s) avant lachat |

| Date dachat inconnue pour le logiciel SQLNet sur Poste 2 |

| Logiciel Oracle 6 sur Poste 8 attente 3876 jour(s) |

| En format TIME eacutetendu 3876 j 105917 |

| hellip |

+------------------------------------------------------------------+

72 Transaction

Eacutecrire la proceacutedure installLogSeg permettant drsquoeffectuer une installation groupeacutee sur tous lespostes drsquoun mecircme segment drsquoun nouveau logiciel La transaction doit enregistrer dans un premiertemps le nouveau logiciel puis les diffeacuterentes installations sur tous les postes du segment de mecircmetype que celui du logiciel acheteacute Lrsquoinstallation se fera agrave la date du jour Penser agrave mettre agrave jour lacolonne delai comme programmeacute preacuteceacutedemment

4055_07_C07 Page 284 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 285

chapitre ndeg 7 Programmation avanceacutee

Ne pas encore tenir compte des eacuteventuelles exceptions et tracer chaque insertion dans la tabletestTrace Utiliser les paramegravetres ci-dessous pour tester votre proceacutedure Lrsquoeacutetat de sortie doit ecirctrele suivant Veacuterifier aussi la preacutesence des deux nouveaux enregistrements dans la table InstallerNe programmer le COMMIT qursquoune fois la proceacutedure bien testeacutee

CALL installLogSeg(13012080 log99 Blaster 2005-09-05

99 PCWS 9999)$

+---------------------------------------+

| message |

+---------------------------------------+

| Blaster stockeacute dans la table Logiciel |

| Installation sur Poste 4 dans Salle 2 |

| Installation sur Poste 5 dans Salle 2 |

+---------------------------------------+

73 Exceptions

Modifier la proceacutedure installLogSeg afin de prendre en compte quelques-unes des exceptionspotentielles

bull numeacutero de segment inconnu (erreur NOT FOUND)

bull numeacutero de logiciel deacutejagrave preacutesent (ERROR 1062 Duplicate entry)

bull type du logiciel inconnu (ERROR 1452 Cannot add or update a child row)

bull date drsquoachat posteacuterieure agrave celle du jour (se servir du mecircme calcul que pour la colonne delai delrsquoexercice preacuteceacutedent)

bull aucune installation reacutealiseacutee car pas de poste de travail de ce type (erreur utilisateur pas_install_possible)

Veacuterifier chacun de ces cas avec le jeu de tests suivant

--test segmentCALL installLogSeg( log99Blaster 2005-09-05 99 PCWS 9999)$--test logiciel deacutejagrave preacutesentCALL installLogSeg(13012080 Blaster 2005-09-05 99 PCWS 9999)$--test type du logicielCALL installLogSeg(13012080 log98Mozilla 2005-11-04 1 1000)$--date drsquoachat plus grande que celle du jour CALL installLogSeg(13012080 log98Mozilla 1 PCWS 1000)$--aucune installCALL installLogSeg( log55Eudora 2005-12-06 5

540)$--bonne installationCALL installLogSeg(13012080 log77Blog Up 2005-12-05 13 PCWS 90)$

toto

log1

toto

2010-11-04

13012081PCWS

4055_07_C07 Page 285 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie II Programmation proceacutedurale

286 copy Eacuteditions Eyrolles

74 Deacuteclencheurs

Mises agrave jour de colonnes

Eacutecrire les deacuteclencheurs Trig_AD_Installer et Trig_AI_Installer sur la table Installerpermettant de faire la mise agrave jour automatique des colonnes nbLog de la table Poste et nbIns-tall de la table Logiciel Preacutevoir les cas de deacutesinstallation drsquoun logiciel (AFTER DELETE) sur unposte et drsquoinstallation (AFTER INSERT) drsquoun logiciel sur un autre

Eacutecrire les deacuteclencheurs Trig_AI_Poste et Trig_AD_Poste sur la table Poste permettantdrsquoactualiser la colonne nbPoste de la table Salle agrave chaque ajout ou suppression drsquoun nouveauposte

Eacutecrire le deacuteclencheur Trig_AU_Salle sur la table Salle qui met agrave jour automatiquement lacolonne nbPoste de la table Segment apregraves la modification de la colonne nbPoste

Ces deux derniers deacuteclencheurs vont srsquoenchaicircner lrsquoajout ou la suppression drsquoun poste entraicircneralrsquoactualisation de la colonne nbPoste de la table Salle qui conduira agrave la mise agrave jour de la colonnenbPoste de la table Segment Ajouter un poste pour veacuterifier le rafraicircchissement des deux tables(Salle et Segment) Supprimer ce poste puis veacuterifier agrave nouveau la coheacuterence des deux tables

Programmation de contraintes

Eacutecrire le deacuteclencheur Trig_BI_Installer sur la table Installer permettant de controcircler avantchaque nouvelle installation que le type du logiciel correspond au type du poste et que la datedrsquoinstallation est soit nulle soit posteacuterieure agrave la date drsquoachat

4055_07_C07 Page 286 Jeudi 2 mars 2006 256 14 gt Apogee FrameMaker Noir

Partie III

Langages et outils

4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

289

Chapitre 8

Utilisation avec Java

MySQL offre sur son site diffeacuterents pilotes pour rendre compatibles des applications avecune base de donneacutees sur diffeacuterents systegravemes

ConnectorODBC

(

Open DataBase Connectivity

) pour Windows Linux Mac OS X etUnix

ConnectorJ

pour toute plate-forme Java en utilisant JDBC (

Java DataBaseConnectivity

)

ConnectorNet

pour toute plate-forme Net

ConnectorMXJ composant qui encapsule le moteur MySQL dans une application J2EE

Ce chapitre explique lrsquoutilisation de lrsquoAPI JDBC 30 pour manipuler une base MySQL via unprogramme Java

JDBC avec ConnectorJ

Lrsquointerface JDBC initialement programmeacutee par Sun appeleacutee aussi laquo passerelle raquo ou laquo API raquoest composeacutee drsquoun ensemble de classes permettant le dialogue entre une application Java etune source de donneacutees compatible SQL (tables relationnelles en geacuteneacuteral mais aussi donneacuteesissues drsquoun fichier texte ou drsquoun classeur Excel par exemple) LrsquoAPI JDBC 30 que MySQLfournit gratuitement est appeleacutee

ConnectorJ

Lrsquointerface JDBC est conforme au niveau drsquoentreacutee de la norme SQL2 (

entry

level

) et prend encharge la programmation

multithread

La communication est reacutealiseacutee en mode client-serveurdeacuteconnecteacute et srsquoeffectue en plusieurs eacutetapes

connexion agrave la base de donneacutees

eacutemissions drsquoinstructions SQL et exploitation des reacutesultats provenant de la base dedonneacutees

deacuteconnexion de la base

Le spectre de JDBC est large car lrsquoapplicatif Java peut ecirctre une classe ou une

applet

cocircteacuteclient une

servlet

un EJB (

Enterprise Java Beans

) ou une proceacutedure catalogueacutee cocircteacute serveur

4055_08_C08 Page 289 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

290

copy Eacuteditions Eyrolles

Classification des pilotes (drivers)

Un pilote (

driver

) JDBC est une couche logicielle chargeacutee drsquoassurer la liaison entre lrsquoapplicationJava (cliente) et le SGBD (serveur) La classification des pilotes JDBC distingue quatre types

Les pilotes de type 1 (

JDBC-ODBC Bridge

) utilisent la couche logicielle de Microsoftappeleacutee ODBC Le client est dit laquo eacutepais raquo puisque le pilote JDBC convertit les appels Javaen appels ODBC avant de les exeacutecuter Cette approche convient bien pour des sources dedonneacutees Windows ou si lrsquointerface cliente est eacutecrite dans un langage natif de Microsoft

Les pilotes de type 2 (

Native-API Partly-Java Driver

) utilisent un pilote fourni par le cons-tructeur de la base de donneacutees (natif) Le pilote nrsquoeacutetant pas deacuteveloppeacute en Java le client estaussi dit laquo eacutepais raquo pour cette approche En effet les commandes JDBC sont toutes conver-ties en appels natifs du SGBD consideacutereacute Cette approche convient pour les applications quimanipulent des sources de donneacutees uniques (tout Oracle ou IBM etc)

Les pilotes de type 3 (

Net Protocol All-Java Driver

) utilisent un pilote geacuteneacuterique natif eacutecriten Java Le client est plus laquo leacuteger raquo car les appels JDBC sont transformeacutes par un protocoleindeacutependant du SGBD Cette approche convient pour des sources de donneacutees heacuteteacuterogegravenes

Les pilotes de type 4 (

Native Protocol All-Java Driver

) sont eacutecrits en Java Le client estleacuteger car il ne neacutecessite aucune couche logicielle suppleacutementaire Les appels JDBC sonttraduits en

sockets

exploiteacutes par le SGBD Cette approche est la plus simple mais pasforceacutement la plus puissante elle convient pour tous les types drsquoarchitectures

La figure suivante scheacutematise le principe mis en œuvre au travers des quatre types de pilotes JDBC

Le choix du pilote nrsquoa pas drsquoinfluence majeure sur la programmation Seules les phases dechargement du pilote et de connexion aux bases sont speacutecifiques les autres instructions sontindeacutependantes du pilote En drsquoautres termes si vous avez une application deacutejagrave eacutecrite et que

Figure 8-1

Types de pilotes JDBC

BD

Java

JDB C

ODBC

ODBC

BD

Java

JDB C

Driver BD

Driver BD

Java

Driver

Java

100

Driver Geacuteneacuterique

Driver

IBM

BD

Driver

IBM

DriverOracle

Java

Driver

100 Java

BD

type 1 type 2 type 3 type 4

TCP IP

4055_08_C08 Page 290 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

291

chapitre ndeg 8 Utilisation avec Java

vous deacutecidez de changer le type du pilote ndash soit que la source de donneacutees migre de MySQL agraveAccess agrave Oracle ou agrave SQL Server par exemple soit que vous optiez pour un autre pilote enconservant votre source de donneacutees ndash seules quelques instructions devront ecirctre reacuteeacutecrites

Avec MySQL vous pouvez travailler avec lrsquoAPI de Sun mais vous nrsquoavez pas trop le choixpour le type du pilote (

ConnectorJ

est un pilote JDBC de type 4)

Le paquetage

javasql

La version 30 de JDBC est composeacutee de classes et drsquointerfaces situeacutees dans le paquetage

javasql

du JDK MySQL propose eacutegalement une API proprieacutetaire (qui redeacutefinit et eacutetendcelle de Sun) Le tableau suivant reacutesume la composition de ce paquetage

Structure drsquoun programme

La structure drsquoun programme Java utilisant JDBC comprend successivement les phases

drsquoimportation de paquetages

de chargement drsquoun pilote

de creacuteation drsquoune ou de plusieurs connexions

de creacuteation drsquoun ou de plusieurs eacutetats

drsquoeacutemission drsquoinstructions SQL sur ces eacutetats

de fermeture des objets creacuteeacutes

Le code suivant (

JDBCTestjava

) deacutecrit la syntaxe du plus simple programme JDBC Nousinscrivons toutes les phases dans un mecircme bloc (le

main

) mais elles peuvent se trouver dansdiffeacuterents blocs ou meacutethodes de diverses classes

Tableau 8-1 LrsquoAPI JDBC 30 standard

Classeinterface Description

javasqlDriverjavasqlConnection

Pilotes JDBC pour les connexions aux sources de donneacutees SQL

javasqlStatementjavasqlPreparedStatementjavasqlCallableStatement

Construction drsquoordres SQL

javasqlResultSet

Gestion des reacutesultats des requecirctes SQL

javasqlDriverManager

Gestion des pilotes de connexion

javasqlSQLException

Gestion des erreurs SQL

javasqlDatabaseMetaDatajavasqlResultSetetaData

Gestion des meacuteta-informations (description de la base de donneacutees des tableshellip)

javasqlSavePoint

Gestion des transactions et des sous-transactions

4055_08_C08 Page 291 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

292

copy Eacuteditions Eyrolles

Le dernier bloc permet de reacutecupeacuterer les erreurs renvoyeacutees par le SGBD Nous deacutetaillerons enfin de section le traitement des exceptions

Test de votre configuration

Lrsquoenvironnement JDBC sous MySQL neacutecessite la configuration drsquoun certain nombre de variables

La variable

PATH

doit contenir le chemin de la machine virtuelle Java pour compiler etexeacutecuter des classes Le JDK est en geacuteneacuteral installeacute dans

Cj2sdk1XXX

les fichiers

javac

et

java

se trouvent dans le sous-reacutepertoire

bin

La variable

CLASSPATH

doit inclure le paquetage JDBC (fichier

jar

) pour MySQL (teacuteleacute-chargeable sur le site de MySQL) Pour ma part jrsquoai deacutezippeacute le fichier

mysql-connec-tor-java-3112zip

dans le reacutepertoire

Ctemp

Tableau 8-2 Programme de test de connexion JDBC

Code Java Commentaires

import javasql

Importation du paquetage

public class JDBCTestpublic static void main(String[] args) throws SQLException Exception

Classe ayant une meacutethode

main

try Systemoutprintln (Initialisation de la connexion) ClassforName (commysqljdbcDriver)newInstance() catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement+extoString()) try Connection cx = DriverManagergetConnection (jdbcmysqllocalhostbdsoutou user=soutouamppassword=iut)

Chargement du pilote JDBC MySQL

Creacuteation drsquoune connexion

Statement etat = cxcreateStatement () ResultSet rset = etatexecuteQuery (SELECT SYSDATE()) while (rsetnext ()) Systemoutprintln(Nous sommes le + rsetgetString (1)) Systemoutprintln(JDBC correctement configureacute)

Creacuteation drsquoun eacutetat de connexionExtraction de la date courante

Affichage du reacutesultat

catch(SQLException ex) Systemerrprintln(Erreur +ex)

Gestion des erreurs

Web

4055_08_C08 Page 292 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

293

chapitre ndeg 8 Utilisation avec Java

Vous pouvez tester votre environnement en utilisant le fichier

JDBCTest

java

Si vous utili-sez lrsquooutil

JCreator

configurez la variable

CLASSPATH

de la maniegravere suivante

Confi-gure

Options

JDK Profiles

clic sur la version du JDK puis

Edit

onglet

Classes

faire

Add Archive

et choisir le fichier

jar

(pour mon cas

mysql-connector-java-3112-binjar

)

Cet exemple deacutecrit le code neacutecessaire agrave la connexion agrave votre base (il faudra modifier le nom dela base le nom et le mot de passe de lrsquoutilisateur) et doit renvoyer les messages suivants

Initialisation de la connexion

Nous sommes le

date et heure courante

JDBC correctement configureacute

Connexion agrave une base

La connexion agrave une base de donneacutees est rendue possible par lrsquoutilisation de la classe

Driver-Manager

et de lrsquointerface

Connection

Deux eacutetapes sont neacutecessaires pour qursquoun programme Java puisse se connecter agrave une base dedonneacutees

bull Le chargement du pilote par appel de la meacutethode

javalangClassforName

bull Lrsquoeacutetablissement de la connexion en creacuteant un objet (ici cx) de lrsquointerface Connection parlrsquoinstruction suivante cx = DriverManagergetConnection(chaicircneConnexion)

Pour MySQL nous verrons que le paramegravetre chaicircneConnexion repreacutesente une variabledont une syntaxe simplifieacutee est de type

jdbcmysql[host][port][database][user][=nomUtil][amppassword][=motPasse]

Cette chaicircne permettra de deacutesigner la base et drsquoidentifier lrsquoutilisateur

Figure 8-2 Interface JCreator

4055_08_C08 Page 293 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

294 copy Eacuteditions Eyrolles

Base Access

Eacutetudions pour information lrsquoeacutetablissement de la connexion drsquoun pilote de type 1 pour semettre en rapport avec une base Access via une source de donneacutees ODBC La figure suivanteillustre les parties du panneau de configuration Windows qui permettent de deacutesigner une baseAccess Dans notre exemple la source (BaseGTRMDB) est situeacutee dans un reacutepertoire souslrsquouniteacute de disque D et deacutesigneacutee par le DSN (Data Source Name) sourcebaseGTR

Le code suivant (TestJDBCODBCjava) charge un pilote de type 1 puis se connecte agrave lasource ODBC preacuteciteacutee (inutile de preacuteciser le nom et le mot de passe de lrsquoutilisateur du faitdrsquoune base Access) Le DSN est noteacute en gras dans le script

Figure 8-3 Source de donneacutees ODBC

Tableau 8-3 Programme JDBC

Code Java Commentaires

import javasql Importationclass TestJDBCODBC public static void main (String args []) throws SQLException try catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement) try

Classe ayant une meacutethode mainChargement drsquoun pilote JDBCODBC

Connexion agrave la base Access

catch(SQLException ex) hellip Gestion des erreurs

Web

ClassforName(sunjdbcodbcJdbcOdbcDriver)

Connection conn = DriverManagergetConnection(jdbcodbcsourcebaseGTR)

4055_08_C08 Page 294 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 295

chapitre ndeg 8 Utilisation avec Java

Base MySQL

Seules les phases de chargement de pilote et de creacuteation de la connexion changent Afin detransfeacuterer un pilote MySQL il faut utiliser lrsquointerface DriverManager impleacutementeacutee parlrsquoappel de la meacutethode ClassforName() Sous ConnectorJ le nom de la classe agrave chargerest commysqljdbcDriver La connexion srsquoeffectue par la meacutethode getConnection

Interface ConnectionLe tableau ci-apregraves preacutesente les principales meacutethodes disponibles de lrsquointerface Connec-tion Nous deacutetaillerons lrsquoinvocation de certaines de ces meacutethodes agrave lrsquoaide des exemples dessections suivantes

Tableau 8-4 Chargement du pilote MySQL

Code Java Commentaires

try catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement+extoString())

Chargement du pilote MySQL

try

Deacuteclaration drsquoune con-nexion

catch(SQLException ex) Systemerrprintln(Erreur +ex)

Gestion des erreurs

ClassforName(commysqljdbcDriver)newInstance()

Connection cx = DriverManagergetConnection(jdbcmysqllocalhostbdsoutou

user=soutouamppassword=iut)

Tableau 8-5 Meacutethodes de lrsquointerface Connection

Meacutethode Description

createStatement() Creacuteation drsquoun objet destineacute agrave recevoir un ordre SQL statiquenon parameacutetreacute

prepareStatement(String) Preacutecompile un ordre SQL acceptant des paramegravetres et pouvantecirctre exeacutecuteacute plusieurs fois

prepareCall(String) Appel drsquoune proceacutedure catalogueacutee (certains pilotes attendentexecute ou ne reconnaissent pas prepareCall)

void setAutoCommit(boolean) Positionne ou non le commit automatique

void commit() Valide la transaction

void rollback() Invalide la transaction

void close() Ferme la connexion

4055_08_C08 Page 295 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

296 copy Eacuteditions Eyrolles

Eacutetats drsquoune connexion

Une fois la connexion eacutetablie il est neacutecessaire de deacutefinir des eacutetats qui permettront lrsquoencapsu-lation drsquoinstructions SQL dans du code Java Un eacutetat permet de faire passer plusieurs instruc-tions SQL sur le reacuteseau On peut affecter agrave un eacutetat une ou plusieurs instruction SQL Si ondeacutesire exeacutecuter plusieurs fois la mecircme instruction il est inteacuteressant de reacuteserver lrsquoutilisationdrsquoun eacutetat agrave cet effet

Interfaces disponibles

Diffeacuterentes interfaces sont preacutevues agrave cet effet

Statement pour les ordres SQL statiques Ces eacutetats sont construits par la meacutethodecreateStatement appliqueacutee agrave la connexion

PreparedStatement pour les ordres SQL parameacutetreacutes Ces eacutetats sont construits par lameacutethode prepareStatement appliqueacutee agrave la connexion

CallableStatement pour les proceacutedures ou fonctions catalogueacutees Ces eacutetats sont cons-truits par la meacutethode prepareCall appliqueacutee agrave la connexion

Srsquoil ne doit plus ecirctre utiliseacute dans la suite du code Java chaque objet de type StatementPreparedStatement ou CallableStatement devra ecirctre fermeacute agrave lrsquoaide de la meacutethodeclose

Meacutethodes geacuteneacuteriques pour les paramegravetres

Une fois qursquoun eacutetat est creacuteeacute il est possible de lui passer des paramegravetres par des meacutethodes geacuteneacute-riques (eacutetudieacutees plus en deacutetail par la suite)

setxxx ougrave XXX deacutesigne le type de la variable (exemple setString ou setInt) dusens Java vers MySQL (setter methods) Il srsquoagit ici de parameacutetrer un ordre SQL(instruction ou appel drsquoun sous-programme)

Figure 8-4 Connexion et eacutetats

Connection Statement

Statement

PreparedstatementBaseMySQL

Java

JDBC

SELECT INSERThellip

Donneacutees (INT VARCHAR )

4055_08_C08 Page 296 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 297

chapitre ndeg 8 Utilisation avec Java

getxxx (exemple getString ou getInt) du sens MySQL vers Java Il srsquoagit icidrsquoextraire des donneacutees de la base dans des variables hocirctes Java via un curseur Java (gettermethods)

updatexxx (exemple updateString ou upadateInt) du sens Java vers MySQL Ilsrsquoagit ici de mettre agrave jour des donneacutees de la base via un curseur Java (updater methods)Ces meacutethodes sont disponibles seulement depuis la version 2 de JDBC (SDK 12)

Eacutetats simples (interface Statement)

Nous deacutecrivons ici lrsquoutilisation drsquoun eacutetat simple (interface Statement) Nous eacutetudierons parla suite les instructions parameacutetreacutees (interface PreparedStatement) et appels de sous-programmes (interface CallableStatement) Le tableau suivant deacutecrit les principalesmeacutethodes de lrsquointerface Statement

Le code suivant (Etatsjava) preacutesente quelques exemples drsquoutilisation de ces meacutethodes surun eacutetat (objet etatSimple) Nous supposons qursquoun pilote JDBC est chargeacute et que laconnexion cx a eacuteteacute creacuteeacutee Nous verrons en fin de chapitre comment traiter proprement lesexceptions

Tableau 8-6 Meacutethodes de lrsquointerface Statement

Meacutethode Description

ResultSet execute-Query(String)

Exeacutecute une requecircte et retourne un ensemble de lignes (objetResultSet)

int executeUpdate(String) Exeacutecute une instruction SQL et retourne le nombre de lignestraiteacutees (INSERT UPDATE ou DELETE) ou 0 pour les instruc-tions ne renvoyant aucun reacutesultat (LDD)

boolean execute(String) Exeacutecute une instruction SQL et renvoie true si crsquoest une ins-truction SELECT false sinon (instructions LMD ou plusieursreacutesultats ResultSet)

Connection getConnection() Retourne lrsquoobjet de la connexion

void setMaxRows(int) Positionne la limite du nombre drsquoenregistrements agrave extraire partoute requecircte issue de cet eacutetat

int getUpdateCount() Nombre de lignes traiteacutees par lrsquoinstruction SQL (-1 si crsquoest unerequecircte ou si lrsquoinstruction nrsquoaffecte aucune ligne)

void close() Ferme lrsquoeacutetat

4055_08_C08 Page 297 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

298 copy Eacuteditions Eyrolles

Meacutethodes agrave utiliser

Le tableau suivant indique la meacutethode preacutefeacuterentielle agrave utiliser sur lrsquoeacutetat courant (objet State-ment) en fonction de lrsquoinstruction SQL agrave eacutemettre

Correspondances de types

Les eacutechanges de donneacutees entre variables Java et colonnes des tables Oracle impliquent depreacutevoir des conversions de types Drsquoune maniegravere geacuteneacuterale tout type de donneacutee MySQL peutecirctre convertit en un type javalangString Les types numeacuteriques trouvent aussi unecorrespondance dans les types numeacuteriques Java (attention toutefois aux arrondis deacutepassementde capaciteacute ou perte de preacutecision)

Tableau 8-7 Eacutetats simples

Code Java Commentaires

Statement etatSimple = cxcreateStatement() Creacuteation de lrsquoeacutetat (CREATE TABLE IF NOT EXISTSCompagnie(comp VARCHAR(4) nomComp VARCHAR(30)CONSTRAINT pk_Compagnie PRIMARY KEY(comp)))

Ordre LDD

(CREATE TABLE IF NOT EXISTS Avion (immat VARCHAR(6)typeAvionVARCHAR(15) cap SMALLINT compa VARCHAR(4) CONSTRAINT pk_Avion PRIMARY KEY(immat) CONSTRAINT fk_Avion_comp_Compagnie FOREIGN KEY(compa) REFERENCESCompagnie(comp)))

Ordre LDD (autre eacutecri-ture) j contient 0 (aucune ligne nrsquoest con-cerneacutee)

(INSERT INTOCompagnie VALUES (AFAir France))

Ordre LMD k contient 1 (une ligne est concerneacutee)

(INSERT INTO Avion VALUES (F-WTSSConcorde90AF)) (INSERT INTO Avion VALUES (F-FGFBA320148AF))

Ordres LMD (autres eacutecri-tures)

(10) Pas plus de 10 lignes retourneacutees par les pro-chaines extractions

ResultSet curseurJava = (SELECT FROM Avion)

Chargement drsquoun curseur Java

etatSimpleexecute(DELETE FROM Avion) int l = ()

Ordre LMD l contient 2 (avions supprimeacutes)

WebetatSimpleexecute

int j = etatSimpleexecuteUpdate

int k = etatSimpleexecuteUpdate

etatSimpleexecute

etatSimpleexecute

etatSimplesetMaxRows

etatSimpleexecuteQuery

etatSimplegetUpdateCount

Tableau 8-8 Meacutethodes Java pour les ordres SQL

Instruction SQL Meacutethode Type de retour

CREATE ALTER DROP executeUpdate int

INSERT UPDATE DELETE executeUpdate int

SELECT executeQuery ResultSet

4055_08_C08 Page 298 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 299

chapitre ndeg 8 Utilisation avec Java

Les tableaux suivants preacutesentent les principales correspondances existantes

La meacutethode getObject()de lrsquointerface ResultSet (que nous allons eacutetudier plus loin)reacutealise implicitement les conversions suivantes

Tableau 8-9 Conversions possibles entre types

Les types MySQL Peuvent creacuteer les classes Java

CHAR VARCHAR BLOB TEXT ENUM et SET

javalangString javaioInputStream javaioReader javasqlBlob et javasqlClob

FLOAT REAL DOUBLE PRECISION NUMERIC DECIMAL TINYINT SMALLINT MEDIUMINT INTEGER et BIGINT

javalangString javalangShort javalangInteger javalangLong javalangDou-ble et javamathBigDecimal

DATE TIME DATETIME et TIMESTAMP

javalangString javasqlDate et javasqlTimestamp

Tableau 8-10 Correspondances entre types

Types MySQL Types Java

BOOL et BOOLEAN alias de TINYINT(1)

BLOB BINARY(n) BIT(gt1) LONGBLOB MEDIUMBLOB TINYBLOB et VARBINARY(n)

byte[]

BIT(1) et TINYINT javalangBoolean si la configuration tinyInt1isBit est mise agrave true (par deacutefaut) et la taille de la variable = 1 (javalangInteger sinon)

DOUBLE[(np)] javalangDouble

FLOAT[(np)] javalangFloat

SMALLINT[(n)] [UNSIGNED] javalangInteger (sans controcircle du signe)

INT et INTEGER[(n)] [UNSIGNED] javalangInteger (si UNSIGNED javalangLong)

MEDIUMINT[(n)] [UNSIGNED] javalangInteger (si UNSIGNED javalangLong)

BIGINT[(n)] [UNSIGNED] javalangLong (si UNSIGNEDjavamathBigInteger)

TINYTEXT TEXT MEDIUMTEXTLONGTEXT ENUM() et SET()

javalangString

CHAR(M) VARCHAR(M) [BINARY] javalangString (si BINARY byte[])

DECIMAL[(n[p])] javamathBigDecimal

DATE javasqlDate

YEAR[(2|4)] javasqlDate (date initialiseacutee au 1er Janvier 0h)

TIME javasqlTime

DATETIME TIMESTAMP[(n)] javasqlTimestamp

4055_08_C08 Page 299 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

300 copy Eacuteditions Eyrolles

Il est possible de connaicirctre le type de la variable (ou de lrsquoobjet Java) que vous devez utiliserdans votre programme JDBC pour travailler avec une colonne col drsquoune table tab Pour cefaire utiliser la meacutethode Class getClass() appliqueacute agrave lrsquoobjet reacutesultant de lrsquoextraction de lacolonne dans le ResultSet par getObject(col) Une fois cette classe instancieacutee il resteagrave utiliser String getName() pour trouver son nom

Le code suivant (CorresTypesjava) preacutesente la maniegravere drsquoextraire le type Java neacutecessairepour travailler avec la colonne cap de la table Avion (ici SMALLINT)

La trace de ce programme est la suivante

Valeur 148

Classe Java equivalente

Manipulations avec la base

Deacutetaillons agrave preacutesent les diffeacuterents sceacutenarios que lrsquoon peut rencontrer lors drsquoune manipulationde la base de donneacutees par un programme Java Les tableaux suivants reacutepertorient les conseacute-quences les plus freacutequentes Les autres cas (relatifs aux contraintes reacutefeacuterentielles et auxproblegravemes de syntaxe) seront eacutetudieacutes dans la section Traitement des exceptions

Suppression de donneacutees

Tableau 8-11 Deacuteduction du type Java agrave utiliser

Code Java Commentaires

ResultSet curseurJava = etatSimpleexecuteQuery (SELECT cap FROM Avion LIMIT 1)

Extraction dans un curseur de lacapaciteacute du premier avion

while (curseurJavanext ()) Ouverture et lecture du curseur Systemoutprintln(Valeur +curseurJavagetObject(cap)) Systemoutprintln (Classe Java equivalente + )

Extraction de lrsquoobjet Java eacutequiva-lent

Deacuteduction de sa classe

Web

Object obj = curseurJavagetObject(cap)

Class clJava = objgetClass()

clJavagetName()

javalangInteger

Tableau 8-12 Enregistrements preacutesents dans la table

Code Java Reacutesultat

etatexecuteUpdate(DELETE FROM Avion) Fait la suppression et passe en seacutequence

j = etatexecuteUpdate(DELETE FROM Avion) Fait la suppression affecte agrave j le nombredrsquoenregistrements supprimeacutes et passe enseacutequence

4055_08_C08 Page 300 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 301

chapitre ndeg 8 Utilisation avec Java

Ajout drsquoenregistrements

Modification drsquoenregistrements

Extraction de donneacutees

Eacutetudions ici la gestion des reacutesultats drsquoune instruction SELECT

Le reacutesultat drsquoune requecircte est placeacute dans un objet de lrsquointerface ResultSet qui srsquoapparente agraveun curseur Java

Le tableau suivant preacutesente les principales meacutethodes disponibles de lrsquointerface ResultSetLes meacutethodes relatives aux curseurs navigables seront eacutetudieacutees par la suite Le parcours de cecurseur srsquoopegravere par la meacutethode next Initialement (apregraves creacuteation et chargement du curseur)on est positionneacute avant la premiegravere ligne Bien qursquoun objet de lrsquointerface ResultSet soitautomatiquement fermeacute quand son eacutetat est fermeacute ou recreacuteeacute il est preacutefeacuterable de le fermer expli-citement par la meacutethode close srsquoil ne doit pas ecirctre reacuteutiliseacute

Tableau 8-13 Aucun enregistrement dans la table

Code Java Reacutesultat

etatexecuteUpdate(DELETE FROM Avion) Aucune action sur la base et passe enseacutequence

j = etatexecuteUpdate(DELETE FROM Avion) Aucune action sur la base affecte agrave j lavaleur 0 et passe en seacutequence

Tableau 8-14 Diffeacuterentes eacutecritures drsquoun INSERT

Code Java Reacutesultat

etatexecuteUpdate(INSERT INTO Compagnie VALUES (TAFToulouse Air Free))

Fait lrsquoinsertion et passe en seacutequence

int j= etatexecuteUpdate(INSERT INTO Compa-gnie VALUES (TAFToulouse Air Free))

Fait lrsquoinsertion affecte agrave j le nombre 1 etpasse en seacutequence

Tableau 8-15 Diffeacuterentes eacutecritures drsquoun UPDATE

Code Java Reacutesultat

etatexecuteUpdate(UPDATE Compagnie SET nomComp = Air France Compagny WHERE comp = AF)

Fait la modification et passe enseacutequence Si aucun enregistrement nrsquoestconcerneacute aucune exception nrsquoest leveacutee

int j= etatexecuteUpdate(UPDATE Avion SET capacite=capacite12)

Fait la (les) modification(s) affecte agrave j lenombre drsquoenregistrements modifieacutes etpasse en seacutequence (0 si aucun enregis-trement nrsquoest modifieacute)

4055_08_C08 Page 301 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

302 copy Eacuteditions Eyrolles

Distinguons lrsquoinstruction SELECT qui geacutenegravere un curseur statique (objet Resultset utiliseacutesans option particuliegravere) de celle qui produit un curseur navigable ou modifiable (objetResultset employeacute avec des options disponibles depuis la version 2 de JDBC)

Curseurs statiques

Le code suivant (SELECTstatiquejava) extrait les avions de la compagnie Air Francepar lrsquointermeacutediaire du curseur curseurJava Notez lrsquoutilisation des diffeacuterentes meacutethodesget pour reacutecupeacuterer des valeurs issues de colonnes

Tableau 8-16 Meacutethodes principales de lrsquointerface ResulSet

Meacutethode Description

boolean next() Charge lrsquoenregistrement suivant en retournant true renvoiefalse lorsqursquoil nrsquoy a plus drsquoenregistrement suivant

void close() Ferme le curseur

getxxx(int) Reacutecupegravere au niveau de lrsquoenregistrement la valeur de lacolonne numeacuteroteacutee de type xxx Exemple getInt(1) getS-tring(1) getDate(1) etc pour reacutecupeacuterer la valeur de la pre-miegravere colonne

updatexxx(hellip) Modifie au niveau de lrsquoenregistrement la valeur de la colonnenumeacuteroteacutee de type xxx Exemple updateInt(1i)updateString(1nom) etc

ResultSetMetaData getMetaData() Retourne un objet ResultSetMetaData correspondant au curseur

Object getObject(String) Retourne la valeur de la colonne deacutesigneacutee par le paramegravetredans une variable Java de type adeacutequat

Tableau 8-17 Extraction de donneacutees dans un curseur statique

Code Java Commentaires

try hellipStatement etatSimple = cxcreateStatement() Creacuteation de lrsquoeacutetat

= (SELECT immat cap FROM Avion WHERE comp = (SELECT comp FROM Compagnie WHERE nom-Comp=Air France))

Creacuteation et charge-ment du curseur

float moyenneCapaciteacute =0int nbAvions = 0while ( ) Systemoutprint(Immat + Systemoutprintln(Capaciteacute + moyenneCapaciteacute += curseurJavagetInt(2) nbAvions ++ moyenneCapaciteacute = nbAvions Systemoutprintln(Capaciteacute moy +moyenneCapaciteacute)

Parcours du curseur

Extraction de colonnes

Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

ResultSet curseurJavaetatSimpleexecuteQuery

curseurJavanext()curseurJavagetString(1))

curseurJavagetInt(2))

curseurJavaclose()

4055_08_C08 Page 302 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 303

chapitre ndeg 8 Utilisation avec Java

Curseurs navigables

Un curseur ResultSet deacuteclareacute sans option nrsquoest ni navigable ni modifiable Seul un deacuteplace-ment du deacutebut vers la fin (par la meacutethode next) est admis Il est possible de rendre un curseurnavigable en permettant de le parcourir en avant ou en arriegravere et en autorisant lrsquoaccegraves direct agraveun enregistrement drsquoune maniegravere absolue (en partant du deacutebut ou de la fin du curseur) ou rela-tive (en partant de la position courante du curseur) On peut aussi rendre un curseur modifiable(la base pourra ecirctre changeacutee par lrsquointermeacutediaire du curseur)

Degraves lrsquoinstant ougrave on deacuteclare un curseur navigable il faut aussi statuer sur le fait qursquoil soit modi-fiable ou pas (section suivante) La nature du curseur est expliciteacutee agrave lrsquoaide drsquooptions de lameacutethode createStatement

Statement createStatement(int typeCurseur int modifCurseur)

Constantes

Les valeurs permises du premier paramegravetre (typeCurseur) et qui concernent le sens deparcours sont preacutesenteacutees dans le tableau suivant

Un curseur est sensible degraves que des mises agrave jour de la table sont automatiquement reacutepercu-teacutees au niveau du curseur durant la transaction Lorsqursquoil est deacuteclareacute insensible les modifica-tions de la table ne sont pas renvoyeacutees dans le curseur

Meacutethodes

Les principales meacutethodes que lrsquoon peut appliquer agrave un curseur navigable sont les suivantesLes deux premiegraveres sont aussi des meacutethodes de lrsquointerface Statement qui affectent et preacuteci-sent le sens de parcours pour tous les curseurs de lrsquoeacutetat donneacute

Tableau 8-18 Constantes de navigation drsquoun curseur

Constante Explication

ResultSetTYPE_FORWARD_ONLY Le parcours du curseur srsquoopegravere invariablement du deacutebut agrave la fin (non navigable)

ResultSetTYPE_SCROLL_INSENSITIVE Le curseur est navigable mais pas sensible aux modifica-tions

ResultSetTYPE_SCROLL_SENSITIVE Le curseur est navigable et sensible aux modifications

4055_08_C08 Page 303 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

304 copy Eacuteditions Eyrolles

ConnectorJ de MySQL ne permet pas encore de changer le sens de parcours drsquoun curseur auniveau de lrsquoeacutetat et au niveau du curseur lui-mecircme (seule la constante ResultSetFETCH_FORWARD est interpreacuteteacutee) Aucune erreur nrsquoa lieu agrave lrsquoexeacutecution si vous modifiez le sens de par-cours drsquoun curseur la direction restera simplement inchangeacutee (en avant toute )

Ainsi pour parcourir un curseur agrave lrsquoenvers il faudra soit utiliser des indices neacutegatifs (dans lesmeacutethodes absolute et relative) soit employer la meacutethode previous en partant de lafin du curseur (afterLast)

Tableau 8-19 Meacutethodes de navigation dans un curseur

Meacutethode Fonction

void setFetchDirection(int) Affecte la direction du parcours ResultSetFETCH_FORWARD (1000)ResultSetFETCH_REVERSE (1001) ouResultSetFETCH_UNKNOWN (1002)

int getFetchDirection() Extrait la direction courante (une des trois valeurs ci-dessus)

boolean isBeforeFirst() Indique si le curseur est positionneacute avant le premier enregistre-ment (false si aucun enregistrement nrsquoexiste)

void beforeFirst() Positionne le curseur avant le premier enregistrement (aucuneffet si le curseur est vide)

boolean isFirst() Indique si le curseur est positionneacute sur le premier enregistrement(false si aucun enregistrement nrsquoexiste)

boolean isLast() Indique si le curseur est positionneacute sur le dernier enregistrement(false si aucun enregistrement nrsquoexiste)

boolean isAfterLast() Indique si le curseur est positionneacute apregraves le dernier enregistre-ment (false si aucun enregistrement nrsquoexiste)

void afterLast() Positionne le curseur apregraves le dernier enregistrement (aucun effetsi le curseur est vide)

boolean first() Positionne le curseur sur le premier enregistrement (false siaucun enregistrement nrsquoexiste)

boolean previous() Positionne le curseur sur lrsquoenregistrement preacuteceacutedent (false siaucun enregistrement ne preacutecegravede)

boolean last() Positionne le curseur sur le dernier enregistrement (false siaucun enregistrement nrsquoexiste)

boolean absolute(int) Positionne le curseur sur le n-iegraveme enregistrement (en partant dudeacutebut si n est positif ou de la fin si n est neacutegatif false si aucunenregistrement nrsquoexiste agrave cet indice)

boolean relative(int) Positionne le curseur sur le n-iegraveme enregistrement en partant dela position courante (en avant si n est positif ou en arriegravere si n estneacutegatif false si aucun enregistrement nrsquoexiste agrave cet indice)

4055_08_C08 Page 304 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 305

chapitre ndeg 8 Utilisation avec Java

Parcours

Le code suivant (SELECTnavigablejava) preacutesente une utilisation du curseur navigablecurseurNaviJava Le deuxiegraveme test renvoie false car apregraves lrsquoouverture le curseurnrsquoest pas positionneacute sur le premier enregistrement et la meacutethode next le place selon le sensdu parcours du curseur

Creacuteez des curseurs non navigables quand vous voulez rapatrier de tregraves gros volumes de don-neacutees (taille du cache limitative cocircteacute client) Fragmentez vos requecirctes quand vous voulez mani-puler des curseurs navigables Les prochaines versions de MySQL et ConnectorJ devraientprendre en charge une gestion cocircteacute serveur des curseurs navigables

Tableau 8-20 Parcours drsquoun curseur navigable

Code Java Commentaires

try hellipStatement etatSimple =createStatement Creacuteation de

lrsquoeacutetat

ResultSet curseurNaviJava = etatSimpleexecuteQuery(SELECT immattypeAvioncap FROM Avion)

Creacuteation et chargement du curseur

if ( ) Systemoutprintln(Curseur positionneacute au deacutebut)

Test renvoyant true

if ( curseurNaviJavaisFirst() ) Systemoutprintln(Curseur positionneacute sur le 1er deacutejagrave)

Test renvoyant false

while( ) if ( ) Systemoutprintln(1er avion ) if ( ) Systemoutprintln(Dernier avion ) Systemoutprint(Immat +curseurNaviJavagetString(1)) Systemoutprintln( type +curseurNaviJavagetString(2))

Parcours du curseur en affi-chant les pre-mier et dernier enregistre-ments

if ( )Systemoutprintln(Curseur positionneacute apregraves la fin)

Test renvoyant true

if ( ) if ( ) Systemoutprinln(Avant dernier avion + curseurNaviJavagetString(1))

Affiche lrsquoavant-dernier enregis-trement

if ( ) Systemoutprintln(First avion + curseurNaviJavagetString(1))

Affiche le pre-mier enregistre-ment

if ( ) Systemoutprintln(Last avion + curseurNaviJavagetString(1))

Affiche le der-nier enregistre-ment

curseurNaviJavaclose() Ferme le cur-seur

catch(SQLException ex) hellip Gestion des erreurs

Web

(ResultSetTYPE_SCROLL_INSENSITIVEResultSetCONCUR_READ_ONLY)

curseurNaviJavaisBeforeFirst()

curseurNaviJavanext()curseurNaviJavaisFirst()

curseurNaviJavaisLast()

curseurNaviJavaisAfterLast()

curseurNaviJavaprevious()curseurNaviJavaprevious()

curseurNaviJavafirst()

curseurNaviJavalast()

4055_08_C08 Page 305 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

306 copy Eacuteditions Eyrolles

Positionnements

Des meacutethodes assurent lrsquoaccegraves direct agrave un curseur navigable Notez que absolute(1) eacutequi-vaut agrave first() de mecircme absolute(-1) eacutequivaut agrave last() Concernant la meacutethoderelative il faut lrsquoutiliser dans un test pour srsquoassurer qursquoelle srsquoapplique agrave un enregistrementexistant (voir lrsquoexemple suivant) Drsquoautre part lrsquoutilisation de relative(0) nrsquoa aucun effetConsideacuterons la table suivante qui est interrogeacutee au niveau des trois premiegraveres colonnes par lecurseur navigable curseurPosJava

Le code suivant (SELECTPositionsjava) preacutesente les meacutethodes qui permettent drsquoacceacutederdirectement agrave des enregistrements de ce curseur

Figure 8-5 Curseur navigable

Avion

immat typeAvion cap comp

F-FGFB Concorde 95 AF F-GKUB A330 240 AERIF-GLFS A320 140 TAT

F-GLKT A340 300 AERI F-GLZV A330 250 AERI F-WTSS Concorde 90 AF

curseurPosJava

absolute(1)

relative (2)

absolute(-1)

Tableau 8-21 Positionnements dans un curseur navigable

Code Java Commentaires

try hellipStatement etatSimple =createStatement

Creacuteation de lrsquoeacutetat avec cur-seurs insensibles et non modi-fiables

ResultSet curseurPosJava = etatSimpleexecuteQuery(SELECT immattypeAvioncap FROM Avion)

Creacuteation et chargement du cur-seur

Curseur sur le premier avion if ( ) Systemoutprintln(relative(2) + curseurPosJavagetString(1)) else Systemoutprintln(Pas de 3egraveme avion)

Accegraves au troisiegraveme avion

if ( ) Systemoutprintln(relative(-2) + curseurPosJavagetString(1)) else Systemoutprintln(Pas retour -2 possible )

Retour au premier avion

Web

(ResultSetTYPE_SCROLL_INSENSITIVEResultSetCONCUR_READ_ONLY)

curseurPosJavaabsolute(1)curseurPosJavarelative(2)

curseurPosJavarelative(-2)

4055_08_C08 Page 306 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 307

chapitre ndeg 8 Utilisation avec Java

Pour deacutefinir un curseur navigable

bull Une requecircte ne doit pas contenir de jointure

bull Eacutecrivez laquo SELECT a FROM table ahellip raquo agrave la place de laquo SELECT FROM tablehellipraquo

Curseurs modifiables

Un curseur modifiable permet de mettre agrave jour la base de donneacutees transformation de colon-nes suppressions et insertions drsquoenregistrements Les valeurs permises du deuxiegraveme paramegrave-tre (modifCurseur) de la meacutethode createStatement deacutefinie agrave la section preacuteceacutedentesont preacutesenteacutees dans le tableau suivant

Le caractegravere modifiable drsquoun curseur est indeacutependant de sa navigabiliteacute Neacuteanmoins il estcourant qursquoun curseur modifiable soit eacutegalement navigable (pour pouvoir se positionner agrave lademande sur un enregistrement avant drsquoeffectuer sa mise agrave jour)

Pour speacutecifier un curseur de nature CONCUR_UPDATABLE

bull Une requecircte ne doit pas contenir de jointure ni de regroupement elle doit seulement extrairedes colonnes (les fonctions monolignes et multilignes sont interdites)

bull Eacutecrivez laquo SELECT a FROM table ahellip raquo agrave la place de laquo SELECT FROM tablehellip raquo

if ( Systemoutprintln(absolute(-2) + curseurPosJavagetString(1)) else Systemoutprintln(Pas davant dernier avion)

Accegraves agrave lrsquoavant-dernier enre-gistrement

while( ) hellip

Parcours du curseur en sensinverse

curseurPosJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

Tableau 8-21 Positionnements dans un curseur navigable (suite)

Code Java Commentaires

curseurPosJavaabsolute(-2)

curseurPosJavaafterLast()curseurPosJavaprevious()

Tableau 8-22 Constantes de modification drsquoun curseur

Constante Explication

ResultSetCONCUR_READ_ONLY Le curseur ne peut ecirctre modifieacute

ResultSetCONCUR_UPDATABLE Le curseur peut ecirctre modifieacute

4055_08_C08 Page 307 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

308 copy Eacuteditions Eyrolles

Il est aussi possible de deacutefinir un curseur par une requecircte de type SELECThellip FOR UPDATELes principales meacutethodes relatives aux curseurs modifiables sont les suivantes

Les opeacuterations de modification et drsquoinsertion (UPDATE et INSERT) agrave travers un curseur se reacutealisenten deux temps mise agrave jour du curseur puis propagation agrave la table de la base de donneacutees Il suffitainsi de ne pas exeacutecuter la deuxiegraveme eacutetape pour ne pas opeacuterer la mise agrave jour de la base

La suppression drsquoenregistrements (DELETE) agrave travers un curseur srsquoopegravere en une seule instruc-tion qui nrsquoest pas forceacutement valideacutee par la suite il faudra programmer explicitement le commitou laisser le paramegravetre drsquoautocommit agrave true (par deacutefaut)

La figure suivante illustre les modifications effectueacutees sur la table Avion par lrsquointermeacutediairedu curseur CurseurModifJava utiliseacute par les trois programmes Java suivants

Tableau 8-23 Meacutethodes de navigation dans un curseur

Meacutethode Fonction

int getResultSetType() Renvoie le caractegravere navigable des curseurs drsquoun eacutetat donneacute (ResultSetTYPE_FORWARD_ONLYhellip)

int getResultSetConcurrency() Renvoie le caractegravere modifiable des curseurs drsquoun eacutetat donneacute (ResultSetCONCUR_READ_ONLY ouResultSetCONCUR_UPDATABLE)

int getType() Renvoie le caractegravere navigable drsquoun curseur donneacute

int getConcurrency() Renvoie le caractegravere modifiable drsquoun curseur donneacute

void deleteRow() Supprime lrsquoenregistrement courant

void updateRow() Modifie la table avec lrsquoenregistrement courant

void cancelRowUpdates() Annule les modifications faites sur lrsquoenregistrement courant

void moveToInsertRow() Deacuteplace le curseur vers un nouvel enregistrement

void insertRow() Insegravere dans la table lrsquoenregistrement courant

void moveToCurrentRow() Retour vers lrsquoenregistrement courant (agrave utiliser eacuteventuellement apregraves moveToInsertRow)

Figure 8-6 Mises agrave jour drsquoun curseur

Avion

immat typeAvion cap comp

F-FGFB Concorde 95 AF F-GKUB A330rarrA380 240rarr350 AERI F-GLFS A320 140 TAT F-GLKT A340 300 AERI F-GLZV A330 250 AERI F-WTSS Concorde 90 AF F-LUTE TB20 4 NULL

curseurModifJavainsertRow()

deleteRow()

updateRow()

4055_08_C08 Page 308 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 309

chapitre ndeg 8 Utilisation avec Java

Suppressions

Le code suivant (ResultDELETEjava) supprime le troisiegraveme enregistrement du curseur etreacutepercute la mise agrave jour au niveau de la table Avion du scheacutema connecteacute Nous deacuteclarons icice curseur laquo navigable raquo

Le code suivant (ResultDELETE2java) supprime le mecircme enregistrement en supposantson indice a priori inconnu Nous deacuteclarons ici ce curseur laquo non navigable raquo Notez lrsquoutilisa-tion de la meacutethode equals pour comparer deux chaicircnes de caractegraveres

Tableau 8-24 Suppression drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

if ( ) cxcommit() else Systemoutprintln(Pas de 3egraveme avion)

Accegraves direct au troi-siegraveme avion suppres-sion de lrsquoenregistre-ment

curseurModifJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_SCROLL_INSENSITIVEResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

curseurModifJavaabsolute(3)curseurModifJavadeleteRow()

Tableau 8-25 Suppression drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la valida-tion automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

while(curseurModifJavanext()) if (curseurModifJavagetString(1)equals(p_immat))

Accegraves agrave lrsquoenregistrementet suppression

curseurModifJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_FORWARD_ONLYResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

String p_immat = F-GLFS

curseurModifJavadeleteRow()

4055_08_C08 Page 309 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

310 copy Eacuteditions Eyrolles

Modifications

La modification de colonnes drsquoun enregistrement au niveau de la base de donneacutees srsquoopegravere endeux eacutetapes mise agrave jour du curseur par les meacutethodes updatexxx (updater methods) puispropagation des mises agrave jour dans la table par la meacutethode updateRow()

Les meacutethodes updatexxx ont chacune deux signatures Par exemple la meacutethode de modifi-cation drsquoune chaicircne de caractegraveres (valable pour les colonnes CHAR et VARCHAR) est disponibleen raisonnant en fonction soit de la position soit du nom de la colonne du curseur

void updateString(int positionColonne String chaicircne)

void updateString(String nomColonne String chaicircne)

Le code suivant (ResultUPDATEjava) change au niveau de la table Avion deux colonnesdu deuxiegraveme enregistrement du curseur Nous deacuteclarons ici ce curseur laquo sensible raquo pourpouvoir eacuteventuellement visualiser la transformation reacutealiseacutee dans le mecircme programme

Insertions

Lrsquoinsertion drsquoun enregistrement au niveau de la base de donneacutees srsquoopegravere en trois eacutetapes preacuteparation agrave lrsquoinsertion dans le curseur par la meacutethode moveToInsertRow mise agrave jour ducurseur par les meacutethodes updatexxx puis propagation des actualisations dans la table par lameacutethode insertRow Lrsquoeacuteventuel retour agrave lrsquoenregistrement courant se programme agrave lrsquoaide dela meacutethode moveToCurrentRow

Le code suivant (ResultINSERTjava) insegravere un nouvel enregistrement au niveau de latable Avion La quatriegraveme colonne de la table nrsquoest pas indiqueacutee dans le curseur elle est

Tableau 8-26 Modifications drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

if (curseurModifJavaabsolute(2))

cxcommit() else Systemoutprintln(Pas de 2egraveme avion)

Accegraves agrave lrsquoenregistrementPremiegravere eacutetape

Deuxiegraveme eacutetape

Validation

curseurModifJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_SCROLL_SENSITIVEResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

curseurModifJavaupdateString(2A380)curseurModifJavaupdateInt(3350)

curseurModifJavaupdateRow()

4055_08_C08 Page 310 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 311

chapitre ndeg 8 Utilisation avec Java

donc passeacutee agrave NULL au niveau de la table en lrsquoabsence de valeur par deacutefaut deacutefinie dans lacolonne

Gestion des seacutequences

Avant la version 30 de lrsquoAPI JDBC de Sun il nrsquoy avait pas de possibiliteacute laquo standard raquodrsquoextraire la valeur courante drsquoune seacutequence (colonne AUTO_INCREMENT) Avec des ancienspilotes JDBC pour MySQL il eacutetait possible drsquoutiliser une meacutethode speacutecifique de lrsquointerfaceStatement ou drsquoexeacutecuter une requecircte du type SELECT LAST_INSERT_ID() apregraves avoirinseacutereacute un enregistrement Le premier meacutecanisme nrsquoassure pas la portabiliteacute le second nrsquoestpas efficace puisqursquoil oblige agrave inseacuterer une ligne au preacutealable (qursquoon peut toutefois annuleravec un rollback)

Agrave preacutesent JDBC 30 offre deux nouveaux meacutecanismes afin drsquoextraire la valeur courante drsquouneseacutequence AUTO_INCREMENT la meacutethode getGeneratedKeys() ou lrsquoexploitation drsquouncurseur modifiable via la meacutethode insertRow()

Dans tous les cas il nrsquoest pas neacutecessaire drsquoinseacuterer reacuteellement un nouvel enregistrement (annu-lation possible par rollback) En revanche lrsquoexeacutecution de lrsquoajout (par INSERT) est obligatoirepour que MySQL eacutevalue une nouvelle valeur de la seacutequence Cette action est irreacuteversible dansle sens ougrave la seacutequence sera increacutementeacutee qursquoon valide ou non lrsquoajout de lrsquoenregistrement

Tableau 8-27 Insertion drsquoun enregistrement

Code Java Commentaires

try hellip )

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

ResultSet curseurModifJava = etatSimpleexecuteQuery (SELECT immattypeAvioncap FROM Avion)

Creacuteation du curseur

cxcommit()

Premiegravere eacutetape

Deuxiegraveme eacutetape

Troisiegraveme eacutetape curseurModifJavaclose() Validation

Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

WebStatement etatSimple =

cxcreateStatement(ResultSetTYPE_SCROLL_SENSITIVEResultSetCONCUR_UPDATABLE

cxsetAutoCommit(false)

curseurModifJavamoveToInsertRow()

curseurModifJavaupdateString(1F-LUTE)curseurModifJavaupdateString(2TB20)curseurModifJavaupdateInt(34)

curseurModifJavainsertRow()

4055_08_C08 Page 311 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

312 copy Eacuteditions Eyrolles

Meacutethode getGeneratedKeysLe code suivant (Sequence1java) insegravere un nouvel enregistrement dans la table Affre-ter (deacutecrite au chapitre 2 section Seacutequences) et reacutecupegravere la valeur courante de la seacutequence agravelrsquoaide de la meacutethode getGeneratedKeys()

Curseur modifiable

Le code suivant (Sequence2java) insegravere un nouvel enregistrement dans la table Affre-ter par un curseur modifiable et reacutecupegravere la valeur courante de la seacutequence agrave lrsquoaide de lameacutethode getInt() appliqueacutee agrave la colonne AUTO_INCREMENT

Tableau 8-28 Reacutecupeacuteration drsquoune seacutequence agrave lrsquoaide drsquoun eacutetat

Code Java Commentaires

try hellip Statement etat = cxcreateStatement (javasqlResultSetTYPE_FORWARD_ONLY javasqlResultSetCONCUR_UPDATABLE) cxsetAutoCommit(false)

Creacuteation de lrsquoeacutetat etdeacutesactivation de la vali-dation automatique

if (curseurnext()) Systemoutprintln(Valeur de la sequence + curseurgetInt(1)) else Systemoutprintln(Pb sequence ) cxrollback()

Insertion avec lrsquooption dereacutecupeacuteration de cleacute geacuteneacute-reacutee

Extraction de la seacutequence

curseurclose() etatclose() cxclose() Invalidation de lrsquoajoutFermeture des objets

catch(SQLException ex) hellip Gestion des erreurs

Web

etatexecute(INSERT INTO bdsoutouAffreter(compimmatdateAffnbPax)VALUES(AFA1NOW()100)StatementRETURN_GENERATED_KEYS)

ResultSet curseur = etatgetGeneratedKeys()

Tableau 8-29 Reacutecupeacuteration drsquoune seacutequence agrave lrsquoaide drsquoun curseur modifiable

Code Java Commentaires

try hellip Statement etat = cxcreateStatement (javasqlResultSetTYPE_FORWARD_ONLY javasqlResultSetCONCUR_UPDATABLE) cxsetAutoCommit(false)

Creacuteation de lrsquoeacutetat et deacutesac-tivation de la validationautomatique

Web

4055_08_C08 Page 312 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 313

chapitre ndeg 8 Utilisation avec Java

Interface ResultSetMetaData

Lrsquointerface ResultSetMetaData est utile pour retrouver dynamiquement des proprieacuteteacutes destables qui sont manipuleacutees par des curseurs ResultSet Cette interface est inteacuteressante pourprogrammer dynamiquement des requecirctes ou drsquoautres instructions SQL Ces fonctions vontextraire de maniegravere transparente des informations par lrsquointermeacutediaire du dictionnaire des donneacutees

Une fois un curseur ResultSet programmeacute il suffit de lui appliquer la meacutethode getMeta-Data() pour disposer drsquoun objet ResultSetMetaData Le tableau suivant preacutesente lesprincipales meacutethodes disponibles de lrsquointerface ResultSetMetaData

ResultSet curseur = etatexecuteQuery( ) curseurmoveToInsertRow() curseurinsertRow() curseurlast() Systemoutprintln(Valeur de la sequence + ) cxrollback()

Insertion via le curseur

Extraction de la seacutequence

curseurclose() etatclose() cxclose() Invalidation de lrsquoajoutFermeture des objets

catch(SQLException ex) hellip Gestion des erreurs

Tableau 8-29 Reacutecupeacuteration drsquoune seacutequence agrave lrsquoaide drsquoun curseur modifiable (suite)

Code Java Commentaires

SELECTnumAffimmatcompdateAff FROM bdsoutouAffreter

curseurgetInt(1)

Tableau 8-30 Meacutethodes principales de lrsquointerface ResultSetMetaData

Meacutethode Description

int getColumnCount() Retourne le nombre de colonnes du curseur

String getColumnName(int) Retourne le nom de la colonne drsquoun indice donneacute du curseur

int getColumnType(int) Retourne le code du type (selon la classification dejavasqlTypes) de la colonne drsquoun indice donneacute du curseur

String getColumnTypeName(int) Retourne le nom du type SQL de la colonne drsquoun indice donneacutedu curseur

int isNullable(int) Indique si la colonne drsquoun indice donneacute du curseur peut ecirctrenulle (constantes retourneacutees ResultSetMetaDatacolumnNoNullsResultSetMetaDatacolumnNullable ouResultSetMetaDatacolumnNullableUnknown)

int getPrecision(int) Nombre de chiffres avant la virgule de la colonne deacutesigneacutee

int getScale(int) Nombre de deacutecimales de la colonne deacutesigneacutee

String getSchemaName(int) Nom du scheacutema proprieacutetaire de la colonne

String getTableName(int) Nom de la table de la colonne

4055_08_C08 Page 313 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

314 copy Eacuteditions Eyrolles

Comme nous lrsquoavons vu au chapitre 5 MySQL ne renseigne pas encore le nom de catalogueAinsi la meacutethode getSchemaName() nrsquoest pas encore reconnue

Le code suivant (ResulSetMetajava) utilise des meacutethodes de lrsquointerface ResultSet-MetaData sur la base de la requecircte extrayant trois colonnes dans la table Avion

Interface DatabaseMetaDataLrsquointerface DatabaseMetaData est utile pour connaicirctre des aspects plus geacuteneacuteraux de labase de donneacutees cible (version eacutediteur prise en charge des transactionshellip) ou des informa-tions sur la structure de la base (structures des tables et vues preacuterogatives)

Plus de quarante meacutethodes sont proposeacutees par lrsquointerface DatabaseMetaData Le tableausuivant en preacutesente quelques-unes Consultez la documentation du JDK pour en savoir plus

Tableau 8-31 Extraction de meacuteta-informations au niveau drsquoun curseur

Code Java Commentaires

try hellip ResultSet curseurJava=etatSimpleexecuteQuery (SELECT immat typeAvion cap FROM Avion)

Creacuteation du curseur

ResultSetMetaData rsmd =

Creacuteation drsquoun objetResultSetMetaData

int nbCol = rsmdgetColumnCount() nbCol contient 3 String nom2emeCol = rsmdgetColumnName(2) nom2emeCol contient typeAvion String type2emeCol = rsmdgetColumnTypeName(2) type2emeCol contient VARCHAR int codeType2emeCol = rsmdgetColumnType(2) codeType2emeCol contient 12

(code pour VARCHAR) if (rsmdisNullable(1) == ResultSetMetaDatacolumnNoNulls) hellip

Test renvoyant vrai (la premiegravere colonne est la cleacute primaire)

int p1 = rsmdgetPrecision(3) Taille de la colonne cap (renvoie 6 pour un SMALLINT)

int t1 = rsmdgetScale(3) Deacutecimales de la colonne cap (renvoie 0 pour un SMALLINT)

curseurJavaclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

Web

curseurJavagetMetaData()

Tableau 8-32 Meacutethodes principales de lrsquointerface ResultSetMetaData

Meacutethode Description

ResultSet getColumns(StringString String String)

Description de toutes les colonnes drsquoune table drsquounscheacutema donneacute

String getDatabaseProductName() Nom de lrsquoeacutediteur de la base de donneacutees utiliseacutee

String getDatabaseProductVersion() Numeacutero de la version de la base utiliseacutee

4055_08_C08 Page 314 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 315

chapitre ndeg 8 Utilisation avec Java

Le code suivant (MetaDatajava) emploie ces meacutethodes pour extraire des informations agravepropos de la base cible et des objets (tables vues seacutequenceshellip) du scheacutema courant

La trace de ce programme est la suivante (dans notre jeu drsquoexemples)

Objets du schema soutoulocalhost

Nom de lobjet Avion Type TABLE

Nom de lobjet Compagnie Type TABLE

Nom base MySQL

Version base 5015-nt

Supporte les SelectForUpdate

Supporte les Transactions

ResultSet getTables(String String String String[])

Description des tables drsquoun scheacutema donneacute

String getUserName() Nom de lrsquoutilisateur connecteacute (scheacutema courant)

boolean supportsSavepoints() Renvoie true si la base reconnaicirct les points de validation

boolean supportsTransactions() Renvoie true si la base reconnaicirct les transactions

Tableau 8-32 Meacutethodes principales de lrsquointerface ResultSetMetaData (suite)

Meacutethode Description

Tableau 8-33 Extraction de meacuteta-informations au niveau drsquoun scheacutema

Code Java Commentaires

try hellip DatabaseMetaData infoBase = cxgetMetaData() Creacuteation drsquoun objet

DatabaseMetaData ResultSet toutesLesTables =

Systemoutprintln(Objets du schema + )

Creacuteation drsquoun objetResultSet contenant lescaracteacuteristiques du scheacutemacourant

while (toutesLesTablesnext()) Systemoutprint(Nom de lobjet + toutesLesTablesgetString(3)) Systemoutprintln( Type + toutesLesTablesgetString(4))

Parcours du curseur en affi-chant quelques caracteacuteristi-ques

Systemoutprintln(Nom base + ())

Affichage du nom de la base

Systemoutprintln(Version base + ())

Affichage de la version de labase

if ( ()) Systemoutprintln(Supporte les Transactions)

Transactions prises en chargeou pas

toutesLesTablesclose() Fermeture du curseur catch(SQLException ex) hellip Gestion des erreurs

Web

infoBasegetTables(infoBasegetUserName() null null)

infoBasegetUserName()

infoBasegetDatabaseProductName

infoBasegetDatabaseProductVersioninfoBasesupportsTransactions

4055_08_C08 Page 315 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

316 copy Eacuteditions Eyrolles

Instructions parameacutetreacutees (PreparedStatement)

Lrsquointerface PreparedStatement heacuterite de lrsquointerface Statement et la speacutecialise enpermettant de parameacutetrer des objets (eacutetats preacutepareacutes) repreacutesentant des instructions SQLpreacutecompileacutees Ces eacutetats sont creacuteeacutes par la meacutethode prepareStatement de lrsquointerfaceConnection deacutecrite ci-apregraves La chaicircne de caractegraveres contient lrsquoordre SQL dont les paramegrave-tres srsquoil en possegravede doivent ecirctre indiqueacutes par le symbole laquo raquo

PreparedStatement prepareStatement(String)

Une fois creacuteeacutes ces objets peuvent ecirctre aiseacutement reacuteutiliseacutes pour exeacutecuter agrave la demandelrsquoinstruction SQL en modifiant eacuteventuellement les valeurs des paramegravetres drsquoentreacutee agrave lrsquoaidedes meacutethodes setxxx (setter methods) Le tableau suivant deacutecrit les principales meacutethodes delrsquointerface preparedStatement

Deacutecrivons agrave preacutesent un exemple drsquoappel pour chaque meacutethode de compilation drsquoun ordre para-meacutetreacute On suppose la connexion cx creacuteeacutee

Extraction de donneacutees (executeQuery)

Le code suivant (PrepareSELECTjava) illustre lrsquoutilisation de la meacutethode execute-Query pour extraire les enregistrements de la table Avion

Tableau 8-34 Meacutethodes de lrsquointerface PreparedStatement

Meacutethode Description

ResultSet executeQuery() Exeacutecute la requecircte et retourne un curseur ni navigable nimodifiable par deacutefaut

int executeUpdate() Exeacutecute une instruction LMD (INSERT UPDATE ou DELETE) etretourne le nombre de lignes traiteacutees ou 0 pour les instructionsSQL ne retournant aucun reacutesultat (LDD)

boolean execute() Exeacutecute une instruction SQL et renvoie true si crsquoest une instruc-tion SELECT false sinon

void setNull(int int) Affecte la valeur NULL au paramegravetre de numeacutero et de type (classi-fication javasqlTypes) speacutecifieacutes

void close() Ferme lrsquoeacutetat

4055_08_C08 Page 316 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 317

chapitre ndeg 8 Utilisation avec Java

Mises agrave jour (executeUpdate)

Le code suivant (PrepareINSERTjava) illustre lrsquoutilisation de la meacutethode execute-Update pour inseacuterer lrsquoenregistrement (F-NEW A319 178 AF) dans la table Avion compo-seacutee de quatre colonnes de types CHAR(6) VARCHAR(15) SMALLINT et VARCHAR(4)

Instruction LDD (execute)

Le code suivant (PrepareDELETEjava) illustre lrsquoutilisation de la meacutethode execute poursupprimer un avion dont lrsquoimmatriculation passe en paramegravetre

Tableau 8-35 Extraction de donneacutees par un ordre preacutepareacute

Code Java Commentaires

try hellip String ordreSQL = SELECT immat typeAvion cap FROM Avion

Creacuteation drsquoun eacutetat preacutepareacute

ResultSet curseurJava =

while(curseurJavanext()) hellip

Creacuteation du curseur reacutesultant dela compilation de lrsquoeacutetatParcours du curseur

curseurJavaclose() Fermeture du curseur Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

Web

PreparedStatement eacutetatPreacutepareacute =cxprepareStatement(ordreSQL)

eacutetatPreacutepareacuteexecuteQuery()

eacutetatPreacutepareacuteclose()

Tableau 8-36 Insertion drsquoun enregistrement par un ordre preacutepareacute

Code Java Commentaires

try hellip String ordreSQL = INSERT INTO Avion VALUES ( )

Creacuteation drsquoun eacutetat preacutepareacute

Passage des paramegravetres

Systemoutprintln( + avion inseacutereacute)

Exeacutecution de lrsquoinstruction

Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

Web

PreparedStatement eacutetatPreacutepareacute =cxprepareStatement(ordreSQL)

eacutetatPreacutepareacutesetString(1 F-NEW)eacutetatPreacutepareacutesetString(2 A319)eacutetatPreacutepareacutesetInt(3 178)eacutetatPreacutepareacutesetString(4 AF)

eacutetatPreacutepareacuteexecuteUpdate()

eacutetatPreacutepareacuteclose()

4055_08_C08 Page 317 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

318 copy Eacuteditions Eyrolles

Il nrsquoest pas possible de parameacutetrer des instructions SQL du LDD (CREATE ALTERhellip) Pourreacutesoudre ce problegraveme il faut construire dynamiquement la chaicircne (String) qui contient lrsquoins-truction agrave lrsquoaide de lrsquoopeacuterateur de concateacutenation Java (+) Cette chaicircne sera ensuite lrsquouniqueparamegravetre de la meacutethode prepareStatement

Proceacutedures catalogueacutees

Lrsquointerface CallableStatement permet drsquoappeler des sous-programmes (fonctions ouproceacutedures catalogueacutees) en passant drsquoeacuteventuels paramegravetres en entreacutee et en en reacutecupeacuterant ensortie Lrsquointerface CallableStatement speacutecialise lrsquointerface PreparedStatement Lesparamegravetres drsquoentreacutee sont affecteacutes par les meacutethodes setxxx Les paramegravetres de sortie (deacutefinisOUT au niveau du sous-programme) sont extraits agrave lrsquoaide des meacutethodes getxxx Ces eacutetats quipermettent drsquoappeler des sous-programmes sont creacuteeacutes par la meacutethode prepareCall delrsquointerface Connection deacutecrite ci-apregraves

CallableStatement prepareCall(String)

Le tableau suivant deacutecompose le paramegravetre de cette meacutethode (deux eacutecritures sont possibles)Chaque paramegravetre est indiqueacute par un symbole laquo raquo

Tableau 8-37 Insertion drsquoun enregistrement par un ordre preacutepareacute

Code Java Commentairestry hellip cxsetAutoCommit(false) String ordreSQL = DELETE FROM Avion WHERE immat = Creacuteation drsquoun eacutetat preacutepareacute Passage du paramegravetreif ( ) Systemoutprintln(Enregistrement sup-primeacute) cxcommit()

Exeacutecution de lrsquoinstruction

Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

Web

PreparedStatement eacutetatPreacutepareacute =cxprepareStatement(ordreSQL)

eacutetatPreacutepareacutesetString(1 F-NEW )eacutetatPreacutepareacuteexecute()

eacutetatPreacutepareacuteclose()

Tableau 8-38 Paramegravetre de prepareCall

Type du sous-programme Paramegravetre

Fonction = call nomFonction( [ ] )

Proceacutedure call nomProceacutedure( [ ] )

4055_08_C08 Page 318 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 319

chapitre ndeg 8 Utilisation avec Java

Une fois lrsquoeacutetat creacuteeacute il faut reacutepertorier le type des paramegravetres de sortie (meacutethode register-OutParameter) passer les valeurs des paramegravetres drsquoentreacutee appeler le sous-programme etanalyser les reacutesultats Le tableau suivant deacutecrit les principales meacutethodes de lrsquointerfaceCallableStatement

Exemple

Le programme JDBC suivant (CallableProcedurejava) deacutecrit lrsquoappel de la proceacutedureleNomCompagnieEst (ayant deux paramegravetres) Le premier indique lrsquoavion de la compagnierechercheacute le second contient le reacutesultat (nom de la compagnie)

CREATE PROCEDURE bdsoutouleNomCompagnieEst

BEGIN

DECLARE flagNOTFOUND BOOLEAN DEFAULT 0

BEGIN

DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND =1

SELECT nomComp INTO p_nomcomp FROM Compagnie

WHERE comp = (SELECT compa FROM Avion WHERE immat = p_immat)

END

IF flagNOTFOUND THEN

SET p_nomcomp = NULL

END IF

END

Le tableau suivant deacutecrit les eacutetapes neacutecessaires agrave lrsquoappel de cette proceacutedure (qui ne gegravere pas leseacuteventuelles erreurs) pour lrsquoavion drsquoimmatriculation F-GLFS

Tableau 8-39 Meacutethodes de lrsquointerface CallableStatement

Meacutethode Description

ResultSet executeQuery() Idem PreparedStatement

int executeUpdate() Idem PreparedStatement

boolean execute() Idem PreparedStatement

void registerOutParameter(int int)

Transfegravere un paramegravetre de sortie agrave un indice donneacute drsquountype Java (classification javasqlTypes)

boolean wasNull() Deacutetermine si le dernier paramegravetre de sortie extrait est agraveNULL Cette meacutethode doit ecirctre seulement invoqueacuteeapregraves une meacutethode de type getxxx

(IN p_immat CHAR(6)OUT p_nomcomp VARCHAR(25))

4055_08_C08 Page 319 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

320 copy Eacuteditions Eyrolles

La trace de lrsquoappel de cette proceacutedure est la suivante

Compagnie de F-GLFS Transport Air Tour

Pensez sous root agrave donner les privilegraveges neacutecessaires agrave lrsquoutilisateur qui va lancer le sous-pro-gramme via Java (pour mon test jrsquoai ducirc lancer GRANT EXECUTE ON bdsoutou TO sou-toulocalhost et GRANT SELECT ON mysqlproc TO soutoulocalhost) Sivous ne le faites pas JDBC vous rappellera clairement agrave lrsquoordre

Transactions

JDBC supporte le mode transactionnel qui consiste agrave valider tout ou une partie drsquoun ensembledrsquoinstructions Nous avons deacutejagrave deacutecrit agrave la section Interface Connection les meacutethodes quipermettent agrave un programme Java de coder des transactions (setAutoCommit commit etrollback)

Par deacutefaut chaque instruction SQL est valideacutee (on parle drsquoautocommit) Lorsque ce mode estdeacutesactiveacute il faut geacuterer manuellement les transactions avec commit ou rollback

Quand le mode autocommit est deacutesactiveacute

bull La deacuteconnexion drsquoun objet Connection (par la meacutethode close) valide implicitement latransaction (mecircme si commit nrsquoa pas eacuteteacute invoqueacute avant la deacuteconnexion)

bull Chaque instruction du LDD (CREATE ALTER DROP) valide implicitement la transaction

Tableau 8-40 Appel drsquoune proceacutedure (paramegravetre en entreacutee et sortie)

Code Java Commentaires

String CallableStatement eacutetatAppelable =

Creacuteation drsquoun eacutetat appelable

Deacuteclaration du paramegravetre de sortie

Passage du paramegravetre drsquoentreacutee Exeacutecution de la proceacutedure Systemoutprint(Compagnie de F-GLFS + Extraction du reacutesultat

Fermeture de lrsquoeacutetat catch(SQLException ex) hellip Gestion des erreurs

WebordreSQL =

call bdsoutouleNomCompagnieEst()

cxprepareCall(ordreSQL)eacutetatAppelableregisterOutParameter

(2javasqlTypesVARCHAR)eacutetatAppelablesetString(1F-GLFS)eacutetatAppelableexecute()

eacutetatAppelablegetString(2))eacutetatAppelableclose()

4055_08_C08 Page 320 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 321

chapitre ndeg 8 Utilisation avec Java

Points de validation

Depuis la version 30 de JDBC (JDK 14) on peut inclure des points de validation et affinerainsi la programmation des transactions Les interfaces Connection et Savepoint rendentpossible cette programmation

Interface Connection

Le tableau suivant preacutesente les meacutethodes de lrsquointerface Connection qui sont relatives auprincipe des points de validation

Interface Savepoint

Les points de validation sont anonymes (identifieacutes toutefois par un entier) ou nommeacutes Letableau suivant preacutesente les deux seules meacutethodes de lrsquointerface Savepoint

Le code suivant (TransactionJDBCjava) illustre une transaction deacutecoupeacutee en deuxphases par deux points de validation Dans notre exemple nous validons seulement lapremiegravere partie (seul lrsquoavion F-NEW2 sera inseacutereacute dans la table) On suppose la connexion cxcreacuteeacutee

Tableau 8-41 Meacutethodes concernant les points de validation de lrsquointerface Connection

Meacutethode Description

Savepoint setSavepoint() Positionne un point de validation anonyme et retourne unobjet Savepoint

Savepoint setSavepoint(String) Positionne un point de validation nommeacute et retourne unobjet Savepoint

void releaseSavepoint(Savepoint) Supprime le point de validation de la transaction courante

void rollback(Savepoint) Invalide la transaction agrave partir du point de validation

Tableau 8-42 Meacutethodes de lrsquointerface Savepoint

Meacutethode Description

int getSavepointId() Retourne lrsquoidentifiant du point de validation de lrsquoobjet Savepoint

String getSavepointName() Retourne le nom du point de validation de lrsquoobjet Savepoint

4055_08_C08 Page 321 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

322 copy Eacuteditions Eyrolles

Traitement des exceptions

Les exceptions qui ne sont pas traiteacutees dans les sous-programmes appeleacutes ou celles que lessous-programmes ou deacuteclencheurs peuvent retourner doivent ecirctre prises en compte au niveaudu code Java (dans un bloc tryhellip catch) Le bloc drsquoexceptions permet de programmer destraitements en fonction des codes drsquoerreur renvoyeacutes par la base Oracle Plusieurs blocsdrsquoexceptions peuvent ecirctre imbriqueacutes dans un programme JDBC

Afin de geacuterer les erreurs renvoyeacutees par le SGBD JDBC propose la classe SQLExceptionqui heacuterite de la classe Exception Chaque objet (automatiquement creacuteeacute degraves la premiegravereerreur) de cette classe dispose des meacutethodes suivantes

Tableau 8-43 Points de validation

Code Java Commentaires

try hellip cxsetAutoCommit(false) String ordreSQL = INSERT INTO Avion VALUES ( ) PreparedStatement eacutetatPreacutepareacute = cxprepareStatement(ordreSQL)

Deacutesactivation de lrsquoautocommit

Creacuteation drsquoun eacutetat appelableCreacuteation du point de validation P1

eacutetatPreacutepareacutesetString(1 F-NEW2) hellip if ( eacutetatPreacutepareacuteexecute() ) Systemoutprintln(F-NEW2 inseacutereacute)

Passage de paramegravetres et premiegravere insertion

Creacuteation du point de validation P2 eacutetatPreacutepareacutesetString(1 F-NEW3) hellip if ( eacutetatPreacutepareacuteexecute() ) Systemoutprintln(F-NEW3 inseacutereacute)

Passage de paramegravetres et deuxiegraveme insertion

Annulation de la deuxiegraveme partie cxcommit() Validation de la premiegravere partie cxclose() Fermeture de la connexion catch(SQLException ex) hellip Gestion des erreurs

Web

Savepoint p1 = cxsetSavepoint(P1)

Savepoint p2 = cxsetSavepoint(P2)

cxrollback(p2)

Tableau 8-44 Meacutethodes de la classe SQLException

Meacutethode Description

String getMessage() Message deacutecrivant lrsquoerreur

String getSQLState() Code erreur SQL Standard (XOPEN ou SQL99)

int getErrorCode() Code erreur SQL de la base

SQLException getNextException() Chaicircnage agrave lrsquoexception suivante (si une erreur renvoie plu-sieurs messages)

4055_08_C08 Page 322 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 323

chapitre ndeg 8 Utilisation avec Java

Affichage des erreurs

Le code suivant (Exceptions1java) illustre une maniegravere drsquoafficher explicitement toutesles erreurs sans effectuer drsquoautres instructions

Traitement des erreurs

Il est possible drsquoassocier des traitements agrave chaque erreur reacutepertorieacutee avant lrsquoexeacutecution duprogramme On peut appeler des meacutethodes de la classe principale ou coder directement dansle bloc des exceptions

Le code suivant (Exceptions2java) insegravere un enregistrement dans la table Avion en geacuterantun certain nombre drsquoexceptions possibles Le premier bloc des exceptions permet drsquoafficher unmessage personnaliseacute pour chaque type drsquoerreur preacutealablement reacutepertorieacute (duplication de cleacuteprimaire mauvais nombre ou type de colonneshellip) Si lrsquoavion agrave inseacuterer nrsquoest pas rattacheacute agrave unecompagnie existante (contrainte reacutefeacuterentielle) exception 1452-Cannot add or update achild row a foreign key constraint fails) Le dernier bloc drsquoexceptions afficheune erreur qui nrsquoa pas eacuteteacute preacutevue par le programmeur (erreur systegraveme ou de syntaxe danslrsquoinstruction par exemple)

Tableau 8-45 Affichage des erreurs

Code Java Commentaires

import javasqlpublic class Exceptions1 public static void main (String args []) throws SQLException Exception try ClassforName (commysqljdbcDriver)newInstance() catch (ClassNotFoundException ex) Systemoutprintln (Problegraveme au chargement+extoString()) try Connection cx = DriverManagergetConnection( cxclose()

Classe principale

Chargement du pilote

Connexion

Instructionshellip

Systemerrprintln(Erreur) while ((ex = null)) Systemerrprintln(Statut + ) Systemerrprintln(Message + ) Systemerrprintln(Code base + ) ex =

Gestion des erreurs

Web

catch(SQLException ex)

exgetSQLState()exgetMessage()exgetErrorCode()

exgetNextException()

4055_08_C08 Page 323 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

324 copy Eacuteditions Eyrolles

Tableau 8-46 Traitement des exceptions

Code Java Commentaires

try Connection cx = DriverManagergetConnection(hellip) String ordreSQL = INSERT INTO bdsoutouAvion VALUES (F-NOUVA310 5600 AF) PreparedStatement eacutetatPreacutepareacute = cxprepareStatement(ordreSQL) Systemoutprintln(eacutetatPreacutepareacuteexecuteUpdate() + avion insere en base) cxclose()

Instructions du main

catch(SQLException ex) if ( ) Systemoutprintln(Avion deacutejagrave existant)

Non unique

else if ( ) Systemoutprintln(Nom de base inconnu)

Mauvais nom de base

else if ( ) Systemoutprintln(Trop ou pas assez de valeurs)

Mauvais nombre de colon-nes

else if ( ) Systemoutprintln(Nom de table inconnue)

Mauvais nom de table

else if (( ) ampamp ( )) Systemoutprintln(Valeur trop longue ou valeur trop importante)

Mauvais type de colonnes

else if ( ) Systemoutprintln(Compagnie inconnue a inserer avec lavion)

Cleacute eacutetrangegravere absente

else Systemerrprintln(Erreur) while ((ex = null)) Systemerrprintln(Statut + exgetSQLState()) Systemerrprintln(Message + exgetMessage()) Systemerrprintln(Code Erreur base + exgetErrorCode()) ex = exgetNextException()

Gestion des autres erreurs

Web

exgetErrorCode() == 1062

exgetErrorCode() == 1044

exgetErrorCode() == 1136

exgetErrorCode() == 1146

exgetSQLState() == 01004exgetErrorCode() == 0

exgetErrorCode() == 1452

4055_08_C08 Page 324 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 325

chapitre ndeg 8 Utilisation avec Java

Exercices

Lrsquoobjectif de ces exercices est de deacutevelopper des meacutethodes de la classe Java ExoJDBC pourextraire et mettre agrave jour des donneacutees des tables du scheacutema Parc informatique

81 Curseur statique

Eacutecrire les meacutethodes

bull ArrayList getSalles() qui retourne sous la forme drsquoune liste les enregistrements de latable Salle

bull main qui se connecte agrave la base appelle la meacutethode getSalles et affiche les reacutesultats (exempledonneacute ci-dessous)

nSalle nomSalle nbPoste indIP

------------------------------------------

s01 Salle 1 3 13012080

s02 Salle 2 2 13012080

hellip

Ajoutez une nouvelle salle dans la table Salle dans lrsquointerface de commande et lancez agrave nouveau leprogramme pour veacuterifier

82 Curseur modifiable

Eacutecrivez la meacutethode void deleteSalle(int) qui supprime de la table Salle lrsquoenregistrement derang passeacute en paramegravetre Vous utiliserez la meacutethode deleteRow appliqueacutee agrave un curseur modifiableAppelez dans le main cette meacutethode pour supprimer lrsquoenregistrement de la table Salle que vousavez ajouteacute en test dans lrsquoexercice preacuteceacutedent Si lrsquoenregistrement est rattacheacute agrave un enregistrement filsne forcez pas la contrainte reacutefeacuterentielle contentez-vous drsquoafficher le message drsquoerreur 1451 renvoyeacutepar MySQL dans le bloc des exceptions

4055_08_C08 Page 325 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

326 copy Eacuteditions Eyrolles

83 Appel drsquoun sous-programme

Compiler dans votre base la proceacutedure catalogueacutee supprimeSalle(IN ns VARCHAR(7)OUTres TINYINT) qui supprime une salle dont le numeacutero est passeacute en premier paramegravetre

CREATE PROCEDURE supprimeSalle(IN ns VARCHAR(7)OUT res TINYINT)

BEGIN

DECLARE ligne VARCHAR(20)

DECLARE EXIT HANDLER FOR NOT FOUND SET res = -1

DECLARE EXIT HANDLER FOR SQLEXCEPTION SET res = -2

SELECT nomSalle INTO ligne FROM Salle WHERE nSalle = ns

DELETE FROM Salle WHERE nsalle = ns

SET res = 0

COMMIT

END

La proceacutedure retourne en second paramegravetre

bull 0 si la suppression srsquoest deacuterouleacutee correctement

bull -1 si le code de la salle est inconnu

bull -2 si la suppression est impossible (contraintes reacutefeacuterentielles)

Eacutecrire la meacutethode Java int deleteSalleSP(String) qui appelle le sous-programme suppri-meSalle Essayer les diffeacuterents cas drsquoerreurs en appelant cette meacutethode drsquoabord avec un numeacutero desalle reacutefeacuterenceacute par un poste de travail et ensuite avec un numeacutero de salle inexistant Penser agrave donneragrave lrsquoutilisateur le privilegravege en exeacutecution sur cette proceacutedure

4055_08_C08 Page 326 Jeudi 2 mars 2006 207 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

327

Chapitre 9

Utilisation avec PHP

Ce chapitre deacutetaille les moyens de faire interagir un programme PHP 5 avec une base MySQLPHP propose deux extensions (API) qui sont

mysql

et

msqli

La premiegravere convient agrave desbases MySQL de version anteacuterieure agrave 41 Nous deacutetaillerons donc lrsquoextension

mysqli

quicorrespond toutefois agrave des bases plus anciennes (jusqursquoagrave la version 322) Pour plus de deacutetailsconsultez une documentation en ligne mise agrave jour (httpwwwnexennetdocsphpanno-teerefmysqliphp)

Configuration adopteacutee

Plusieurs configurations sont possibles en fonction de la version de PHP utiliseacutee de la versiondrsquoApache et de celle de MySQL Nous avons opteacute pour faire interagir un programme PHP 5avec une base MySQL 5 sous Apache 13 Je deacutecris ici une proceacutedure minimale sans plusdrsquoexplication Vous trouverez sur le Web de nombreuses ressources agrave ce sujet

Logiciels

Reacutecupeacuterez et installez Apache (wwwapacheorg) Lancez Apacheexe srsquoil nrsquoest pas automati-quement lanceacute apregraves lrsquoinstallation Testez le service dans le navigateur en fonction du nom deserveur que vous avez speacutecifieacute agrave lrsquoinstallation (httpcamparols dans mon cas)

Installez PHP (httpwwwphpnetdownloadsphp) en deacutezippant le fichier teacuteleacutechargeacute dans unreacutepertoire personnel (CPHP dans mon cas)

Fichiers de configuration

Dans le fichier

httpdconf

(situeacute dans

CProgram FilesApache GroupApacheconfhttpdconf

dans mon cas) modifiez ou ajoutez les lignes suivantes (le laquo raquo deacutesigneun commentaire)

modif pour MySQL et PHP ici 9999 par exemple

Port 9999

hellip

4055_09_C09 Page 327 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

328

copy Eacuteditions Eyrolles

Ajout pour PHP

LoadModule php5_module cphpphp5apachedll

hellip

Ajout pour PHP

AddModule mod_php5c

SEtEnv PHPRC Cphp

AddType applicationx-httpd-php php

hellip

DirectoryIndex indexhtml indexphp

hellip

Ajout pour MySQL reacutepertoire contenant les sources php (pas

daccent dans les noms de reacutepertoire)

DocumentRoot DdevPHP-MySQL

Dans le fichier

phpini

(se trouvant dans

CWINDOWS

dans mon cas) ajoutez les lignessuivantes (le laquo raquo deacutesigne un commentaire)

Paths and Directories

extension_dir = CPHPext

Dynamic Extensions

extension=php_mysqlidll

Copiez le fichier

libmysqldll

qui se situe dans le reacutepertoire de PHP (

CPHP

dans moncas) dans le reacutepertoire de Windows (

CWINDOWS

dans mon cas)

Test drsquoApache et de PHP

Eacutecrivez le programme suivant (

indexphp

) et disposez-le dans le reacutepertoire contenant lessources PHP (

DdevPHP-MySQL

dans mon cas)

lthtmlgt ltheadgt lttitlegttest Apache 13 PHP5 lttitlegt ltheadgt

ltbodygt

Test de la configuration Apache 13 - PHP5 - Livre MySQL - C Sou-

tou

ltphp

phpinfo()

gt

ltbodygt lthtmlgt

Pour tester votre serveur arrecircter puis relancer Apache Dans le navigateur saisir lrsquoURL devotre serveur sur le port concerneacute (

httpcamparols9999

dans mon cas) qui doitlancer le programme

indexphp

Vous devez voir lrsquoaffichage preacuteceacutedent suivi de la configu-ration actuelle de PHP (reacutesultat de la fonction systegraveme PHP

phpinfo

)

4055_09_C09 Page 328 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

329

chapitre ndeg 9 Utilisation avec PHP

Test drsquoApache de PHP et de MySQL

Il faut que le serveur MySQL soit deacutemarreacute (veacuterifiez dans

Services

agrave partir du panneau deconfiguration) Eacutecrivez le programme

cx1php

suivant et disposez-le dans le reacutepertoirecontenant les sources PHP Renseignez le nom drsquoutilisateur MySQL le mot de passe et le nomde la base Ici je lance une connexion agrave la base du dictionnaire des donneacutees puis je seacutelectionnepar la suite la base

bdsoutou

ltphpif (($service= )gt0) print Connexion reacuteussie avec ltBgtsoutoultBgt sur information_schema de localhost if (($usebdsoutou = ) gt 0) print ltBRgt La base est deacutesormais ltBgtbdsoutoultBgt else print ltBRgt Seacutelection impossible sur ltBgtbdsoutoultBgt print ltBRgt Fermeture de la connexion else print ltBRgt La connexion est un eacutechec

gt

Tester ce programme dans le navigateur (

httpcamparols9999cx1php

dans moncas) Vous devez obtenir un reacutesultat analogue

API de PHP pour MySQL

Depuis PHP 5 le preacutefixe des fonctions de la derniegravere extension est deacutesormais laquo

msqli_

raquoAvec cette nouvelle API de nouvelles fonctions apparaissent elles concernent principalementles eacutetats preacutepareacutes (

prepared statements

) la possibiliteacute drsquoappeler des proceacutedures catalogueacutees etelles prennent en charge la programmation objet (classes) de PHP Nous nrsquoeacutetudierons pas icice mode de deacuteveloppement en restant dans une programmation proceacutedurale (des compleacutementsseront mis en ligne)

Figure 9-1

Test drsquoune connexion

mysqli_connect(localhostsoutouiutinformation_schema)

mysqli_select_db($servicebdsoutou)

mysqli_close($service)

4055_09_C09 Page 329 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

330

copy Eacuteditions Eyrolles

Connexion

La fonction

mysqli_connect

retourne un identifiant de connexion utiliseacute par la majoriteacutedes appels agrave la base Les fonctions

mysqli_close

mysqli_select_db

et

mysqli_change_user

renvoient

TRUE

en cas de succegraves

FALSE

en cas drsquoerreur Une connexion seferme implicitement en fin de programme mecircme si elle nrsquoa pas eacuteteacute clocirctureacutee explicitement

Interactions avec la base

La majoriteacute des traitements SQL lorsqursquoils incluent des paramegravetres srsquoeffectuent comme suit connexion (

connect

) preacuteparation de lrsquoordre (

parse

) association des paramegravetres agrave lrsquoordre SQL(

bind

) exeacutecution dudit ordre (

execute

) lecture des lignes (pour les

SELECT

fetch

) et libeacutera-tion des ressources (

free

et

close

) apregraves une eacuteventuelle validation de la transaction courante(

commit

ou

rollback

)

Preacuteparation exeacutecution

La fonction

msqli_prepare

preacutepare lrsquoordre SQL puis retourne un identifiant drsquoeacutetat qui peutecirctre utiliseacute notamment par les fonctions

mysqli_stmt_bind_param

et

mysqli_stmt_execute

La fonction

msqli_prepare

retourne

FALSE

dans le cas drsquoune erreur mais nevalide ni seacutemantiquement ni syntaxiquement lrsquoordre SQL Il faudra attendre pour cela sonexeacutecution par

mysqli_stmt_execute

La fonction

mysqli_stmt_execute

exeacutecute un ordre SQL preacutepareacute (renvoie

TRUE

en casde succegraves

FALSE

sinon) Le mode par deacutefaut est

auto

-

commit

Pour la programmation detransactions deacutesactiver ce mode (avec

mysqli_autocommit

) puis valider explicitementpar

mysqli_commit

La fonction

mysqli_stmt_fetch exeacutecute pas agrave pas une requecircte preacutepareacutee (retourne TRUEen cas de succegraves FALSE sinon)

Tableau 9-1 Fonctions de connexion et de deacuteconnexion

Nom de la fonction Paramegravetres

ressource mysqli_connect(stringserveur string utilisateur string motpasse [string nomBase])

Nom du serveur utilisateur mot de passe nom de la base eacuteventuellement Retourne FALSE en cas drsquoerreur

boolean mysqli_close(ressourceconnexion)

Ferme la connexion dont lrsquoidentifiant passe en paramegravetre

boolean mysqli_select_db(ressource connexion string nomBase)

Modifie la seacutelection de la base de la connexion dont lrsquoidentifiant passe en paramegravetre

boolean mysqli_change_user(ressource connexion string utilisateur string motpasse string nomBase)

Modifie lrsquoutilisateur et la base de la connexion dont lrsquoidentifiant passe en paramegravetre

4055_09_C09 Page 330 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 331

chapitre ndeg 9 Utilisation avec PHP

Validation

Les fonctions mysqli_commit et mysqli_rollback permettent de geacuterer des transactionselles retournent TRUE en cas de succegraves FALSE sinon

Le programme suivant (insert1php) insegravere une nouvelle compagnie (en supposantqursquoaucune erreur nrsquoest retourneacutee de la part de la base) Nous eacutetudierons plus loin commentpasser des paramegravetres agrave une instruction (prepared statement) et comment reacutecupeacuterer au niveaude PHP les erreurs renvoyeacutees par MySQL

Tableau 9-2 Fonctions drsquoanalyse et drsquoexeacutecution

Nom de la fonction Paramegravetres

ressource msqli_prepare(ressourceconnexion string ordreSQL)

Le premier paramegravetre deacutesigne lrsquoidentifiant de la connexion Le second contient lrsquoordre SQL agrave ana-lyser (SELECT INSERT UPDATE DELETE CREATEhellip)

boolean mysqli_stmt_execute(ressource ordreSQL)

Le paramegravetre deacutesigne lrsquoidentifiant drsquoeacutetat agrave exeacutecu-ter (renvoyeacute par prepare)

boolean mysqli_stmt_fetch(ressource ordreSQL)

Affecte aux variables de liaison PHP le reacutesultat drsquoune requecircte preacutepareacutee

Tableau 9-3 Fonctions de validation et drsquoannulation

Nom de la fonction Paramegravetres

boolean mysqli_commit(ressourceconnexion)

Valide la transaction de la connexion en paramegravetre

boolean mysqli_rollback(ressource connexion)

Annule la transaction de la connexion en paramegravetre

Tableau 9-4 Insertion drsquoun enregistrement

Code PHP Commentaires

ltphp if ( ($service = mysqli_connect (localhostsoutouiutbdsoutou)) gt 0)

Connexion

mysqli_autocommit($serviceFALSE) $insert1 = INSERT INTO bdsoutouCompagnie VALUES(ALAir Lib)

Deacutebut de la transactionCreacuteation de lrsquoinstruction

$ordre = Preacutepare lrsquoinsertion if ( ($res = ) gt 0) Exeacutecute lrsquoinsertion print ltBRgt Ajout opeacutereacute Validation

Libegravere les ressources Ferme la connexion else print ltBRgt La connexion est un eacutechecgt

Web

mysqli_prepare($service $insert1)mysqli_stmt_execute($ordre)

mysqli_commit($service)mysqli_stmt_free_result($ordre)

mysqli_close($service)

4055_09_C09 Page 331 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

332 copy Eacuteditions Eyrolles

Si vous souhaitez connaicirctre le nombre de lignes affecteacutees par lrsquoordre SQL utilisez laquo mysqli_stmt_affected_rows($ordre) raquo (voir la section Meacutetadonneacutees)

Constantes preacutedeacutefinies

Les constantes suivantes permettent de positionner des indicateurs jouant le rocircle de paramegrave-tres systegraveme (modes drsquoexeacutecution) au sein drsquoinstructions SQL Nous verrons au long de nosexemples lrsquoutilisation de certaines de ces constantes

Extractions

Les fonctions suivantes permettent drsquoextraire des donneacutees via un curseur que la documenta-tion de PHP appelle tableau On rappelle que MySQL retourne les noms de colonnes toujoursen minuscules Cette remarque inteacuteressera les habitueacutes des tableaux agrave accegraves associatifs(exemple $tab[prenom] prenom eacutetant une colonne extraite drsquoune table)

Tableau 9-5 Constantes preacutedeacutefinies

Constante Commentaires

MYSQLI_ASSOC Utiliseacute par mysqli_fetch_array afin drsquoextraire un associative array comme reacutesultat

MYSQLI_NUM Utiliseacute par mysqli_fetch_array afin drsquoextraire un enumerated array comme reacutesultat

MYSQLI_BOTH Utiliseacute par mysqli_fetch_array afin drsquoextraire un array reconnais-sant agrave la fois le mode associatif et le mode numeacuterique en indices

Tableau 9-6 Fonctions drsquoextraction

Nom de la fonction Paramegravetres

ressource mysqli_query(ressource ordreSQL [ressource connexion])

Exeacutecute la requecircte sur la base de donneacutees en coursRetourne un identifiant de reacutesultat ou FALSE en casdrsquoerreur

array mysqli_fetch_array(ressource idresultat [ int param] )

Retourne un tableau qui contient la ligne du curseursuivante ou FALSE en cas drsquoerreur ou en fin de cur-seur Le tableau est accessible de maniegravere associa-tive ou numeacuterique suivant le paramegravetre param quipeut ecirctre une combinaison de bull MYSQLI_BOTH (par deacutefaut identique agraveMYSQLI_ASSOC + MYSQLI_NUM)

bull MYSQLI_ASSOC pour un tableau agrave accegraves associatif(comme mysqli_fetch_assoc)

bull MYSQLI_NUM pour un tableau agrave accegraves numeacuterique(comme mysqli_fetch_row)

4055_09_C09 Page 332 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 333

chapitre ndeg 9 Utilisation avec PHP

Illustrons agrave partir drsquoexemples certaines utilisations de quelques-unes de ces fonctions

Le programme suivant (select1php) utilise mysqli_fetch_array afin drsquoextraire lesavions de la compagnie de code AF On suppose ici et dans les programmes suivants que laconnexion agrave la base est reacutealiseacutee et se nomme $service Le curseur obtenu est nommeacuteligne il prend en compte les valeurs nulles eacuteventuelles

La fonction mysqli_num_fields renvoie le nombre de colonnes de la requecircte et sasignature est deacutetailleacutee agrave la section Meacutetadonneacutees

array mysqli_fetch_assoc(ressource ordreSQL)

Retourne la ligne du curseur suivante dans untableau associatif ou FALSE en cas drsquoerreur ou enfin de curseur

object mysqli_fetch_object(ressource ordreSQL)

Retourne la ligne du curseur suivante dans un objetPHP ou FALSE en cas drsquoerreur ou en fin de curseur

array mysqli_fetch_row(ressource ordreSQL)

Retourne la ligne du curseur suivante dans untableau numeacuterique ou FALSE en cas drsquoerreur ou enfin de curseur

booleanmysqli_stmt_free_result(ressource ordreSQL)

Libegravere les ressources associeacutees aux curseurs occu-peacutes apregraves mysqli_prepare Retourne TRUE encas de succegraves FALSE dans le cas inverse

Tableau 9-6 Fonctions drsquoextraction

Nom de la fonction Paramegravetres

Tableau 9-7 Extraction agrave lrsquoaide de mysqli_fetch_array

Code PHP Commentaires

$requete = SELECT immatcapacitetypeAvion FROM Avion WHERE compa = AF if ( ($resultat= ) gt 0)

Creacuteation de la requecircte

$ncols = print ltH3gtAvions de la compagnie AFltH3gt print ltTABLE BORDER=1gt

Chargement du curseurObtention du nombre de colonnes

while ($ligne = ) print ltTRgt for ( $i=0$i lt $ncols $i++) print ltTDgt $ligne[$i] ltTDgt print ltTRgt print ltTABLEgt

Parcours des colonnes

Affichage des colonnes

Libeacuteration des ressources

else print ltBRgtLa requecircte est un eacutechec mysqli_close($service)

Fermeture de la connexion

Web

mysqli_query($service $requete)mysqli_num_fields($resultat)

mysqli_fetch_array($resultat)

mysqli_free_result($resultat)

4055_09_C09 Page 333 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

334 copy Eacuteditions Eyrolles

La fonction mysqli_num_rows($resultat) aurait retourneacute 4 (nombre de lignesextraites)

La fonction mysqli_free_result joue le mecircme rocircle que mysqli_stmt_free_result mais srsquoapplique aux instructions SELECT

Vous devez obtenir un reacutesultat analogue (en supposant que la compagnie AF dispose dequatre avions dont un est affecteacute drsquoune capaciteacute nulle)

Le programme suivant (select2php) deacutecrit lrsquoutilisation de la fonction mysqli_fetch_assoc pour extraire tous les Airbus Le tableau associatif obtenu est nommeacute row Lrsquoaccegraves agravechaque cellule de ce tableau est reacutealiseacute agrave lrsquoaide du nom des colonnes

Figure 9-2 Exemple avec mysqli_fetch_array

Tableau 9-8 Extraction agrave lrsquoaide de mysqli_fetch_assoc

Code PHP Commentaires

$requete = SELECT immattypeAvioncapacite FROM Avion WHERE typeAvion LIKE A

Creacuteation de la requecircte

if ( ($resultat= )gt0) print ltH3gtListe des AirbusltH3gt print lttable border=1gtn print lttrgtlttdgtImatriculationlttdgt lttdgtTypelttdgtlttdgtcapacitelttdgt $i=0 while ( ) print lttrgtlttdgt$row[immat] lttdgtlttdgt$row[typeAvion] lttdgtlttdgt$row[capacite]lttdgtlttrgt

Exeacutecution de la requecircte

Parcours du curseurAffichage des colonnes

print lttablegtn mysqli_free_result($resultat)

Libeacuteration des ressources

else print ltBRgtLa requecircte est un eacutechec mysqli_close($service)

Fermeture de la connexion

Web

mysqli_query($service $requete)

$row = mysqli_fetch_assoc($resultat)

4055_09_C09 Page 334 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 335

chapitre ndeg 9 Utilisation avec PHP

Le reacutesultat est le suivant (en supposant que la base ne stocke que trois avions de type Airbus)

Instructions parameacutetreacutees

Les fonctions mysqli_stmt_bind_param et mysqli_stmt_bind_result permettentdrsquoassocier agrave des colonnes MySQL des variables PHP et inversement Ces fonctions retournentTRUE en cas de succegraves FALSE sinon

Extractions

Le programme suivant (select3php) utilise la fonction mysqli_stmt_bind_resultafin drsquoextraire lrsquoimmatriculation et le type de tous les avions (au travers de variables PHP quisont deacutefinies apregraves exeacutecution de la requecircte) Notez lrsquoutilisation des fonctions mysqli_stmt_

Figure 9-3 Exemple avec mysqli_fetch_assoc

Tableau 9-9 Fonctions de passage de paramegravetres

Nom de la fonction Paramegravetres

booleanmysqli_stmt_bind_result(ressource ordreSQL mixed ampvariable1 [mixed ampvariable2hellip])

Le premier paramegravetre est lrsquoidentifiant drsquoeacutetatobtenu apregraves prepare Les paramegravetres suivantslistent les variables PHP de reacuteception

booleanmysqli_stmt_bind_param(ressource ordreSQL string types mixedampvariable1 [mixed ampvariable2hellip])

Le premier paramegravetre est lrsquoidentifiant de reacutesultatobtenu apregraves prepare Le deuxiegraveme paramegravetredeacutecrit les types des variables agrave substituer auxcolonnes Les paramegravetres suivants listent lesvariables PHP en entreacutee

string types Description des types des variables (i pournumeacuterique d pour flottant s pour chaicircne decaractegravere et b pour BLOB) Concateacutener autantde ces caractegraveres qursquoil existe de variables

4055_09_C09 Page 335 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

336 copy Eacuteditions Eyrolles

fetch pour parcourir le reacutesultat de la requecircte ligne apregraves ligne et mysqli_stmt_closepour fermer la requecircte preacutepareacutee

Manipulations

Le programme suivant (insert2php) utilise la fonction mysqli_stmt_bind_param enfaisant passer deux paramegravetres (variables PHP) lors de lrsquoinsertion drsquoune nouvelle compagnieOn retrouve la notion de placeholders (symbole laquo raquo deacutesignant une valeur drsquoune colonnedrsquoune table ou drsquoune vue) eacutetudieacutee au chapitre 7 Notez le second paramegravetre de la fonctionmysqli_stmt_bind_param (laquo ss raquo deacutesigne deux types chaicircnes de caractegraveres)

Tableau 9-10 Extraction preacutepareacutee avec la fonction mysqli_stmt_bind_result

Code PHP Commentaires

$requete = SELECT immattypeAvion FROM bdsoutouAvion$ordre = if ( ($res = ) gt 0)

Deacutefinition et exeacutecution de la requecircte preacutepareacutee

if ( ($resbind = ) gt 0) print ltH4gtListe des avionsltH4gt print ltTABLE BORDER=1gt while ( ) print ltTRgt ltTDgt $imltTDgt print ltTDgt $tyltTDgt ltTRgt print ltTABLEgt else print ltBRgtLa liaison est un eacutechec

Affectation des variables PHP

Parcours de la requecircte

else print ltBRgtLa requete est un eacutechecmysqli_stmt_close($ordre)mysqli_close($service)

Fermeture de la requecircte et de la connexion

Webmysqli_prepare($service$requete)

mysqli_stmt_execute($ordre)

mysqli_stmt_bind_result($ordre$im$ty)

mysqli_stmt_fetch($ordre)

Tableau 9-11 Insertion parameacutetreacutee avec la fonction mysqli_stmt_bind_param

Code PHP Commentaires

mysqli_autocommit($serviceFALSE)$codeComp = CAST$nomComp = Castanet Air$insert2 = $ordre =

Affectation des variables PHPDeacutefinition de lrsquoordre parameacute-treacute

if (( if (($res = ) gt 0) print ltBRgtCompagnie $nomComp inseacutereacutee mysqli_commit($service) mysqli_stmt_free_result($ordre)

Association avec les variables PHPExeacutecution de lrsquoordre

Validation else print ltBRgtLinsertion est un eacutechec

Libeacuteration des ressources

else print ltBRgtProblegraveme au bindmysqli_close($service)

Fermeture de la connexion

Web

INSERT INTO Compagnie VALUES()mysqli_prepare($service $insert2)

mysqli_stmt_bind_param($ordre ss $codeComp$nomComp)) gt 0)

mysqli_stmt_execute($ordre)

4055_09_C09 Page 336 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 337

chapitre ndeg 9 Utilisation avec PHP

Pour toute extraction par SELECT modification par UPDATE ou suppression par DELETE leprincipe agrave adopter est le mecircme

Gestion des seacutequences

La fonction mysqli_insert_id($connexion) retourne la valeur courante de laseacutequence apregraves avoir inseacutereacute un enregistrement dans une table contenant une colonne AUTO_INCREMENT

Le programme suivant (insert3php) insegravere un affregravetement (table deacutecrite aux chapitres 2 et8) agrave la date du jour pour la compagnie de code CAST et lrsquoavion immatriculeacute F-GRTC Onreacutecupegravere la derniegravere valeur de la seacutequence apregraves lrsquoinsertion

Traitement des erreurs

Les fonctions mysqli_errno et mysqli_error permettent de geacuterer les erreurs retourneacuteespar MySQL au niveau de la connexion Les fonctions mysqli_stmt_errno et mysqli_stmt_error sont analogues au niveau drsquoune instruction preacutepareacutee

Le programme suivant (erreur1php) utilise plusieurs de ces fonctions Dans cet exemplela suppression ne se deacuteroule pas correctement du fait de lrsquoexistence drsquoenregistrements laquo fils raquodans la table Avion Il est donc possible de deacuterouter le programme en fonction du codedrsquoerreur MySQL renvoyeacute (comme pour les exceptions des proceacutedures catalogueacutees)

Tableau 9-12 Insertion parameacutetreacutee avec la fonction mysqli_insert_id

Code PHP Commentaires

mysqli_autocommit($serviceFALSE)$codeComp = CAST$immatric = F-GRTC$n = 162$insert3 = INSERT INTO bdsoutouAffreter (compimmatdateAffnbPax) VALUES(SYS-DATE())$ordre = mysqli_prepare($service $insert3)

Affectation des variables PHP

if (( ) gt 0) if (($res = mysqli_stmt_execute($ordre)) gt 0) print ltBRgtAffretement inseacutereacutee sequence mysqli_commit($service) mysqli_stmt_free_result($ordre) else print ltBRgtLinsertion est un eacutechec

Deacutefinition de lrsquoordre parameacutetreacuteAssociation avec les variables PHPExeacutecution de lrsquoordreReacutecupeacuteration de la seacutequenceValidation

Libeacuteration des ressources

else print ltBRgtProblegraveme au bind mysqli_close($service)

Fermeture de la connexion

Web

mysqli_stmt_bind_param($ordre ssi $codeComp)$immatric $n)

mysqli_insert_id($service)

4055_09_C09 Page 337 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

338 copy Eacuteditions Eyrolles

Le reacutesultat est le suivant

Tableau 9-13 Fonctions pour la gestion des erreurs MySQL

Nom de la fonction Paramegravetres

int mysqli_errno(ressourceconnexion)

Retourne le code drsquoerreur du dernier appel agrave la base sur laconnexion deacutesigneacutee dans le paramegravetre (0 si aucune erreurnrsquoest survenue lors du dernier eacutechange)

string mysqli_error(ressourceconnexion)

Retourne le libelleacute de lrsquoerreur lors du dernier eacutechange (chaicircnevide si aucune erreur)

int mysqli_stmt_errno (ressource ordreSQL)

Idem mysqli_errno agrave partir de lrsquoidentifiant drsquoeacutetat deacutesigneacutedans le paramegravetre

string mysqli_stmt_error (ressource ordreSQL)

Idem mysqli_error agrave partir de lrsquoidentifiant drsquoeacutetat deacutesigneacutedans le paramegravetre

string mysqli_connect_error() Retourne le message drsquoerreur drsquoune mauvaise connexion

int mysqli_connect_errno() Retourne le code drsquoerreur drsquoune mauvaise connexion

Tableau 9-14 Gestion drsquoerreurs

Code PHP Commentaires

if ( ($service = mysqli_connect(localhost soutou iut bdsoutou)) gt 0) $delete1 = DELETE FROM bdsoutouCompagnie $ordre = mysqli_prepare($service $delete1) print $delete1

Connexion

Preacuteparation de lrsquoordre if ( ($res = mysqli_stmt_execute($ordre)) gt 0) print ltBRgtSuppression de Compagnie

Exeacutecution

else print ltBRgtltBgtMessage ltBgt print ltBRgtltBgtCode ltBgt mysqli_stmt_free_result($ordre) mysqli_close($service)

Affichage de lrsquoerreurLibeacuteration des ressourcesFermeture de laconnexion

else print Lutilisateur na pu se connecter ltBRgt print ltBgtMessage ltBgt

Erreur de connexion

Web

mysqli_stmt_error($ordre)mysqli_stmt_errno($ordre)

mysqli_connect_error()

Figure 9-4 Exception SQL leveacutee agrave lrsquoaide de PHP

4055_09_C09 Page 338 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 339

chapitre ndeg 9 Utilisation avec PHP

Proceacutedures catalogueacutees

Comme dans tout autre langage hocircte PHP permet drsquoinvoquer des proceacutedures catalogueacutees cocircteacuteserveur Supposons que nous disposions de la proceacutedure augmenteCap qui augmente lacapaciteacute (premier paramegravetre) des avions drsquoune compagnie donneacutee (deuxiegraveme paramegravetre)

CREATE PROCEDURE bdsoutouaugmenteCap(IN nbre TINYINT IN compag CHAR(4))

BEGIN

UPDATE Avion SET capacite = capacite + nbre WHERE compa = compag

END

Paramegravetre en entreacutee

Le code suivant (procedureCatphp) appelle cette proceacutedure afin drsquoaugmenter de 50 lacapaciteacute des avions de la compagnie de code AF en utilisant la fonction mysqli_multi_query Notez lrsquoutilisation des simples guillemets pour les paramegravetres en chaicircnes de caractegraveres

Pensez agrave donner lrsquoautorisation agrave lrsquoutilisateur appelant (ici soutou) drsquoexeacutecuter la proceacutedure (jelrsquoai eacutecrite sous root GRANT EXECUTE ON PROCEDURE bdsoutouaugmenteCap TO sou-toulocalhost$)

Paramegravetre en sortie

Afin de travailler avec des paramegravetres en sortie il est neacutecessaire drsquoutiliser des variables desession Une fois ces variables de session initialiseacutees au retour de lrsquoappel du sous-programmeil faudra extraire chaque valeur agrave lrsquoaide drsquoun SELECT dans une requecircte simple

Le code suivant (procedureCat2php) deacutecrit lrsquoappel de la proceacutedure leNomCompa-gnieEst (deacutecrite au chapitre 8 section Proceacutedures catalogueacutees) ayant deux paramegravetres Le

Web

Tableau 9-15 Appel drsquoune proceacutedure catalogueacutee (paramegravetres drsquoentreacutee)

Code PHP Commentaires

if (($service = mysqli_connect(localhost soutou iut bdsoutou)) gt 0)

Connexion

$nb = 50 $comp = AF if ($result = gt 0) print ltBRgtProceacutedure reacutealiseacutee correctement else print ltBRgtLa proceacutedure est un eacutechec mysqli_close($service)

Initialisation des variables PHP drsquoappel

Appel de la proceacutedure

else print ltBRgtLa connexion est un eacutechec

Fermeture de la connexion

Web

mysqli_multi_query($servicecall bdsoutouaugmenteCap($nb$comp))

mysqli_error($service)

4055_09_C09 Page 339 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

340 copy Eacuteditions Eyrolles

premier (en entreacutee) indique lrsquoavion de la compagnie rechercheacute le second (en sortie) contientle nom de la compagnie

Notez lrsquoutilisation de

la fonction mysqli_multi_query pour appeler la proceacutedure catalogueacutee

la variable de session v_retour pour reacutecupeacuterer le paramegravetre en sortie

la fonction mysqli_query pour extraire la valeur de la variable de session (contenue agravelrsquoindice 0 du tableau reacutesultat car il nrsquoy a ici qursquoune valeur retourneacutee dans le SELECT)

Meacutetadonneacutees

Plusieurs fonctions permettent drsquoextraire des informations en provenance du dictionnaire desdonneacutees (meta data) agrave partir drsquoune instruction SQL Par exemple mysqli_stmt_result_metadata retourne un identifiant de reacutesultat permettant drsquoextraire des meacutetadonneacutees agrave partirdrsquoune requecircte preacutepareacutee La fonction mysqli_fetch_field retourne un objet qui contientles meacutetadonneacutees des colonnes concerneacutees par une requecircte

Citons drsquoautres fonctions comme mysqli_fetch_field_direct et mysqli_fetch_fields qui sont similaires agrave mysqli_fetch_field Une fois lrsquoobjet retourneacute par cettefonction il faut extraire certains de ces champs agrave la demande

Tableau 9-16 Appel drsquoune proceacutedure catalogueacutee (paramegravetre de sortie)

Code PHP Commentaires

if ( ($service = mysqli_connect(localhost soutou iut bdsoutou)) gt 0)

Connexion

$immat = F-GAFU if ($result = gt 0) if ($result2 = ) $ligne = if ($ligne[0] == null) print ltBRgtDeacutesoleacute lavion $immat na pas de compagnie else print ltBRgtLa compagnie de lavion $immat est $ligne[0] mysqli_free_result($result2) else print ltBRgtProblegraveme au retour du paramegravetre mysqli_error($service) else print ltBRgtLa proceacutedure est un eacutechec mysqli_error($service)$result

Initialisation de la variable PHP drsquoappelAppel de la proceacutedure

Extraction de la variable de session

Affichage du reacutesultat

Gestion des erreurs

mysqli_close($service)else print ltBRgtLa connexion est un eacutechec

Fermeture de la connexion

Web

mysqli_multi_query$servicecall bdsoutouleNomCompagnieEst

($immatv_retour))mysqli_query($service

SELECT v_retour)mysqli_fetch_array($result2 MYSQLI_NUM)

4055_09_C09 Page 340 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 341

chapitre ndeg 9 Utilisation avec PHP

Tableau 9-17 Fonctions pour les meacutetadonneacutees

Nom de la fonction Paramegravetres

ressourcemysqli_stmt_result_metadata(ressource ordreSQL)

Le paramegravetre est lrsquoidentifiant drsquoeacutetat obtenu apregravesprepare

object mysqli_fetch_field(ressource ordreSQL)

Le paramegravetre est lrsquoidentifiant de reacutesultat obtenuapregraves mysqli_query ou FALSE si aucune infor-mation nrsquoest renvoyeacutee pour lrsquoordre SQL concerneacute

int mysqli_num_fields(ressource ordreSQL)

Retourne le nombre de colonnes concerneacutees parlrsquoordre SQL Le paramegravetre est lrsquoidentifiant de reacutesul-tat obtenu apregraves mysqli_query

Tableau 9-18 Champs de lrsquoobjet retourneacute par mysqli_fetch_field

Nom du champ Signification

name Nom de la colonne

table Nom de la table agrave laquelle la colonne appartient (si elle nrsquoa pas eacuteteacute calculeacutee)

def Valeur par deacutefaut de la colonne

max_length Taille maximale de la colonne pour le jeu de reacutesultats retourneacute par la requecircte

flags Entier repreacutesentant le bit-flags pour la colonne (codage des contraintes)

type Code du type de donneacutees de la colonne

decimals Nombre de deacutecimales de la colonne

Tableau 9-19 Code du type de donneacutees

Type MySQL Code eacutequivalent

DECIMAL 0

TINYINT 1

SMALLINT 2

INT 3

FLOAT 4

DOUBLE 5

TIMESTAMP 7

BIGINT 8

MEDIUMINT 9

DATE 10

TIME 11

DATETIME 12

YEAR 13

TEXT TINYBLOB TINYTEXT BLOB MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT

252

VARBINARY VARCHAR 253

CHAR BINARY ENUM SET 254

4055_09_C09 Page 341 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

342 copy Eacuteditions Eyrolles

Fonction mysqli_fetch_field

Le programme suivant (meta1php) utilise la fonction mysqli_fetch_field afindrsquoextraire la structure complegravete (en termes de colonnes) drsquoune table

Le reacutesultat est le suivant

Quelques explications

La taille vaut 2 pour la colonne compa car seule la compagnie de code AF est repreacutesen-teacutee dans mon jeu drsquoessai

Tableau 9-20 Extraction de la structure drsquoune table

Code PHP Commentaires

if ( ($res = mysqli_query ($service SELECT FROM bdsoutouAvion)) gt 0) $ncols = print ltH4gtStructure de la table Avion ($ncols colonnes)ltH4gt print lttable border=1gt print lttrgtltthgtNomltthgtltthgtTypeltthgtltthgtTailleltthgt ltthgtFlagltthgtlttrgt

Requecircte

Extraction du nombre decolonnes

while ($obj= ) print lttrgtlttdgt lttdgt lttdgt lttdgt lttdgt lttdgt lttdgt lttdgtlttrgt print lttablegtn

Affichage du nom codedu type taille maximaleet contraintes de chaquecolonne extraite

else print ltBRgtLa requete est un eacutechecmysqli_close($service)

Web

mysqli_num_fields($res)

mysqli_fetch_field($res)$obj-gtname$obj-gttype$obj-gtmax_length$obj-gtflags

Figure 9-5 Extraction de la structure drsquoune table

4055_09_C09 Page 342 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 343

chapitre ndeg 9 Utilisation avec PHP

(rootlocalhost) [bdsoutou] mysqlgt select from avion

+--------+-----------+----------+-------+

| immat | typeAvion | capacite | compa |

+--------+-----------+----------+-------+

| F-GAFU | A320 | 160 | AF |

| F-GLFS | A320 | 170 | AF |

| F-WOWW | A380 | NULL | AF |

| F-WTSS | Concorde | 90 | AF |

+--------+-----------+----------+-------+

Le flag vaut 16 387 pour la colonne immat car cette colonne est une cleacute primaire(ajouter 1) et non nulle (ajouter 2) et elle fait partie drsquoune cleacute (ici primaire ajouter16 384) Ci-apregraves un extrait du fichier mysql_confh Le flag vaut 16 392 pour lacolonne compa car elle fait partie drsquoune cleacute (ici eacutetrangegravere ajouter 16 384) et crsquoest une cleacuteeacutetrangegravere (ajouter 8) etc

Field cant be NULL

Field is part of a primary key define UNIQUE_KEY_FLAG 4 Field is part of a unique key

Field is part of a key define BLOB_FLAG 16 Field is a blob define UNSIGNED_FLAG 32 Field is unsigned define ZEROFILL_FLAG 64 Field is zerofill define BINARY_FLAG 128 Field is binary define ENUM_FLAG 256 field is an enum define AUTO_INCREMENT_FLAG 512 field is a autoincrement field define TIMESTAMP_FLAG 1024 Field is a timestamp define SET_FLAG 2048 field is a set define NO_DEFAULT_VALUE_FLAG 4096 Field doesnt have default value

Intern Part of some key define NUM_FLAG 32768 Field is num (for clients)

Fonction mysqli_stmt_result_metadata

Peu de changements par rapport au programme preacuteceacutedent La fonction mysqli_stmt_result_metadata suppose qursquoon travaille avec un eacutetat preacutepareacute Elle sert agrave affecter un iden-tifiant de reacutesultat qui passe en paramegravetre de mysqli_fetch_field comme vu preacuteceacutedem-ment

$requete = SELECT FROM bdsoutouAvion

$ordre = mysqli_prepare($service$requete)

if (($res = ) gt 0)

while ($obj= )

print lttdgt$obj-gtnamelttdgt

define NOT_NULL_FLAG 1

define PRI_KEY_FLAG 2

define MULTIPLE_KEY_FLAG 8

define PART_KEY_FLAG 16384

mysqli_stmt_result_metadata($ordre)

mysqli_fetch_field($res)

4055_09_C09 Page 343 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

344 copy Eacuteditions Eyrolles

Exercices

Lrsquoobjectif de ces exercices est de compleacuteter des progammes PHP pour extraire et mettre agrave jourdes donneacutees de certaines des tables du scheacutema Parc informatique

91 Extraction preacutepareacutee

Eacutecrire le programme exo1suitephp qui devra retrouver le nom du logiciel le numeacutero de poste ladate drsquoinstallation et la date drsquoachat du logiciel pour toutes les installations drsquoune salle donneacutee Ceprogramme sera appeleacute agrave partir du programme exo1debutphp composant un formulaire de saisie

lthtmlgt ltheadgt lttitlegtInstallations dune sallelttitlegt ltheadgt

ltbodygt

ltform method=POSTgtltpgt

ltH4gtRecherche des installations dune salleltH4gtltPgt

Numeacutero de salle ltinput type=text name=ns maxlength=7gtltBRgt

ltinput type=submit value=Cherchergt

ltformgt

ltbodygt lthtmlgt

Vous utiliserez

bull $_POST[lsquonsrsquo] pour reacutecupeacuterer la valeur du numeacutero de salle saisi dans le formulaire

bull mysqli_prepare mysqli_stmt_execute et mysqli_stmt_bind_result pour preacutepa-rer exeacutecuter et lier des variables PHP en sortie

bull Un affichage simple de type laquo Aucune installation dans la salle si la salle ne contient aucun postesur lequel un logiciel est installeacute raquo (exemple pour s12)

Votre programme doit produire un reacutesultat analogue agrave lrsquoeacutecran suivant

Figure 9-6 Formulaire de saisie

action=exo1suitephp

4055_09_C09 Page 344 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 345

chapitre ndeg 9 Utilisation avec PHP

92 Appel drsquoun sous-programme

Utiliser de nouveau la proceacutedure catalogueacutee supprimeSalle(IN ns VARCHAR(7)OUT resTINYINT) deacutecrite agrave lrsquoexercice du chapitre 8 Cette proceacutedure supprime une salle dont le numeacutero estpasseacute en premier paramegravetre et retourne en second paramegravetre

bull 0 si la suppression srsquoest deacuterouleacutee correctement

bull ndash 1 si le code de la salle est inconnu

bull ndash 2 si la suppression est impossible (contraintes reacutefeacuterentielles)

Eacutecrire le programme exo2suitephp qui agrave partir drsquoune saisie du numeacutero de salle (programmeexo2debutphp similaire agrave exo1debutphp) appelle le sous-programme supprimeSalle

lthtmlgt ltheadgt lttitlegtSuppression dune sallelttitlegt ltheadgt

ltbodygt

ltform action method=POSTgtltpgt

ltH3gtSalle agrave supprimerltH3gtltPgt

Numeacutero de salle ltinput type=text name=ns maxlength=7gtltBRgt

ltinput type=submit value=Supprimergt

ltinput type=reset value=Resetgt

ltformgt

ltbodygt lthtmlgt

Figure 9-7 Extraction preacutepareacutee

Figure 9-8 Formulaire de saisie

=exo2suitephp

4055_09_C09 Page 345 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

346 copy Eacuteditions Eyrolles

Tracez les diffeacuterents cas drsquoerreurs (numeacutero de salle reacutefeacuterenceacute par un poste de travail puis numeacutero desalle inexistant) Pensez agrave donner agrave lrsquoutilisateur le privilegravege en exeacutecution sur cette proceacutedure

93 Insertion preacutepareacutee

Eacutecrire le programme PHP exo3suitephp qui agrave partir drsquoune saisie des paramegravetres neacutecessairespour enregistrer une nouvelle installation agrave la date du jour drsquoun logiciel sur un poste de travail reacutealiselrsquoinsertion dans la table Installer Cette saisie sera reacutealiseacutee dans le programme exo3debutphpci-apregraves

lthtmlgt ltheadgt lttitlegtNouvelle installations de logiciel sur un

postelttitlegt ltheadgt

ltbodygt

lt method=POSTgtltpgt

ltphp

$format=j-n-Y

$datej = date($format)

print ltH4gtInstallation dun logiciel agrave la date du $datejltH4gtltPgt

gt

Numeacutero de poste ltinput type=text name=np maxlength=7gt

Code du logiciel ltinput type=text name=nl maxlength=5gtltBRgt

ltinput type=submit value=Enregistrergt

ltinput type=reset value=Resetgt

ltformgt

ltbodygt lthtmlgt

Pour tester une eacuteventuelle erreur de compatibiliteacute entre le type du poste et celui du logiciel (voir ledeacuteclencheur de lrsquoexercice en fin de chapitre 7) vous afficherez le message drsquoerreur (avec mysqli_stmt_error) et le code drsquoerreur si lrsquoinsertion se passe mal Tester une insertion correcte (p10log1) et une insertion incorrecte du fait des types diffeacuterents (p8 log7)

Figure 9-9 Saisie du formulaire

form action=exo3suitephp

4055_09_C09 Page 346 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 347

chapitre ndeg 9 Utilisation avec PHP

Figure 9-10 Insertion correcte

Figure 9-11 Erreur apregraves insertion

4055_09_C09 Page 347 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

4055_09_C09 Page 348 Jeudi 2 mars 2006 208 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

349

Chapitre 10

Outils graphiques

MySQL AB fournit gratuitement plusieurs outils graphiques afin drsquoadministrer de manipulerdrsquointerroger et de faire migrer une base de donneacutees Ce sont

MySQL Administrator

MySQLQuery Browser

et

MySQL Migration Toolkit

Lrsquoutilisation de cet outil de migration sort ducadre de cet ouvrage nous ne lrsquoeacutetudierons donc pas

Par ailleurs il existe drsquoautres consoles graphiques drsquoadministration que nous allons observersommairement agrave savoir le ceacutelegravebre

phpMyAdmin

(interface Web eacutecrite en PHP)

Toad

forMySQL

(plus connu pour sa version Oracle)

Navicat

et

EMS SQL Manager

Ce chapitre survole les principales fonctionnaliteacutes de ces logiciels Nrsquoy voyez pas ici un guidede reacutefeacuterence

MySQL Administrator

MySQL Administrator

est un outil drsquoadministration (bases tables utilisateurs) de sauvegarde(

backup

) de restauration (

restore

recovery

) et de surveillance (

database

monitoring

)

SousWindows il se preacutesente sous la forme drsquoun

Package Windows Installer

(extension

msi

) Soninstallation ne pose aucun problegraveme Vous trouverez la documentation officielle surhttpdevmysqlcomdocadministratorenindexhtml

Connexion

La console se lance sous Windows agrave partir de

Deacutemarrer

Programmes

MySQLMySQLAdministrator

Apparaicirct ensuite lrsquoeacutecran ci-apregraves pour lequel dans notre cas il faut saisirle mode de passe de

root

sur le serveur local

4055_10_C10 Page 349 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

350

copy Eacuteditions Eyrolles

Connexion nommeacutee

Lrsquoeacutecran suivant deacutecrit lrsquointerface accessible (choix laquo hellip raquo agrave cocircteacute de

Stored Connection

)pour preacutedeacutefinir une connexion Ici elle se nomme

cxSoutouLocal

et correspondra agrave laconnexion de

soutou

sur la base

bdsoutou

situeacutee sur le serveur local

Une fois la connexion choisie il faut srsquoidentifier au niveau de la base de donneacutees cible

Figure 10-1

Connexion agrave un serveur

Figure 10-2

Creacuteation drsquoune connexion nommeacutee

4055_10_C10 Page 350 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

351

chapitre ndeg 10 Outils graphiques

Liste des accegraves utilisateur

Lorsque la connexion est eacutetablie pour lrsquoutilisateur choisi il est possible de geacuterer une basetout en respectant ses propres preacuterogatives Ici nous choisissons sous

root

en local delister les accegraves utilisateur En seacutelectionnant un accegraves utilisateur (ici

root

sur

localhost

)il est possible de modifier ces caracteacuteristiques et ces privilegraveges

Quand vous ajoutez un nouvel utilisateur pensez agrave autoriser sa connexion agrave partir de chaquemachine cliente Clic droit sur lrsquoutilisateur dans la fenecirctre principale

Add Host FromWhich The User Can Connect

Ensuite il faudra lui allouer des privilegraveges sur chaquebase de donneacutees autoriseacutee

Gestion des privilegraveges

En seacutelectionnant un utilisateur lrsquoonglet

Schema Privileges

permet graphiquementdrsquoaffecter ou de reacutevoquer tout privilegravege sur toute base Dans lrsquoeacutecran suivant

root

affecte agravelrsquoaccegraves utilisateur

soutou

en local le privilegravege

SELECT

sur la base

mysql

Figure 10-3

Liste des utilisateurs

4055_10_C10 Page 351 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

352

copy Eacuteditions Eyrolles

Caracteacuteristiques systegraveme

Le choix

Health

de la fenecirctre principale renseigne les occupations meacutemoire des process encours sur le serveur MySQL ainsi que la valeur des variables systegraveme Lrsquoeacutecran suivant affichepar exemple le format par deacutefaut de repreacutesentation des colonnes de type date-heure

Figure 10-4

Caracteacuteristiques drsquoun utilisateur

Figure 10-5

Variables systegraveme

4055_10_C10 Page 352 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

353

chapitre ndeg 10 Outils graphiques

Options scripts SQL

Lrsquooption

ToolsOptions

(choix

Editors

) permet de personnaliser les scripts SQL quiseront automatiquement geacuteneacutereacutes suite agrave des modifications structurelles drsquoune base (ajout drsquounetable drsquoune contrainte etc) Lrsquoeacutecran suivant preacutesente les options par deacutefaut Par exemple lacontrainte de cleacute primaire si elle est une seacutequence de la table

Etudiant

se nommera automa-tiquement

idEtudiant

Figure 10-6

Options par deacutefaut des scripts SQL

4055_10_C10 Page 353 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

354

copy Eacuteditions Eyrolles

Composition drsquoune base

Le choix

Catalogs

de la fenecirctre principale donne des informations sur les tables index vueset proceacutedures catalogueacutees drsquoune base Lrsquoeacutecran suivant preacutesente la liste des tables de la base

bdsoutou

Figure 10-7

Liste des tables drsquoune base

4055_10_C10 Page 354 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

355

chapitre ndeg 10 Outils graphiques

Composition drsquoune table

En double-cliquant sur le nom drsquoune table on obtient le deacutetail des colonnes (la compositiondes cleacutes eacutetrangegraveres eacutegalement) ainsi que les caracteacuteristiques systegraveme relatives au mode destockage Lrsquoeacutecran suivant nous reacutevegravele la structure de la table

Poste

situeacutee dans la base

bdsoutou

Figure 10-8

Deacutetail des colonnes drsquoune table

4055_10_C10 Page 355 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

356

copy Eacuteditions Eyrolles

Composition des index

Lrsquoonglet

Shema Indices

deacutetaille les index preacutesents dans une base Lrsquoeacutecran suivant nousmontre les trois index de la table

Poste

situeacutee dans la base

bdsoutou

Modification drsquoun scheacutema

Eacutetudions agrave preacutesent la modification drsquoun scheacutema par le fait drsquoajouter une table puis unenouvelle contrainte agrave une table existante

Creacuteation drsquoune table

Lrsquoeacutecran suivant illustre la creacuteation de la table

Aeroport

dont les colonnes

codeOACI

et

compa

composent la cleacute primaire

Agrave lrsquoissue de cette creacuteation apregraves avoir cliqueacute sur

Apply Changes

arrive lrsquoeacutecran qui deacutecrit lasyntaxe SQL geacuteneacutereacutee Si vous deacutesirez conserver une trace de ce script pensez agrave copier-collerle contenu de la fenecirctre

Figure 10-9

Deacutetail des index

4055_10_C10 Page 356 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

357

chapitre ndeg 10 Outils graphiques

Figure 10-10

Creacuteation drsquoune table

Figure 10-11

Script SQL de creacuteation de table geacuteneacutereacute

4055_10_C10 Page 357 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

358

copy Eacuteditions Eyrolles

Ajout contrainte

Inseacuterons agrave preacutesent la cleacute eacutetrangegravere reliant la table

Aeroport

agrave la table

Compagnie

(laquo pegravere raquo) Dans lrsquoordre ajouter le nom de la contrainte laquo + raquo choisir la table cible puis lacolonne de la table laquo fils raquo (ici

compa

) Enfin vous pouvez restreindre les actions en cascade

Agrave lrsquoissue de cette modification arrive lrsquoeacutecran qui deacutecrit la syntaxe SQL geacuteneacutereacutee Si vousdeacutesirez conserver une trace de ce script pensez agrave copier-coller le contenu de la fenecirctre

Restriction

Pour toute modification dans quelque fenecirctre que ce soit il nrsquoest pas possible drsquoextraire lacommande SQL geacuteneacutereacutee automatiquement (sauf pour la creacuteation et la modification de tables)Cette option est tregraves preacutecieuse pour les administrateurs qui deacutesirent archiver les sources de

toutes leurs opeacuterations pour les reacuteutiliser agrave la demande si neacutecessaire

Figure 10-12

Ajout drsquoune cleacute eacutetrangegravere

Figure 10-13 Script SQL drsquoajout drsquoune cleacute eacutetrangegravere

4055_10_C10 Page 358 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 359

chapitre ndeg 10 Outils graphiques

MySQL Query Browser

MySQL Query Browser est un outil graphique composeacute drsquoune interface pour creacuteer exeacutecuter etoptimiser des instructions SQL (LDD LMD LID et LCD) Bien que toutes les instructionsgeacuteneacutereacutees par le biais de cet outil soient exeacutecutables en ligne de commande (crsquoest une chancepour vous qui avez ingurgiteacute toute la syntaxe SQLhellip) la documentation affirme que certainesrequecirctes peuvent y ecirctre composeacutees graphiquement de maniegravere plus intuitive (ce nrsquoest quandmecircme pas le QBE drsquoAccess)

MySQL Query Browser convient agrave des bases MySQL de version posteacuterieure agrave 40 SousWindows il se preacutesente sous la forme drsquoun Package Windows Installer (extension msi) Soninstallation ne pose aucun problegraveme Vous trouverez la documentation officielle surhttpdevmysqlcomdocquery-browserenindexhtml

Une fois connecteacute avec la mecircme interface que MySQL Administrator (dans laquelle vouschoisissez lrsquoutilisateur le serveur la base et saisissez le mot de passe) arrive la fenecirctreprincipale

Fenecirctre principale

Lrsquointerface inclut la palette drsquooutils suivante

Query Toolbar (zone de texte en haut au centre) pour creacuteer et eacutexeacutecuter des instructions(requecirctes et tout ordre de creacuteation ou de manipulation) et naviguer (avec Next et Goback) dans lrsquohistorique de ces commandes

Resultset qui affiche le reacutesultat drsquoune requecircte avec en bas un bandeau pour les onglets decontrocircle et lrsquoaffichage drsquoeacuteventuelles erreurs

Script Editor (onglets Edit Apply changes Discard changes First Last etSearch qui se trouvent en bas de la fenecirctre de reacutesultats) vous donne le controcircle pour creacuteermodifier et rechercher manuellement des donneacutees parmi les enregistrements extraits parune requecircte

Object Browser vous permet de seacutelectionner les colonnes des tables des bases qui voussont accessibles Vous pouvez double-cliquer ou faire des glisser-deacuteposer de colonnes(mecircme de diffeacuterentes tables pour composer des jointures) dans la zone de commande Lesbookmarks et les historiques sont aussi geacutereacutes agrave ce niveau

Inline Help (zone de texte en bas agrave droite) vous donne un acceacutes direct agrave lrsquoaide de toutescommandes SQL et fonctions La syntaxe srsquoaffiche dans le Resultset

4055_10_C10 Page 359 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

360 copy Eacuteditions Eyrolles

Extraction

Lrsquoeacutecran suivant illustre une jointure composeacutee agrave lrsquoaide drsquoun glisser-deacuteposer des colonnesconcerneacutees Toute la requecircte ne se compose pas automatiquement (jrsquoai ducirc eacutecrire manuelle-ment le signe laquo = raquo du preacutedicat de jointure et la condition du deuxiegraveme preacutedicat)

Je ne suis pas un professionnel de cette interface qui a quand mecircme agrave mon sens encore desprogregraves agrave faire pour faciliter vraiment lrsquoeacutecriture des requecirctes (notamment pour les jointuresavec sous-requecirctes) Notez que crsquoest lrsquoeacutecriture relationnelle de la jointure qui est choisie parlrsquooutil (ce qui confirme mes dires au chapitre 4 section Jointure relationnelle)

Figure 10-14 Fenecirctre principale de MySQL Query Browser

4055_10_C10 Page 360 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 361

chapitre ndeg 10 Outils graphiques

Modification

Lrsquoeacutecran suivant illustre une requecircte (monotable) dont le reacutesultat permet de modifier toutecolonne de la table en seacutelectionnnant lrsquoonglet Edit puis Apply changes

On peut eacutegalement ajouter un enregistrement (eacutequivalent agrave INSERT) en se positionnant surlrsquoenregistrement vide en fin de reacutesultat puis faire un clic droit sur le choix Add Row Poursupprimer un enregistrement (eacutequivalent agrave DELETE) le seacutelectionner puis faire un clic droitsur le choix Delete Row(s) Toute modification devra bien sucircr respecter les eacuteventuellescontraintes drsquouniciteacute de non nulliteacute et drsquointeacutegriteacute reacutefeacuterentielle

Figure 10-15 Jointure (requecircte multitable)

4055_10_C10 Page 361 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

362 copy Eacuteditions Eyrolles

phpMyAdmin

phpMyAdmin est un outil drsquoadministration drsquoun ou de plusieurs serveurs MySQL Les fonc-tionnaliteacutes principales de cet outil sont

de creacuteer modifier et supprimer des bases de donneacutees et des tables de geacuterer les utilisateurset leurs privilegraveges

drsquoexeacutecuter toute instruction SQL mecircme les requecirctes par lot de proposer Query By Examplepour eacutecrire des requecirctes complexes

drsquoimporter des donneacutees provenant de fichiers texte ou drsquoexporter des donneacutees aux formatsCSV XML et Latex

de creacuteer des graphiques PDF du scheacutema de votre base de donneacutees de geacuterer mysqli la derniegravere API PHP pour MySQL

Plusieurs installations sont possibles individuellement avec Apache et PHP avec WAMPavec EasyPHP (mais la version actuelle ne reconnaicirct pas encore MySQL 5) Vous trouverez ladocumentation officielle sur httpwwwphpmyadminnetpma_localized_docsfr

Une fois installeacute et configureacute avec Apache arrive la fenecirctre principale qui permet de seacutelectionnerles principales fonctionnaliteacutes Ici je seacutelectionne la base bdsoutou

Figure 10-16 Modification drsquoun enregistrement

4055_10_C10 Page 362 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 363

chapitre ndeg 10 Outils graphiques

Composition de la base

Les tables et vues (quinze en tout) apparaissent sur lesquelles diffeacuterentes actions sont possibles viales icocircnes dans la colonne Action (afficher structurer rechercher inseacuterer vider et supprimer)

Figure 10-17 phpMyAdmin

Figure 10-18 Composition de la base

4055_10_C10 Page 363 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

364 copy Eacuteditions Eyrolles

Structure drsquoune table

En seacutelectionnant la structure drsquoune table (ou vue) il est possible drsquoajouter de modifier ou desupprimer une colonne ou une contrainte de cleacute (primaire ou eacutetrangegravere)

Administrer une table

Lrsquoonglet Opeacuterations au niveau drsquoune table permet de modifier les caracteacuteristiques drsquounetable agrave lrsquoeacutechelle de la database

Figure 10-19 Structure drsquoune table

4055_10_C10 Page 364 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 365

chapitre ndeg 10 Outils graphiques

Extractions

Lrsquoonglet SQL permet de saisir une instruction SQL (LDD LMD LID ou LCD) Ici jrsquoai fait un copier-coller de la requecircte de division de lrsquoexercice du chapitre 4 Malheureusement jrsquoobtiens une erreurdans cette interface alors qursquoen ligne de commande deux lignes sont retourneacutees (postes 6 et 8)

Figure 10-20 Administrer une table

Figure 10-21 Requecircte SQL

4055_10_C10 Page 365 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

366 copy Eacuteditions Eyrolles

Lrsquoonglet Requecircte aide agrave la construction de requecirctes SQL (de type QBE) Dans lrsquoeacutecransuivant on compose une jointure entre les tables installer et logiciel Notez que laclause de jointure doit ecirctre saisie explicitement Ici on affiche le nom et la date drsquoinstallationdes logiciels existant sur des postes de travail

Rechercher

Lrsquoonglet Rechercher permet de rechercher des valeurs dans une ou plusieurs tables (ou vues)Ici on recherche les tables qui contiennent un enregistrement dont une colonne contient le motlaquo Oracle raquo Il est ensuite possible drsquoafficher ou drsquoeffacer chacune des occurrences veacuterifiant cettecondition

Figure 10-22 Assistant QBE

4055_10_C10 Page 366 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 367

chapitre ndeg 10 Outils graphiques

Exporter

Lrsquoonglet Exporter permet de transfeacuterer des donneacutees (et des structures) drsquoune ou de plusieurstables sous diffeacuterents formats (voir lrsquoeacutecran ci-apregraves)

Figure 10-23 Recherche dans plusieurs tables

Figure 10-24 Exportation au format Word

4055_10_C10 Page 367 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

368 copy Eacuteditions Eyrolles

Utilisateurs

Lrsquoonglet Privilegraveges autorise la gestion des accegraves utilisateur avec leur privilegraveges En seacutelec-tionnant un utilisateur existant il est aussi possible de modifier ses caracteacuteristiques

Le message en rouge en bas de page vous invite agrave modifier le mot de passe de root Jrsquoai eudes mauvaises surprises suite agrave plusieurs tentatives de modification Meacutefiancehellip

TOAD for MySQL

Toad for MySQL est un outil graphique drsquoadministration et de deacuteveloppement qui estdisponible gratuitement dans une version Preview Release Toutefois ce statut de freewaresemble temporaire et le produit doit ecirctre reteacuteleacutechargeacute tous les 60 jours (httpwwwtoad-softcomtoadmysqltoad_mysqlhtm)

Sous Windows il se preacutesente sous la forme drsquoune archive drsquoun installeur (fichier agrave extensionmsi) dont lrsquoexeacutecution ne pose aucun problegraveme Quand la grenouille coasse TOAD est precirctpour vous Au premier deacutemarrage des choix de mode drsquoaffichage vous seront demandeacutes Parla suite vous devrez vous connecter en donnant tous les paramegravetres neacutecessaires

Figure 10-25 Gestion des utilisateurs

4055_10_C10 Page 368 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 369

chapitre ndeg 10 Outils graphiques

Une fois connecteacute arrive une interface agrave partir de laquelle par le menu Tools et Views desonglets se composent dans la fenecirctre principale Lrsquoaffichage de ces onglets qui sont constitueacutesde boutons listes deacuteroulantes choix etc est controcircleacute par le menu Window

Administration

Le choix ToolsDatabase Browser en seacutelectionnant une base de donneacutees renseigne lestables index vues proceacutedures catalogueacutees privilegraveges des utilisateurs etc Tout objet relatif agravela base se retrouve ici

Lrsquoeacutecran suivant preacutesente les onglets disponibles pour la base bdsoutou On srsquointeacuteresse ici agravela composition de la table Installer Toute modification de cette table au niveau de lastructure est possible (sous reacuteserve de maintenir lrsquointeacutegriteacute des donneacutees via drsquoeacuteventuellescontraintes reacutefeacuterentielles)

Lrsquoonglet Data extrait les lignes drsquoune table Lrsquoonglet Indexes deacutecrit les index preacutesents dansla table Lrsquoonglet Constraints liste les contraintes reacutefeacuterentielles Lrsquoonglet Informationeacutenumegravere les caracteacuteristiques physiques de la table Lrsquoonglet Script restitue le script SQL decreacuteation que vous pouvez sauvegarder sous la forme drsquoun fichier texte

Figure 10-26 Connexion via TOAD

4055_10_C10 Page 369 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

370 copy Eacuteditions Eyrolles

Instructions en ligne

Le choix ToolsEditor de la fenecirctre principale ouvre plusieurs fenecirctres dont la plus impor-tante est une zone de texte contenant une instruction SQL Lrsquoeacutecran suivant preacutesente une requecirctequi reacutealise une division (voir chapitre 4) Lrsquoonglet Result Sets contient le(s) reacutesultat(s) delrsquoextraction Lrsquoonglet Explain Plan permet de visualiser le plan drsquoexeacutecution

Figure 10-27 Composition drsquoune base

Figure 10-28 Extraction de donneacutees

4055_10_C10 Page 370 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 371

chapitre ndeg 10 Outils graphiques

Toute autre instruction SQL (LMD LDD et LCD) peut ecirctre exeacutecuteacutee dans ce mode Le menuCreate geacutenegravere automatiquement le deacutebut de la syntaxe SQL adeacutequate (creacuteation drsquoune basetable vue index ou proceacutedure catalogueacutee)

Deacuteveloppement

Le choix ToolsDatabase Browser ensuite lrsquoonglet Procedure en seacutelectionnant uneproceacutedure (clic droit puis Alter Procedure) permet de modifier puis de recompiler(EditorExecute SQL Statement) une proceacutedure existante Pour en creacuteer une nouvellevous avez le choix entre le clic droit puis Create Procedure ou passer par le menu geacuteneacuteralCreateProcedure

Creacuteation drsquoobjets

Le menu geacuteneacuteral Create permet de creacuteer des tables bases vues index et fonctions ou proceacute-dures catalogueacutees En seacutelectionnant le choix Table une fenecirctre srsquoouvre deacutecouvrant troisonglets pour caracteacuteriser la table Le premier onglet permet entre autres de deacutefinir le moteur destockage le nom la base et drsquoautres informations que lrsquoeacutecran suivant illustre

Figure 10-29 Modification drsquoun sous-programme

4055_10_C10 Page 371 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

372 copy Eacuteditions Eyrolles

Le second onglet donne la possibiliteacute de structurer la table (description de chaque colonne etdes contraintes en ligne)

Figure 10-30 Creacuteation drsquoune table (onglet Table)

Figure 10-31 Creacuteation drsquoune table (onglet Columns)

4055_10_C10 Page 372 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 373

chapitre ndeg 10 Outils graphiques

Le dernier onglet permet de deacutefinir les eacuteventuelles cleacutes eacutetrangegraveres de la table Jrsquoavoue avoir eudes problegravemes pour en creacuteer une qui soit impleacutementeacutee dans la basehellip Vous essayerez vous-mecircme

Recherche drsquoobjets

Une fonctionnaliteacute inteacuteressante concerne la recherche drsquoobjets (choix ToolsObjectSearch) Dans lrsquoexemple suivant on extrait tous les objets de la base de donneacutees mysql dontle nom contient la chaicircne laquo user raquo Notez aussi la possibiliteacute de chercher un identifiant (parexemple le nom drsquoune table) au sein du corps de proceacutedures fonctions ou vues (les deacuteclen-cheurs ne sont pas ici pris en compte visiblement)

Figure 10-32 Creacuteation drsquoune table (onglet Constraints)

4055_10_C10 Page 373 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

374 copy Eacuteditions Eyrolles

Exportations

Le choix ToolsExport Wizard lance un assistant (un peu semblable agrave celui drsquoAccess)seacutelectionnant une (ou plusieurs) table(s) ou une (ou plusieurs) base(s) de donneacutees afindrsquoexporter les donneacutees sous diffeacuterents formats Sont permis notamment les fichiers texte(avec seacuteparateurs entre colonnes) fichiers XML ou html insertion INSERT preacuteeacutecrites

La partie de code suivante preacutesente les deux premiegraveres lignes du fichier Installerxmlgeacuteneacutereacute suite agrave lrsquoexportation dans ce format de la table de mecircme nom

ltInstallergtltNPOSTEgtp2ltNPOSTEgtltNLOGgtlog1ltNLOGgtltNUMINSgt1ltNUMINSgt

ltDATEINSgt15052003 000000ltDATEINSgtltDELAIgt292400ltDELAIgt

ltInstallergt

ltInstallergtltNPOSTEgtp2ltNPOSTEgtltNLOGgtlog2ltNLOGgtltNUMINSgt2ltNUMINSgt

ltDATEINSgt17092003 000000ltDATEINSgtltDELAIgt146300ltDELAIgt

ltInstallergt

hellip

Navicat

Navicat est un outil assez simple et intuitif Il ravira ceux qui appreacutecient concevoir des requecirctesgraphiquement Ici le QBE est bien supeacuterieur agrave celui de phpMyAdmin La documentationofficielle se trouve agrave httpsupportnavicatcom

Figure 10-33 Recherche drsquoobjets

4055_10_C10 Page 374 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 375

chapitre ndeg 10 Outils graphiques

Sous Windows il se preacutesente sous la forme drsquoun exeacutecutable dont lrsquoinstallation ne pose aucunproblegraveme Au premier deacutemarrage vous devez vous connecter en donnant tous les paramegravetresneacutecessaires La fenecirctre principale srsquoaffiche

Creacuteation drsquoune table

Apregraves avoir opteacute pour le choix Design Table lrsquoonglet Fields permet de deacutefinir facilementpar listes deacuteroulantes les diffeacuterentes colonnes de la nouvelle table

Figure 10-34 Accueil de Navicat

Figure 10-35 Creacuteation des colonnes

4055_10_C10 Page 375 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

376 copy Eacuteditions Eyrolles

Deacutefinition drsquoune contrainte

Lrsquoonglet Foreign Key permet de creacuteer aiseacutement par listes deacuteroulantes les cleacutes eacutetrangegraveres(une fois que les colonnes sont creacuteeacutees)

Figure 10-36 Deacutefinition drsquoune cleacute eacutetrangegravere

4055_10_C10 Page 376 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 377

chapitre ndeg 10 Outils graphiques

Creacuteation drsquoune requecircte

Lagrave je dis laquo bravo raquo Vous allez vous reacutegaler agrave composer vos jointures en seacutelectionnant unecolonne puis en la glissant au niveau de la cleacute de la table associeacutee Vous verrez votre requecirctesrsquoeacutecrire au fur et agrave mesure que vous agirez sur le diagramme Vous pourrez eacutegalement agir auniveau de la requecircte en cliquant aux diffeacuterents endroits indiqueacutes

Figure 10-37 Creacuteation drsquoune requecircte

4055_10_C10 Page 377 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

378 copy Eacuteditions Eyrolles

Importation

Au niveau drsquoune table drsquoune base de donneacutees lrsquoonglet Import Wizard lance un assistant quicomporte huit eacutetapes et permet de charger la table en enregistrements pouvant provenir de dixformats diffeacuterents

Lrsquoassistant drsquoexportation comporte cinq eacutetapes et reconnaicirct une vingtaine de formats dedonneacutees cibles

Gestion des utilisateurs

Le choix Manage Users offre une maniegravere simple et efficace pour creacuteer modifier supprimerdes accegraves utilisateurs et les privilegraveges associeacutes agrave tous les niveaux (global database tablecolumn et procedure)

Figure 10-38 Importation de donneacutees

4055_10_C10 Page 378 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 379

chapitre ndeg 10 Outils graphiques

Enfin il est aussi possible drsquoeacutecrire des proceacutedures catalogueacutees de composer des rapportsdrsquoimpression et de programmer des tacircches drsquoadministration

MySQL Manager

MySQL Manager (socieacuteteacute EMS) est un outil payant puissant intuitif et posseacutedant denombreuses fonctionnaliteacutes Il ravira ceux qui appreacutecient le QBE qui est ici aussi bien supeacute-rieur agrave celui de phpMyAdmin La documentation officielle se trouve agrave httpwwwsqlmana-gernetfrproductsmysqlmanagerdocumentation

Sous Windows il se preacutesente sous la forme drsquoune archive contenant un exeacutecutable dontlrsquoinstallation ne pose aucun problegraveme Au premier deacutemarrage des choix de modes drsquoaffichagevous seront demandeacutes Par la suite vous devrez vous connecter en donnant tous les paramegravetresneacutecessaires La fenecirctre principale apparaicirct

Figure 10-39 Gestion des accegraves et des privilegraveges

4055_10_C10 Page 379 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

380 copy Eacuteditions Eyrolles

Creacuteation drsquoune table

Plusieurs chemins existent pour lancer lrsquoassistant de creacuteation drsquoune table qui ressemble agrave ceuxdeacutejagrave eacutetudieacutes pour les preacuteceacutedents outils On retrouvera les diffeacuterents onglets permettant demodifier les colonnes index cleacutes eacutetrangegraveres et donneacutees Lrsquoonglet DDL contient lrsquoinstructionSQL geacuteneacutereacutee

Figure 10-40 Accueil de SQL Manager

Figure 10-41 Creacuteation drsquoune table

4055_10_C10 Page 380 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 381

chapitre ndeg 10 Outils graphiques

Les cleacutes eacutetrangegraveres se rajoutent apregraves creacuteation de la structure totale de la table

Figure 10-42 Ajout drsquoune cleacute eacutetrangegravere

4055_10_C10 Page 381 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

382 copy Eacuteditions Eyrolles

Creacuteation drsquoune requecircte

Comme pour Navicat laquo bravo raquo eacutegalement Vous trouverez un outil efficace (plus encore quecelui de Navicat) pour eacutecrire vos requecirctes Lrsquoeacutecran suivant illustre une jointure (geacuteneacutereacutee commepour Navicat sous la forme drsquoune eacutecriture SQL2 avec INNER JOIN) affichant quatre champs

Le reacutesultat peut srsquoexploiter de maniegravere tregraves efficace (en tant que grille ou sous forme imprimable)

Proceacutedures catalogueacutees

Un bon point pour cet outil pour pouvoir geacuterer les proceacutedures en modification ou creacuteation etpour pouvoir les recompiler et affecter des privilegraveges drsquoexeacutecution

Figure 10-43 Construction graphique drsquoune requecircte

Figure 10-44 Proceacutedure catalogueacutee

4055_10_C10 Page 382 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles 383

chapitre ndeg 10 Outils graphiques

Gestion des utilisateurs

Lrsquoassistant graphique est tregraves clair

Gestion des privilegraveges

Lrsquoonglet Gestionnaire de droits permet drsquoattribuer des privilegraveges agrave tous les niveauxLrsquoeacutecran suivant illustre lrsquoautorisation drsquoexeacutecution de deux proceacutedures et lrsquoautorisation demodification de deux autres agrave lrsquoaccegraves utilisateur Paul agrave partir de la machine 1921684173

Cet outil offre eacutegalement drsquoautres fonctionnaliteacutes comme la gestion des variables systegravemeassistants drsquoexportation etc

Figure 10-45 Gestion des utilisateurs

4055_10_C10 Page 383 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

Partie III Langages et outils

384 copy Eacuteditions Eyrolles

Bilan

Les avantages des outils deacutedieacutes et professionnels (comme Navicat TOAD et EMS MySQLManager) reacutesident dans le fait qursquoils sont fiables et permettent de garder une configuration detravail De plus ils peuvent ecirctre facilement installeacutes sur une autre machine que le serveurMySQL

Pour les deacutebutants je leur conseille de commencer agrave travailler avec les deux outils de MySQLagrave savoir MySQL Administrator et MySQL Query Browser qui sont sucircrs et simples drsquoutilisationPhpMyAdmin sera preacutefeacutereacute par les connaisseurs et plutocirct reacuteserveacute aux configurations de typeapplication PHP heacutebergeacutees car il est le plus reacutepandu Neacuteanmoins les nombreuses configura-tions possibles entre les diffeacuterentes versions des acteurs concerneacutes (Apache PHP MySQL etphpMyAdmin) font que des mauvaises surprises peuvent facilement arriverhellip

Figure 10-46 Privilegraveges au niveau routine

4055_10_C10 Page 384 Jeudi 2 mars 2006 209 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

385

Annexe

Bibliographie et webographie

Magazines papiers et en ligne

Programmez

(wwwprogrammezcom)

Database Journal

(wwwdatabasejournalcom)

Livres

F B

ROUARD

C S

OUTOU

SQL

Pearson Education 2005

E D

ASPET

CP

DE

G

EYER

PHP 5 avanceacute

Eyrolles 2005

P D

ELMAL

SQL2-SQL3 Applications agrave Oracle

De Boeck Universiteacute 2000

M K

OFLER

MySQL 5

Eyrolles 2005

C S

OUTOU

De UML agrave SQL

Eyrolles 2002

Sites Web

Eyrolles

Eacutediteur wwweditions-eyrollescom

Compleacutements en ligne sur la fiche de lrsquoouvrage sur wwweditions-eyrollescom ou

httpicareiut-blagnacfrsoutoupersoSQLpourMySQLComplementshtml

MySQL

httpwwwmysqlcom

httpmysqldeveloppezcom

httpdevmysqlcomtech-resourcesfaqhtml

4055_11_Biblio Page 385 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL

386

copy Eacuteditions Eyrolles

PHP

httpfrphpnetmanualfrindexphp

httpwwwnexennetdocs

SQL et bases de donneacutees

httpsqlprodeveloppezcom

httpfadacedeveloppezcom

Outils

MySQL Administrator MySQL Query Browser

httpwwwmysqlcomproductstools

phpMyAdmin

httpwwwphpmyadminnethome_pageindexphp

Navicat

httpwwwnavicatcom

TOAD

httpwwwtoadsoftcomtoadmysqltoad_mysqlhtm

EMS SQL Manager

httpwwwsqlmanagernet

4055_11_Biblio Page 386 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

387

Index

Symboles

$_POST 344 154amp 100ltlt 100gtgt 100^ 100| 100~ 100

A

ABS 99absolute 304Access 294ACOS 99ACTION_CONDITION 273ACTION_ORIENTATION 273ACTION_REFERENCE_NEW_ROW 273ACTION_REFERENCE_NEW_TABLE 273ACTION_REFERENCE_OLD_ROW 273ACTION_REFERENCE_OLD_TABLE 273ACTION_STATEMENT 273ACTION_TIMING 272ADD CONSTRAINT 72ADD INDEX 72ADDDATE 101ADDTIME 101AFTER 265afterLast 304ALGORITHM=MERGE 176ALGORITHM=TEMPTABLE 176ALGORITHM=UNDEFINED 176alias

colonne 87en-tecircte 89table 87

vue 178WHERE 95

ALL 134ALL PRIVILEGES 166alpha 4ALTER

COLUMN 70DATABASE 158FUNCTION 243PROCEDURE 243ROUTINE 234VIEW 188

ALTER TABLEADD 68ADD CONSTRAINT 72ADD INDEX 72ALTER COLUMN 70CHANGE 69DISABLE KEYS 75DROP 70DROP FOREIGN KEY 74DROP PRIMARY KEY 74ENABLE KEYS 77MODIFY 69

Alter_priv 161Alter_routine_priv 162AND 93ANY 134Apache 327API 5AS SELECT 90ASC 89ASCII 96association 24ATAN 99AUTO_INCREMENT 44 196autojointure 125AVG 110AVG_ROW_LENGTH 196

4055_12_Indexfm Page 387 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

388

copy Eacuteditions Eyrolles

B

batch 13BEFORE 265beforeFirst 304begin 210beta 4BETWEEN 93BIGINT 27BIN 100BINARY 27BINARY() 21 106BIT 27 40BIT_LENGTH 101BLOB 29block label 214BOOL 27BOOLEAN 27

C

CallableStatement 318cancelRowUpdates 308CASCADE 34CASCADED 176CASE 218casse 20 211CAST 106CATALOG_NAME 195CEIL 99CHAR 26CHAR() 96CHARACTER SET 156CHARACTER_OCTET_LENGTH 197CHARACTER_SET_NAME 198CHECK 24 273CHECK_OPTION 193ClassforName 295CLASSPATH 292cleacute

candidate 3eacutetrangegravere 3primaire 3

client-serveur 209CLOSE 245

COLLATE 156COLLATION_NAME 198colonne 2COLUMN_COMMENT 198COLUMN_DEFAULT 197COLUMN_KEY 197COLUMN_NAME 197 203Column_name 168Column_priv 159 168COLUMN_PRIVILEGES 194 203COLUMNS 194 196COMMENT 20 235commentaire 212

MySQL 21COMMIT 228comparaisons 106CONCAT 89 96concateacutenation 89Connection 295CONSTRAINT_NAME 199CONSTRAINT_SCHEMA 198CONSTRAINT_TYPE 199CONTAINS SQL 235CONTINUE 249contrainte 23

CHECK 24FOREIGN KEY 24in-line 23out-of-line 23PRIMARY KEY 23reacutefeacuterentielle 56UNIQUE 23

conventions 24conversions 105CONVERT 106COS 99COT 99COUNT 110CREATE 19

DATABASE 156FUNCTION 235INDEX 32ROUTINE 234SCHEMA 156

4055_12_Indexfm Page 388 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

389

Index Apprendre SQL avec MySQL

TABLE 19TRIGGER 263USER 153VIEW 176

Create_priv 161Create_routine_priv 162CREATE_TIME 195Create_tmp_table_priv 163Create_user_priv 161Create_view_priv 161CREATED 201 273createStatement 295CROSS JOIN 141CURDATE 101CURRENT_DATE 44 101CURRENT_TIME 44CURRENT_TIMESTAMP 44 101CURRENT_USER() 187curseur 244CURSOR 245CURTIME 188

D

data dictionary 190Data Source Name 294DATA_LENGTH 196DATA_TYPE 197database 6 13 155DatabaseMetaData 314DATE 28 42DATE() 101DATE_ADD 51 101DATE_FORMAT 53 101 188DATE_SUB 101DATEDIFF 51 101DATETIME 28 42DAY 101DAY_MINUTE 51DAYNAME 101DAYOFMONTH 101DAYOFYEAR 101Db 167DBA 152

DEALLOCATE 279DEC 28DECIMAL 27DECLARE 213

CONDITION 260deacuteclencheur 262DEFAULT 20 38 213DEFAULT() 108DEFAULT_CHARACTER_SET_NAME 195DEFAULT_COLLATION_NAME 195DEFINER 201definer 201DEGREES 99DELAYED 37DELETE 54Delete_priv 160deleteRow 308delimiter 15 20DESC 89DESCRIBE 29DETERMINISTIC 235dictionnaire des donneacutees 190DISABLE KEYS 75DISTINCT 87DISTINCTROW 87division 142DO 279DOUBLE 27DOUBLE PRECISION 28DriverManager 293DROP 70

FOREIGN KEY 74PRIMARY KEY 74TABLE 33TRIGGER 278USER 155VIEW 189

Drop_priv 161

E

ELSEIF 218ENABLE KEYS 77END 210

4055_12_Indexfm Page 389 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

390

copy Eacuteditions Eyrolles

ENGINE 196ENUM 29 40 107equals 309eacutequijointure 123ERROR

1045 1541046 2501048 391054 951062 39 49 2851172 223 2521263 491265 40 411288 1791303 2431326 2451363 2701369 181 1871394 1821395 1831422 2751424 2421442 2771451 55 611452 39 49 59 285

eacutetiquette 214EVENT_MANIPULATION 272EVENT_OBJECT_CATALOG 273EVENT_OBJECT_SCHEMA 272EVENT_OBJECT_TABLE 272exception 248

JDBC 322EXECUTE 239 279execute 297 316 319Execute_priv 162executeQuery 297 319executeUpdate 297 316 319EXISTS 139EXIT 249exit 15EXP 100expression 88EXTRACT 53 102

F

FALSE 218FETCH 245FIELD 96FIELDS

ENCLOSED BY 63 146ESCAPED BY 63 146TERMINATED BY 63 146

FILE 146File_priv 163first 304FIXED 28FLOAT 27FLOOR 100FLUSH PRIVILEGES 154fonction catalogueacutee 233FOR EACH ROW 265FOR UPDATE 247FOREIGN KEY 56FORMAT 108FROM 85FROM_DAYS 53 102FROM_UNIXTIME 102FULL OUTER JOIN 131

G

gamma 4GET_FORMAT 53getClass 300getColumnCount 313getColumnName 313getColumns 314getColumnType 313getColumnTypeName 313getConcurrency 308getConnection 297getDatabaseProductName 314getDatabaseProductVersion 314getErrorCode 322getFetchDirection 304getGeneratedKeys 312getMessage 322getMetaData 302

4055_12_Indexfm Page 390 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

391

Index Apprendre SQL avec MySQL

getName 300getNextException 322getObject 300getPrecision 313getResultSetConcurrency 308getResultSetType 308getSavepointId 321getSavepointName 321getScale 313getSchemaName 313getSQLState 322getTableName 313getTables 315getter methods 297getType 308getUpdateCount 297getUserName 315GOTO 222GRANT 164

OPTION 164 165Grant_priv 161GRANTEE 202Grantor 168 169GREATEST 108GROUP BY 109GROUP_CONCAT 110

H

HANDLER 249handler 248HAVING 109help 13HEX 101host 7 13HOUR 102html 13 145

I

identificateur 212IDENTIFIED BY 153IF 217

EXISTS 34 158 189NOT EXISTS 19 156

IFNULL 109IGNORE 47 54 63IN 94 134index 30

B-tree 32FULLTEXT 32SPATIAL 32UNIQUE 32

Index_priv 161ineacutequijointure 127INFORMATION_SCHEMA 190INNER JOIN 124InnoDB 20INOUT 237INSERT 37INSERT() 96Insert_priv 160insertRow 308instead of 179INSTR 96INT 28INTEGER 27inteacutegriteacute reacuteferentielle 56INTO OUTFILE 146invoker 201IS NULL 94 214IS_GRANTABLE 202IS_NULLABLE 197isAfterLast 304isBeforeFirst 304isFirst 304isLast 304isNullable 313ITERATE 221

J

JCreator 293JDBC 289JOIN 124jointure 121

eacutequi join 123externe 128inner join 123

4055_12_Indexfm Page 391 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

392

copy Eacuteditions Eyrolles

mixte 136naturelle 140outer join 128proceacutedurale 132relationnelle 122self join 125SQL2 122

K

key preserved 184KEY_COLUMN_USAGE 194 199

L

LANGUAGE SQL 234last 304LAST_ALTERED 201LAST_DAY 102LAST_INSERT_ID() 44LEAST 109LEAVE 221LEFT 97LENGTH 97LIKE 94LIMIT 48 54 90LINES 63 146LMD 37LN 100LOAD DATA INFILE 62LOB (Large Object Binary) 2LOCAL 176localhost 154LOCALTIME 102LOCALTIMESTAMP 102LOCATE 97Lock_tables_priv 163LOG 100LONGBLOB 29LONGTEXT 27LOOP 221LOW_PRIORITY 37 47 54LOWER 97lower_case_table_names 21

LPAD 97LTRIM 99

M

MAKEDATE 102MAKETIME 102MAX 110max_connections 162MAX_CONNECTIONS_PER_HOUR 165MAX_QUERIES_PER_HOUR 165max_questions 162max_updates 162MAX_UPDATES_PER_HOUR 165MAX_USER_CONNECTIONS 165max_user_connections 162MEDIUMBLOB 29MEDIUMINT 27MEDIUMTEXT 27MEMORY 20metadata 190MICROSECOND 102MIN 110MINUTE 102MOD 100MODIFIES SQL DATA 235MODIFY 69MONTH 102MONTHNAME 102moveToCurrentRow 308moveToInsertRow 308msqli_prepare 330mutating tables 277myini 15 21 157MyISAM 20MySQL

sous-programme 233mysql 10MySQL AB 3MySQL Administrator 349MySQL Manager 379MySQL Query Browser 359mysqlcolumns_priv 168mysqldb 159 167

4055_12_Indexfm Page 392 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

393

Index Apprendre SQL avec MySQL

mysqlhost 173mysqlprocs_priv 168mysqltables_priv 168mysqluser 153 159mysql_confh 343mysqli 327MYSQLI_ASSOC 332MYSQLI_BOTH 332mysqli_change_user 330mysqli_close 330mysqli_commit 331mysqli_connect 330mysqli_errno 338mysqli_error 338mysqli_fetch_array 332 333mysqli_fetch_assoc 333 334mysqli_fetch_field 342mysqli_fetch_object 333mysqli_fetch_row 333mysqli_free_result 334mysqli_insert_id 337mysqli_multi_query 339MYSQLI_NUM 332mysqli_num_fields 333 341mysqli_num_rows 334mysqli_query 332mysqli_rollback 331mysqli_select_db 330mysqli_stmt_bind_param 335mysqli_stmt_bind_result 335mysqli_stmt_close 336mysqli_stmt_errno 338mysqli_stmt_error 338mysqli_stmt_execute 330mysqli_stmt_fetch 330 336mysqli_stmt_free_result 333mysqli_stmt_result_metadata 343

N

NATURAL JOIN 140Navicat 374NEW 267next 302

NO SQL 235NOT 92

DETERMINISTIC 235EXISTS 139FOUND 249IN 134NULL 20 23

NOW 28 101 102NULL 20 38NULLIF 109NUMERIC 28NUMERIC_PRECISION 198NUMERIC_SCALE 198

O

OCT 101OCTET_LENGTH 101ODBC 290 294OLD 265ON DELETE

CASCADE 60SET NULL 60

ON UPDATECASCADE 60SET NULL 60

OPEN 245OR 93

REPLACE 176ORDER BY 48 55 89ORDINAL_POSITION 197 199OUTER JOIN 129

P

paquetage 244password 13PASSWORD() 154PERIOD_DIFF 102PHP 327phpMyAdmin 362PI() 99placeholder 279 336POSITION_IN_UNIQUE_CONSTRAINT 199

4055_12_Indexfm Page 393 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

394

copy Eacuteditions Eyrolles

POW 100PREPARE 279prepareCall 295 318prepared statement 278prepareStatement 295 316previous 304privilegravege 158PRIVILEGE_TYPE 202Proc_priv 169proceacutedure catalogueacutee 233Process_priv 163procs_priv 160 168production 4produit carteacutesien 119 141prompt 13 15

Q

QUICK 55quit 15

R

RADIANS 100RAISE 250RAND 100READS SQL DATA 235REAL 28reacutecursiviteacute 241REFERENCED_COLUMN_NAME 200REFERENCED_TABLE_NAME 200REFERENCED_TABLE_SCHEMA 200References_priv 163registerOutParameter 319relative 304releaseSavepoint 321RENAME 67

TO 67USER 154

REPEAT 220Repl_client_priv 163Repl_slave_priv 163REPLACE 54 62 97requecircte 83

RESIGNAL 250RESTRICT 34ResultSet 301ResultSetMetaData 313RETURNS 235REVERSE 98REVOKE 170

ALL PRIVILEGES 171ROLLBACK 228

TO SAVEPOINT 230root 153ROUND 100ROUTINE_COMMENT 201ROUTINE_DEFINITION 201ROUTINE_NAME 201Routine_name 169ROUTINE_SCHEMA 201ROUTINE_TYPE 201Routine_type 169ROUTINES 200row 2row trigger 265RPAD 98RTRIM 98 99

S

Savepoint 321savepoint

JDBC 321MYSQL 230

scheacutema 6SCHEMA_PRIVILEGES 194 202SCHEMATA 194SEC_TO_TIME 52 53 102SECOND 102SECURITY_TYPE 201SELECT 84

fonctions 95SELECT INTO 223Select_priv 160SEQUEL 1seacutequence 44 196

JDBC 311

4055_12_Indexfm Page 394 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

copy Eacuteditions Eyrolles

395

Index Apprendre SQL avec MySQL

SERIAL 28SET 29 47 107SET AUTOCOMMIT 228SET FOREIGN_KEY_CHECKS 75 77setAutoCommit 295setFetchDirection 304setMaxRows 297setNull 316setSavepoint 321setter methods 296SHOW 190

COLUMNS 204CREATE DATABASE 204CREATE TABLE 204CREATE VIEW 189DATABASES 204ENGINES 204ERRORS 204 239GRANTS 204GRANTS FOR 165INDEX 204PRIVILEGES 204TABLE STATUS 204TABLES 204TRIGGERS 204

Show_db_priv 161Show_view_priv 161Shutdown_priv 163SIGN 100silent 13SIN 100SINH 100skip-column-names 13SLEEP() 232SMALLINT 27SOUNDEX 98source 15sous-interrogation 133

dans le FROM 137synchroniseacutee 137

sous-programme 210SQL dynamique 278SQL SECURITY 235SQL_PATH 195

SQL2 1SQL3 1SQLEXCEPTION 250SQLException 322SQLSTATE 249SQLWARNING 249SQRT 100Statement 297STATISTICS 194STDDEV 110stored procedures 233stored routines 233STR_TO_DATE 53 102SUBDATE 102SUBSTR 98SUBTIME 102SUM 110SUPER 263 278Super_priv 163supportsSavepoints 315supportsTransactions 315SYSDATE 28 88 102

T

table 2 19dominante 128fils 56key preserved 184pegravere 56subordonneacutee 128TEMPORARY 19

TABLE_COLLATION 196TABLE_COMMENT 196TABLE_CONSTRAINTS 194 198TABLE_NAME 193Table_name 168Table_priv 168TABLE_PRIVILEGES 194 202TABLE_ROWS 196TABLE_SCHEMA 193 202TABLE_TYPE 195TABLES 195tables_priv 159 168

4055_12_Indexfm Page 395 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

Apprendre SQL avec MySQL Index

396

copy Eacuteditions Eyrolles

TAN 100tee 13 15TEMPORARY 19TEXT 27TIME 28 42 52 53 102TIME_FORMAT 53TIME_TO_SEC 53 103TIMEDIFF 103TIMESTAMP 28 103TIMESTAMPADD 103TIMESTAMPDIF 103TIMESTAMPDIFF 51TINYBLOB 29TINYINT 27TINYTEXT 27TO_DAYS 103TOAD 368transaction 227TRIGGER_CATALOG 273TRIGGER_NAME 272TRIGGER_SCHEMA 272TRIGGERS 272TRIM 99TRUE 218TRUNCATE 55 100

U

UNDO 249UNHEX 101UNION 116

ALL 116UNIX_TIMESTAMP 53 103UNSIGNED 28UNTIL 220UPDATE 47 54Update_priv 160updater methods 297updateRow 308UPPER 99USAGE 164USE 157use 15user 6 13 152

variables 215

USER_PRIVILEGES 194 201user-defined function 277USING 141UTC_DATE 103UTC_TIME 44 103UTC_TIMESTAMP 103

V

VALUES 54VARBINARY 27VARCHAR 26variable

session 215VARIANCE 110verbose 13version 13VERSION() 12vertical 13VIEW_DEFINITION 191VIEWS 194vue 175vue monotable 177

W

wasNull 319WEEKDAY 103WEEKOFYEAR 103WHERE 48 55WHILE 220WITH CHECK OPTION 176

X

xml 13 145

Y

YEAR 28

Z

ZEROFILL 28

4055_12_Indexfm Page 396 Jeudi 2 mars 2006 210 14 gt Apogee FrameMaker Noir

  • Table des matiegraveres
  • Remerciements
  • Avant-propos
    • Guide de lecture
      • Premiegravere partie SQL de base
      • Deuxiegraveme partie programmation proceacutedurale
      • Troisiegraveme partie langages et outils
      • Annexe
        • Typographie
        • Contact avec lrsquoauteur ndash Corrigeacutes des exercices
          • Introduction
            • SQL une norme un succegraves
            • Modegravele de donneacutees
              • Tables et donneacutees
              • Les cleacutes
                • MySQL
                  • Un peu drsquohistoire
                  • Offre du moment
                  • Licences
                  • Et la concurrence
                  • Notion de scheacutema (database)
                  • Notion drsquohocircte
                  • Aspects eacutetudieacutes
                    • Mise en oeuvre de MySQL (sous Windows)
                      • Installation
                      • Deacutesinstallation
                      • Reconfiguration
                        • Premiers pas
                          • Lrsquointerface de commande
                          • Creacuteation drsquoun utilisateur
                          • Connexion au serveur
                          • Veacuterification de la version
                          • Options de base
                          • Batch
                          • Votre prompt et vite
                          • Commandes de base
                              • Partie I SQL de base
                                • Chapitre 1 Deacutefinition des donneacutees
                                  • Tables relationnelles
                                    • Creacuteation drsquoune table (CREATE TABLE)
                                    • Deacutelimiteurs
                                    • Sensibiliteacute agrave la casse
                                    • Commentaires
                                    • Premier exemple
                                    • Contraintes
                                    • Conventions recommandeacutees
                                    • Types des colonnes
                                    • Structure drsquoune table (DESCRIBE)
                                    • Restrictions
                                      • Index
                                        • Arbres balanceacutes
                                        • Creacuteation drsquoun index (CREATE INDEX)
                                        • Bilan
                                          • Destruction drsquoun scheacutema
                                            • Suppression drsquoune table (DROP TABLE)
                                            • Ordre des suppressions
                                              • Exercices
                                                • Chapitre 2 Manipulation des donneacutees
                                                  • Insertions drsquoenregistrements (INSERT)
                                                    • Syntaxe
                                                    • Renseigner toutes les colonnes
                                                    • Renseigner certaines colonnes
                                                    • Plusieurs enregistrements
                                                    • Ne pas respecter des contraintes
                                                    • Donneacutees binaires
                                                    • Eacutenumeacuterations
                                                    • Dates et heures
                                                      • Seacutequences
                                                        • Utilisation en tant que cleacute primaire
                                                        • Modification drsquoune seacutequence
                                                        • Utilisation en tant que cleacute eacutetrangegravere
                                                          • Modifications de colonnes
                                                            • Syntaxe (UPDATE)
                                                            • Modification drsquoune colonne
                                                            • Modification de plusieurs colonnes
                                                            • Modification de plusieurs enregistrements
                                                            • Ne pas respecter les contraintes
                                                            • Restrictions
                                                            • Dates et intervalles
                                                              • Remplacement drsquoun enregistrement
                                                              • Suppressions drsquoenregistrements
                                                                • Instruction DELETE
                                                                • Instruction TRUNCATE
                                                                  • Inteacutegriteacute reacutefeacuterentielle
                                                                    • Syntaxe
                                                                    • Coheacuterences assureacutees
                                                                    • Contraintes cocircteacute laquo pegravere raquo
                                                                    • Contraintes cocircteacute laquo fils raquo
                                                                    • Cleacutes composites et nulles
                                                                    • Coheacuterence du fils vers le pegravere
                                                                    • Coheacuterence du pegravere vers le fils
                                                                    • En reacutesumeacute
                                                                      • Insertions agrave partir drsquoun fichier
                                                                      • Exercices
                                                                        • Chapitre 3 Eacutevolution drsquoun scheacutema
                                                                          • Renommer une table (RENAME)
                                                                          • Modifications structurelles (ALTER TABLE)
                                                                            • Ajout de colonnes
                                                                            • Renommer des colonnes
                                                                            • Modifier le type des colonnes
                                                                            • Valeurs par deacutefaut
                                                                            • Supprimer des colonnes
                                                                              • Modifications comportementales
                                                                                • Ajout de contraintes
                                                                                • Suppression de contraintes
                                                                                • Deacutesactivation des contraintes
                                                                                • Reacuteactivation des contraintes
                                                                                • Contraintes diffeacutereacutees
                                                                                  • Exercices
                                                                                    • Chapitre 4 Interrogation des donneacutees
                                                                                      • Geacuteneacuteraliteacutes
                                                                                        • Syntaxe (SELECT)
                                                                                        • Pseudotable
                                                                                          • Projection (eacuteleacutements du SELECT)
                                                                                            • Extraction de toutes les colonnes
                                                                                            • Extraction de certaines colonnes
                                                                                            • Alias
                                                                                            • Duplicatas
                                                                                            • Expressions et valeurs nulles
                                                                                            • Ordonnancement
                                                                                            • Concateacutenation
                                                                                            • Insertion multiligne
                                                                                            • Limitation du nombre de lignes
                                                                                              • Restriction (WHERE)
                                                                                                • Opeacuterateurs de comparaison
                                                                                                • Opeacuterateurs logiques
                                                                                                • Opeacuterateurs inteacutegreacutes
                                                                                                • Alias
                                                                                                  • Fonctions
                                                                                                    • Caractegraveres
                                                                                                    • Numeacuteriques
                                                                                                    • Fonction pour les bits
                                                                                                    • Dates
                                                                                                    • Conversions
                                                                                                    • Comparaisons
                                                                                                    • Eacutenumeacuterations
                                                                                                    • Autres fonctions
                                                                                                      • Regroupements
                                                                                                        • Fonctions de groupe
                                                                                                        • Eacutetude du GROUP BY et HAVING
                                                                                                          • Opeacuterateurs ensemblistes
                                                                                                            • Restrictions
                                                                                                            • Exemple
                                                                                                            • Intersection
                                                                                                            • Opeacuterateurs UNION et UNION ALL
                                                                                                            • Diffeacuterence
                                                                                                            • Ordonner les reacutesultats
                                                                                                            • Produit carteacutesien
                                                                                                            • Bilan
                                                                                                              • Jointures
                                                                                                                • Classification
                                                                                                                • Jointure relationnelle
                                                                                                                • Jointures SQL2
                                                                                                                • Types de jointures
                                                                                                                • Eacutequijointure
                                                                                                                • Autojointure
                                                                                                                • Ineacutequijointure
                                                                                                                • Jointures externes
                                                                                                                • Jointures proceacutedurales
                                                                                                                • Jointures mixtes
                                                                                                                • Sous-interrogations synchroniseacutees
                                                                                                                • Autres directives SQL2
                                                                                                                  • Division
                                                                                                                    • Deacutefinition
                                                                                                                    • Classification
                                                                                                                    • Division inexacte
                                                                                                                    • Division exacte
                                                                                                                      • Reacutesulats en HTML ou XML
                                                                                                                      • Eacutecriture dans un fichier
                                                                                                                      • Exercices
                                                                                                                        • Chapitre 5 Controcircle des donneacutees
                                                                                                                        • Gestion des utilisateurs
                                                                                                                          • Classification
                                                                                                                          • Creacuteation drsquoun utilisateur (CREATE USER)
                                                                                                                          • Modification drsquoun utilisateur
                                                                                                                          • Renommer un utilisateur (RENAME USER)
                                                                                                                          • Suppression drsquoun utilisateur (DROP USER)
                                                                                                                            • Gestion des bases de donneacutees
                                                                                                                              • Creacuteation drsquoune base (CREATE DATABASE)
                                                                                                                              • Seacutelection drsquoune base de donneacutees (USE)
                                                                                                                              • Modification drsquoune base (ALTER DATABASE)
                                                                                                                              • Suppression drsquoune base (DROP DATABASE)
                                                                                                                                • Privilegraveges
                                                                                                                                  • Niveaux de privilegraveges
                                                                                                                                  • Tables de la base mysql
                                                                                                                                  • Table mysqluser
                                                                                                                                  • Attribution de privilegraveges (GRANT)
                                                                                                                                  • Table mysqldb
                                                                                                                                  • Table mysqlhost
                                                                                                                                  • Table mysqltables_priv
                                                                                                                                  • Table mysqlcolumns_priv
                                                                                                                                  • Table mysqlprocs_priv
                                                                                                                                  • Reacutevocation de privilegraveges (REVOKE)
                                                                                                                                  • Attributions et reacutevocations laquo sauvages raquo
                                                                                                                                    • Accegraves distants
                                                                                                                                      • Connexion par lrsquointerface de commande
                                                                                                                                      • Table mysqlhost
                                                                                                                                        • Vues
                                                                                                                                          • Creacuteation drsquoune vue (CREATE VIEW)
                                                                                                                                          • Classification
                                                                                                                                          • Vues monotables
                                                                                                                                          • Vues complexes
                                                                                                                                          • Autres utilisations de vues
                                                                                                                                          • Transmission de droits
                                                                                                                                          • Modification drsquoune vue (ALTER VIEW)
                                                                                                                                          • Visualisation drsquoune vue (SHOW CREATE VIEW)
                                                                                                                                          • Suppression drsquoune vue (DROP VIEW)
                                                                                                                                            • Dictionnaire des donneacutees
                                                                                                                                              • Constitution
                                                                                                                                              • Modegravele graphique du dictionnaire des donneacutees
                                                                                                                                              • Deacutemarche agrave suivre
                                                                                                                                              • Classification des vues
                                                                                                                                              • Bases de donneacutees du serveur
                                                                                                                                              • Composition drsquoune base
                                                                                                                                              • Deacutetail de stockage drsquoune base
                                                                                                                                              • Structure drsquoune table
                                                                                                                                              • Recherche des contraintes drsquoune table
                                                                                                                                              • Composition des contraintes drsquoune table
                                                                                                                                              • Recherche du code source drsquoun sous-programme
                                                                                                                                              • Privilegraveges des utilisateurs drsquoune base de donneacutees
                                                                                                                                              • Commande SHOW
                                                                                                                                                • Exercices
                                                                                                                                                  • Partie II Programmation proceacutedurale
                                                                                                                                                    • Chapitre 6 Bases du langage de programmation
                                                                                                                                                      • Geacuteneacuteraliteacutes
                                                                                                                                                        • Environnement client-serveur
                                                                                                                                                        • Avantages
                                                                                                                                                        • Structure drsquoun bloc
                                                                                                                                                        • Porteacutee des objets
                                                                                                                                                        • Casse et lisibiliteacute
                                                                                                                                                        • Identificateurs
                                                                                                                                                        • Commentaires
                                                                                                                                                          • Variables
                                                                                                                                                            • Variables scalaires
                                                                                                                                                            • Affectations
                                                                                                                                                            • Restrictions
                                                                                                                                                            • Reacutesolution de noms
                                                                                                                                                            • Opeacuterateurs
                                                                                                                                                            • Variables de session
                                                                                                                                                            • Conventions recommandeacutees
                                                                                                                                                              • Test des exemples
                                                                                                                                                              • Structures de controcircle
                                                                                                                                                                • Structures conditionnelles
                                                                                                                                                                • Structures reacutepeacutetitives
                                                                                                                                                                  • Interactions avec la base
                                                                                                                                                                    • Extraire des donneacutees
                                                                                                                                                                    • Manipuler des donneacutees
                                                                                                                                                                      • Transactions
                                                                                                                                                                        • Caracteacuteristiques
                                                                                                                                                                        • Deacutebut et fin drsquoune transaction
                                                                                                                                                                        • Mode de validation
                                                                                                                                                                        • Votre premiegravere transaction
                                                                                                                                                                        • Controcircle des transactions
                                                                                                                                                                        • Transactions imbriqueacutees
                                                                                                                                                                          • Exercices
                                                                                                                                                                            • Chapitre 7 Programmation avanceacutee
                                                                                                                                                                              • Sous-programmes
                                                                                                                                                                                • Geacuteneacuteraliteacutes
                                                                                                                                                                                • Proceacutedures catalogueacutees
                                                                                                                                                                                • Fonctions catalogueacutees
                                                                                                                                                                                • Structure drsquoun sous-programme
                                                                                                                                                                                • Exemples
                                                                                                                                                                                • Fonction nrsquointeragissant pas avec la base
                                                                                                                                                                                • Compilation
                                                                                                                                                                                • Appel drsquoun sous-programme
                                                                                                                                                                                • Reacutecursiviteacute
                                                                                                                                                                                • Sous-programmes imbriqueacutes
                                                                                                                                                                                • Modification drsquoun sous-programme
                                                                                                                                                                                • Destruction drsquoun sous-programme
                                                                                                                                                                                • Restrictions
                                                                                                                                                                                  • Curseurs
                                                                                                                                                                                    • Geacuteneacuteraliteacutes
                                                                                                                                                                                    • Instructions
                                                                                                                                                                                    • Parcours drsquoun curseur
                                                                                                                                                                                    • Accegraves concurrents (FOR UPDATE)
                                                                                                                                                                                    • Restrictions
                                                                                                                                                                                      • Exceptions
                                                                                                                                                                                        • Geacuteneacuteraliteacutes
                                                                                                                                                                                        • Restrictions
                                                                                                                                                                                        • Exceptions avec EXIT
                                                                                                                                                                                        • Exceptions avec CONTINUE
                                                                                                                                                                                        • Gestion des autres erreurs (SQLEXCEPTION)
                                                                                                                                                                                        • Mecircme erreur sur diffeacuterentes instructions
                                                                                                                                                                                        • Exceptions nommeacutees
                                                                                                                                                                                          • Deacuteclencheurs
                                                                                                                                                                                            • Geacuteneacuteraliteacutes
                                                                                                                                                                                            • Agrave quoi sert un deacuteclencheur
                                                                                                                                                                                            • Meacutecanisme geacuteneacuteral
                                                                                                                                                                                            • Syntaxe
                                                                                                                                                                                            • Deacuteclencheurs LMD (de lignes)
                                                                                                                                                                                            • Appel de sous-programmes
                                                                                                                                                                                            • Dictionnaire des donneacutees
                                                                                                                                                                                            • Programmation drsquoune contrainte de veacuterification
                                                                                                                                                                                            • Invalidation dans le deacuteclencheur
                                                                                                                                                                                            • Tables mutantes
                                                                                                                                                                                            • Restrictions
                                                                                                                                                                                            • Suppression drsquoun deacuteclencheur
                                                                                                                                                                                              • SQL dynamique
                                                                                                                                                                                                • Syntaxe
                                                                                                                                                                                                • Exemples
                                                                                                                                                                                                • Restrictions
                                                                                                                                                                                                  • Exercices
                                                                                                                                                                                                      • Partie III Langages et outils
                                                                                                                                                                                                        • Chapitre 8 Utilisation avec Java
                                                                                                                                                                                                          • JDBC avec ConnectorJ
                                                                                                                                                                                                            • Classification des pilotes (drivers)
                                                                                                                                                                                                            • Le paquetage javasql
                                                                                                                                                                                                            • Structure drsquoun programme
                                                                                                                                                                                                            • Test de votre configuration
                                                                                                                                                                                                              • Connexion agrave une base
                                                                                                                                                                                                                • Base Access
                                                                                                                                                                                                                • Base MySQL
                                                                                                                                                                                                                • Interface Connection
                                                                                                                                                                                                                  • Eacutetats drsquoune connexion
                                                                                                                                                                                                                    • Interfaces disponibles
                                                                                                                                                                                                                    • Meacutethodes geacuteneacuteriques pour les paramegravetres
                                                                                                                                                                                                                    • Eacutetats simples (interface Statement)
                                                                                                                                                                                                                    • Meacutethodes agrave utiliser
                                                                                                                                                                                                                      • Correspondances de types
                                                                                                                                                                                                                      • Manipulations avec la base
                                                                                                                                                                                                                        • Suppression de donneacutees
                                                                                                                                                                                                                        • Ajout drsquoenregistrements
                                                                                                                                                                                                                        • Modification drsquoenregistrements
                                                                                                                                                                                                                          • Extraction de donneacutees
                                                                                                                                                                                                                            • Curseurs statiques
                                                                                                                                                                                                                            • Curseurs navigables
                                                                                                                                                                                                                              • Curseurs modifiables
                                                                                                                                                                                                                                • Suppressions
                                                                                                                                                                                                                                • Modifications
                                                                                                                                                                                                                                • Insertions
                                                                                                                                                                                                                                  • Gestion des seacutequences
                                                                                                                                                                                                                                    • Meacutethode getGeneratedKeys
                                                                                                                                                                                                                                    • Curseur modifiable
                                                                                                                                                                                                                                      • Interface ResultSetMetaData
                                                                                                                                                                                                                                      • Interface DatabaseMetaData
                                                                                                                                                                                                                                      • Instructions parameacutetreacutees (PreparedStatement)
                                                                                                                                                                                                                                        • Extraction de donneacutees (executeQuery)
                                                                                                                                                                                                                                        • Mises agrave jour (executeUpdate)
                                                                                                                                                                                                                                        • Instruction LDD (execute)
                                                                                                                                                                                                                                          • Proceacutedures catalogueacutees
                                                                                                                                                                                                                                            • Exemple
                                                                                                                                                                                                                                              • Transactions
                                                                                                                                                                                                                                                • Points de validation
                                                                                                                                                                                                                                                  • Traitement des exceptions
                                                                                                                                                                                                                                                    • Affichage des erreurs
                                                                                                                                                                                                                                                    • Traitement des erreurs
                                                                                                                                                                                                                                                      • Exercices
                                                                                                                                                                                                                                                        • Chapitre 9 Utilisation avec PHP
                                                                                                                                                                                                                                                          • Configuration adopteacutee
                                                                                                                                                                                                                                                            • Logiciels
                                                                                                                                                                                                                                                            • Fichiers de configuration
                                                                                                                                                                                                                                                            • Test drsquoApache et de PHP
                                                                                                                                                                                                                                                            • Test drsquoApache de PHP et de MySQL
                                                                                                                                                                                                                                                              • API de PHP pour MySQL
                                                                                                                                                                                                                                                                • Connexion
                                                                                                                                                                                                                                                                • Interactions avec la base
                                                                                                                                                                                                                                                                • Extractions
                                                                                                                                                                                                                                                                • Instructions parameacutetreacutees
                                                                                                                                                                                                                                                                • Gestion des seacutequences
                                                                                                                                                                                                                                                                • Traitement des erreurs
                                                                                                                                                                                                                                                                • Proceacutedures catalogueacutees
                                                                                                                                                                                                                                                                • Meacutetadonneacutees
                                                                                                                                                                                                                                                                  • Exercices
                                                                                                                                                                                                                                                                    • Chapitre 10 Outils graphiques
                                                                                                                                                                                                                                                                      • MySQL Administrator
                                                                                                                                                                                                                                                                        • Connexion
                                                                                                                                                                                                                                                                        • Connexion nommeacutee
                                                                                                                                                                                                                                                                        • Liste des accegraves utilisateur
                                                                                                                                                                                                                                                                        • Gestion des privilegraveges
                                                                                                                                                                                                                                                                        • Caracteacuteristiques systegraveme
                                                                                                                                                                                                                                                                        • Options scripts SQL
                                                                                                                                                                                                                                                                        • Composition drsquoune base
                                                                                                                                                                                                                                                                        • Composition drsquoune table
                                                                                                                                                                                                                                                                        • Composition des index
                                                                                                                                                                                                                                                                        • Modification drsquoun scheacutema
                                                                                                                                                                                                                                                                        • Restriction
                                                                                                                                                                                                                                                                          • MySQL Query Browser
                                                                                                                                                                                                                                                                            • Fenecirctre principale
                                                                                                                                                                                                                                                                            • Extraction
                                                                                                                                                                                                                                                                            • Modification
                                                                                                                                                                                                                                                                              • phpMyAdmin
                                                                                                                                                                                                                                                                                • Composition de la base
                                                                                                                                                                                                                                                                                • Structure drsquoune table
                                                                                                                                                                                                                                                                                • Administrer une table
                                                                                                                                                                                                                                                                                • Extractions
                                                                                                                                                                                                                                                                                • Rechercher
                                                                                                                                                                                                                                                                                • Exporter
                                                                                                                                                                                                                                                                                • Utilisateurs
                                                                                                                                                                                                                                                                                  • TOAD for MySQL
                                                                                                                                                                                                                                                                                    • Administration
                                                                                                                                                                                                                                                                                    • Instructions en ligne
                                                                                                                                                                                                                                                                                    • Deacuteveloppement
                                                                                                                                                                                                                                                                                    • Creacuteation drsquoobjets
                                                                                                                                                                                                                                                                                    • Recherche drsquoobjets
                                                                                                                                                                                                                                                                                    • Exportations
                                                                                                                                                                                                                                                                                      • Navicat
                                                                                                                                                                                                                                                                                        • Creacuteation drsquoune table
                                                                                                                                                                                                                                                                                        • Deacutefinition drsquoune contrainte
                                                                                                                                                                                                                                                                                        • Creacuteation drsquoune requecircte
                                                                                                                                                                                                                                                                                        • Importation
                                                                                                                                                                                                                                                                                        • Gestion des utilisateurs
                                                                                                                                                                                                                                                                                          • MySQL Manager
                                                                                                                                                                                                                                                                                            • Creacuteation drsquoune table
                                                                                                                                                                                                                                                                                            • Creacuteation drsquoune requecircte
                                                                                                                                                                                                                                                                                            • Proceacutedures catalogueacutees
                                                                                                                                                                                                                                                                                            • Gestion des utilisateurs
                                                                                                                                                                                                                                                                                            • Gestion des privilegraveges
                                                                                                                                                                                                                                                                                              • Bilan
                                                                                                                                                                                                                                                                                                  • Annexe Bibliographie et webographie
                                                                                                                                                                                                                                                                                                  • Index
Page 4: CHEZ LE MÊME ÉDITEUR
Page 5: CHEZ LE MÊME ÉDITEUR
Page 6: CHEZ LE MÊME ÉDITEUR
Page 7: CHEZ LE MÊME ÉDITEUR
Page 8: CHEZ LE MÊME ÉDITEUR
Page 9: CHEZ LE MÊME ÉDITEUR
Page 10: CHEZ LE MÊME ÉDITEUR
Page 11: CHEZ LE MÊME ÉDITEUR
Page 12: CHEZ LE MÊME ÉDITEUR
Page 13: CHEZ LE MÊME ÉDITEUR
Page 14: CHEZ LE MÊME ÉDITEUR
Page 15: CHEZ LE MÊME ÉDITEUR
Page 16: CHEZ LE MÊME ÉDITEUR
Page 17: CHEZ LE MÊME ÉDITEUR
Page 18: CHEZ LE MÊME ÉDITEUR
Page 19: CHEZ LE MÊME ÉDITEUR
Page 20: CHEZ LE MÊME ÉDITEUR
Page 21: CHEZ LE MÊME ÉDITEUR
Page 22: CHEZ LE MÊME ÉDITEUR
Page 23: CHEZ LE MÊME ÉDITEUR
Page 24: CHEZ LE MÊME ÉDITEUR
Page 25: CHEZ LE MÊME ÉDITEUR
Page 26: CHEZ LE MÊME ÉDITEUR
Page 27: CHEZ LE MÊME ÉDITEUR
Page 28: CHEZ LE MÊME ÉDITEUR
Page 29: CHEZ LE MÊME ÉDITEUR
Page 30: CHEZ LE MÊME ÉDITEUR
Page 31: CHEZ LE MÊME ÉDITEUR
Page 32: CHEZ LE MÊME ÉDITEUR
Page 33: CHEZ LE MÊME ÉDITEUR
Page 34: CHEZ LE MÊME ÉDITEUR
Page 35: CHEZ LE MÊME ÉDITEUR
Page 36: CHEZ LE MÊME ÉDITEUR
Page 37: CHEZ LE MÊME ÉDITEUR
Page 38: CHEZ LE MÊME ÉDITEUR
Page 39: CHEZ LE MÊME ÉDITEUR
Page 40: CHEZ LE MÊME ÉDITEUR
Page 41: CHEZ LE MÊME ÉDITEUR
Page 42: CHEZ LE MÊME ÉDITEUR
Page 43: CHEZ LE MÊME ÉDITEUR
Page 44: CHEZ LE MÊME ÉDITEUR
Page 45: CHEZ LE MÊME ÉDITEUR
Page 46: CHEZ LE MÊME ÉDITEUR
Page 47: CHEZ LE MÊME ÉDITEUR
Page 48: CHEZ LE MÊME ÉDITEUR
Page 49: CHEZ LE MÊME ÉDITEUR
Page 50: CHEZ LE MÊME ÉDITEUR
Page 51: CHEZ LE MÊME ÉDITEUR
Page 52: CHEZ LE MÊME ÉDITEUR
Page 53: CHEZ LE MÊME ÉDITEUR
Page 54: CHEZ LE MÊME ÉDITEUR
Page 55: CHEZ LE MÊME ÉDITEUR
Page 56: CHEZ LE MÊME ÉDITEUR
Page 57: CHEZ LE MÊME ÉDITEUR
Page 58: CHEZ LE MÊME ÉDITEUR
Page 59: CHEZ LE MÊME ÉDITEUR
Page 60: CHEZ LE MÊME ÉDITEUR
Page 61: CHEZ LE MÊME ÉDITEUR
Page 62: CHEZ LE MÊME ÉDITEUR
Page 63: CHEZ LE MÊME ÉDITEUR
Page 64: CHEZ LE MÊME ÉDITEUR
Page 65: CHEZ LE MÊME ÉDITEUR
Page 66: CHEZ LE MÊME ÉDITEUR
Page 67: CHEZ LE MÊME ÉDITEUR
Page 68: CHEZ LE MÊME ÉDITEUR
Page 69: CHEZ LE MÊME ÉDITEUR
Page 70: CHEZ LE MÊME ÉDITEUR
Page 71: CHEZ LE MÊME ÉDITEUR
Page 72: CHEZ LE MÊME ÉDITEUR
Page 73: CHEZ LE MÊME ÉDITEUR
Page 74: CHEZ LE MÊME ÉDITEUR
Page 75: CHEZ LE MÊME ÉDITEUR
Page 76: CHEZ LE MÊME ÉDITEUR
Page 77: CHEZ LE MÊME ÉDITEUR
Page 78: CHEZ LE MÊME ÉDITEUR
Page 79: CHEZ LE MÊME ÉDITEUR
Page 80: CHEZ LE MÊME ÉDITEUR
Page 81: CHEZ LE MÊME ÉDITEUR
Page 82: CHEZ LE MÊME ÉDITEUR
Page 83: CHEZ LE MÊME ÉDITEUR
Page 84: CHEZ LE MÊME ÉDITEUR
Page 85: CHEZ LE MÊME ÉDITEUR
Page 86: CHEZ LE MÊME ÉDITEUR
Page 87: CHEZ LE MÊME ÉDITEUR
Page 88: CHEZ LE MÊME ÉDITEUR
Page 89: CHEZ LE MÊME ÉDITEUR
Page 90: CHEZ LE MÊME ÉDITEUR
Page 91: CHEZ LE MÊME ÉDITEUR
Page 92: CHEZ LE MÊME ÉDITEUR
Page 93: CHEZ LE MÊME ÉDITEUR
Page 94: CHEZ LE MÊME ÉDITEUR
Page 95: CHEZ LE MÊME ÉDITEUR
Page 96: CHEZ LE MÊME ÉDITEUR
Page 97: CHEZ LE MÊME ÉDITEUR
Page 98: CHEZ LE MÊME ÉDITEUR
Page 99: CHEZ LE MÊME ÉDITEUR
Page 100: CHEZ LE MÊME ÉDITEUR
Page 101: CHEZ LE MÊME ÉDITEUR
Page 102: CHEZ LE MÊME ÉDITEUR
Page 103: CHEZ LE MÊME ÉDITEUR
Page 104: CHEZ LE MÊME ÉDITEUR
Page 105: CHEZ LE MÊME ÉDITEUR
Page 106: CHEZ LE MÊME ÉDITEUR
Page 107: CHEZ LE MÊME ÉDITEUR
Page 108: CHEZ LE MÊME ÉDITEUR
Page 109: CHEZ LE MÊME ÉDITEUR
Page 110: CHEZ LE MÊME ÉDITEUR
Page 111: CHEZ LE MÊME ÉDITEUR
Page 112: CHEZ LE MÊME ÉDITEUR
Page 113: CHEZ LE MÊME ÉDITEUR
Page 114: CHEZ LE MÊME ÉDITEUR
Page 115: CHEZ LE MÊME ÉDITEUR
Page 116: CHEZ LE MÊME ÉDITEUR
Page 117: CHEZ LE MÊME ÉDITEUR
Page 118: CHEZ LE MÊME ÉDITEUR
Page 119: CHEZ LE MÊME ÉDITEUR
Page 120: CHEZ LE MÊME ÉDITEUR
Page 121: CHEZ LE MÊME ÉDITEUR
Page 122: CHEZ LE MÊME ÉDITEUR
Page 123: CHEZ LE MÊME ÉDITEUR
Page 124: CHEZ LE MÊME ÉDITEUR
Page 125: CHEZ LE MÊME ÉDITEUR
Page 126: CHEZ LE MÊME ÉDITEUR
Page 127: CHEZ LE MÊME ÉDITEUR
Page 128: CHEZ LE MÊME ÉDITEUR
Page 129: CHEZ LE MÊME ÉDITEUR
Page 130: CHEZ LE MÊME ÉDITEUR
Page 131: CHEZ LE MÊME ÉDITEUR
Page 132: CHEZ LE MÊME ÉDITEUR
Page 133: CHEZ LE MÊME ÉDITEUR
Page 134: CHEZ LE MÊME ÉDITEUR
Page 135: CHEZ LE MÊME ÉDITEUR
Page 136: CHEZ LE MÊME ÉDITEUR
Page 137: CHEZ LE MÊME ÉDITEUR
Page 138: CHEZ LE MÊME ÉDITEUR
Page 139: CHEZ LE MÊME ÉDITEUR
Page 140: CHEZ LE MÊME ÉDITEUR
Page 141: CHEZ LE MÊME ÉDITEUR
Page 142: CHEZ LE MÊME ÉDITEUR
Page 143: CHEZ LE MÊME ÉDITEUR
Page 144: CHEZ LE MÊME ÉDITEUR
Page 145: CHEZ LE MÊME ÉDITEUR
Page 146: CHEZ LE MÊME ÉDITEUR
Page 147: CHEZ LE MÊME ÉDITEUR
Page 148: CHEZ LE MÊME ÉDITEUR
Page 149: CHEZ LE MÊME ÉDITEUR
Page 150: CHEZ LE MÊME ÉDITEUR
Page 151: CHEZ LE MÊME ÉDITEUR
Page 152: CHEZ LE MÊME ÉDITEUR
Page 153: CHEZ LE MÊME ÉDITEUR
Page 154: CHEZ LE MÊME ÉDITEUR
Page 155: CHEZ LE MÊME ÉDITEUR
Page 156: CHEZ LE MÊME ÉDITEUR
Page 157: CHEZ LE MÊME ÉDITEUR
Page 158: CHEZ LE MÊME ÉDITEUR
Page 159: CHEZ LE MÊME ÉDITEUR
Page 160: CHEZ LE MÊME ÉDITEUR
Page 161: CHEZ LE MÊME ÉDITEUR
Page 162: CHEZ LE MÊME ÉDITEUR
Page 163: CHEZ LE MÊME ÉDITEUR
Page 164: CHEZ LE MÊME ÉDITEUR
Page 165: CHEZ LE MÊME ÉDITEUR
Page 166: CHEZ LE MÊME ÉDITEUR
Page 167: CHEZ LE MÊME ÉDITEUR
Page 168: CHEZ LE MÊME ÉDITEUR
Page 169: CHEZ LE MÊME ÉDITEUR
Page 170: CHEZ LE MÊME ÉDITEUR
Page 171: CHEZ LE MÊME ÉDITEUR
Page 172: CHEZ LE MÊME ÉDITEUR
Page 173: CHEZ LE MÊME ÉDITEUR
Page 174: CHEZ LE MÊME ÉDITEUR
Page 175: CHEZ LE MÊME ÉDITEUR
Page 176: CHEZ LE MÊME ÉDITEUR
Page 177: CHEZ LE MÊME ÉDITEUR
Page 178: CHEZ LE MÊME ÉDITEUR
Page 179: CHEZ LE MÊME ÉDITEUR
Page 180: CHEZ LE MÊME ÉDITEUR
Page 181: CHEZ LE MÊME ÉDITEUR
Page 182: CHEZ LE MÊME ÉDITEUR
Page 183: CHEZ LE MÊME ÉDITEUR
Page 184: CHEZ LE MÊME ÉDITEUR
Page 185: CHEZ LE MÊME ÉDITEUR
Page 186: CHEZ LE MÊME ÉDITEUR
Page 187: CHEZ LE MÊME ÉDITEUR
Page 188: CHEZ LE MÊME ÉDITEUR
Page 189: CHEZ LE MÊME ÉDITEUR
Page 190: CHEZ LE MÊME ÉDITEUR
Page 191: CHEZ LE MÊME ÉDITEUR
Page 192: CHEZ LE MÊME ÉDITEUR
Page 193: CHEZ LE MÊME ÉDITEUR
Page 194: CHEZ LE MÊME ÉDITEUR
Page 195: CHEZ LE MÊME ÉDITEUR
Page 196: CHEZ LE MÊME ÉDITEUR
Page 197: CHEZ LE MÊME ÉDITEUR
Page 198: CHEZ LE MÊME ÉDITEUR
Page 199: CHEZ LE MÊME ÉDITEUR
Page 200: CHEZ LE MÊME ÉDITEUR
Page 201: CHEZ LE MÊME ÉDITEUR
Page 202: CHEZ LE MÊME ÉDITEUR
Page 203: CHEZ LE MÊME ÉDITEUR
Page 204: CHEZ LE MÊME ÉDITEUR
Page 205: CHEZ LE MÊME ÉDITEUR
Page 206: CHEZ LE MÊME ÉDITEUR
Page 207: CHEZ LE MÊME ÉDITEUR
Page 208: CHEZ LE MÊME ÉDITEUR
Page 209: CHEZ LE MÊME ÉDITEUR
Page 210: CHEZ LE MÊME ÉDITEUR
Page 211: CHEZ LE MÊME ÉDITEUR
Page 212: CHEZ LE MÊME ÉDITEUR
Page 213: CHEZ LE MÊME ÉDITEUR
Page 214: CHEZ LE MÊME ÉDITEUR
Page 215: CHEZ LE MÊME ÉDITEUR
Page 216: CHEZ LE MÊME ÉDITEUR
Page 217: CHEZ LE MÊME ÉDITEUR
Page 218: CHEZ LE MÊME ÉDITEUR
Page 219: CHEZ LE MÊME ÉDITEUR
Page 220: CHEZ LE MÊME ÉDITEUR
Page 221: CHEZ LE MÊME ÉDITEUR
Page 222: CHEZ LE MÊME ÉDITEUR
Page 223: CHEZ LE MÊME ÉDITEUR
Page 224: CHEZ LE MÊME ÉDITEUR
Page 225: CHEZ LE MÊME ÉDITEUR
Page 226: CHEZ LE MÊME ÉDITEUR
Page 227: CHEZ LE MÊME ÉDITEUR
Page 228: CHEZ LE MÊME ÉDITEUR
Page 229: CHEZ LE MÊME ÉDITEUR
Page 230: CHEZ LE MÊME ÉDITEUR
Page 231: CHEZ LE MÊME ÉDITEUR
Page 232: CHEZ LE MÊME ÉDITEUR
Page 233: CHEZ LE MÊME ÉDITEUR
Page 234: CHEZ LE MÊME ÉDITEUR
Page 235: CHEZ LE MÊME ÉDITEUR
Page 236: CHEZ LE MÊME ÉDITEUR
Page 237: CHEZ LE MÊME ÉDITEUR
Page 238: CHEZ LE MÊME ÉDITEUR
Page 239: CHEZ LE MÊME ÉDITEUR
Page 240: CHEZ LE MÊME ÉDITEUR
Page 241: CHEZ LE MÊME ÉDITEUR
Page 242: CHEZ LE MÊME ÉDITEUR
Page 243: CHEZ LE MÊME ÉDITEUR
Page 244: CHEZ LE MÊME ÉDITEUR
Page 245: CHEZ LE MÊME ÉDITEUR
Page 246: CHEZ LE MÊME ÉDITEUR
Page 247: CHEZ LE MÊME ÉDITEUR
Page 248: CHEZ LE MÊME ÉDITEUR
Page 249: CHEZ LE MÊME ÉDITEUR
Page 250: CHEZ LE MÊME ÉDITEUR
Page 251: CHEZ LE MÊME ÉDITEUR
Page 252: CHEZ LE MÊME ÉDITEUR
Page 253: CHEZ LE MÊME ÉDITEUR
Page 254: CHEZ LE MÊME ÉDITEUR
Page 255: CHEZ LE MÊME ÉDITEUR
Page 256: CHEZ LE MÊME ÉDITEUR
Page 257: CHEZ LE MÊME ÉDITEUR
Page 258: CHEZ LE MÊME ÉDITEUR
Page 259: CHEZ LE MÊME ÉDITEUR
Page 260: CHEZ LE MÊME ÉDITEUR
Page 261: CHEZ LE MÊME ÉDITEUR
Page 262: CHEZ LE MÊME ÉDITEUR
Page 263: CHEZ LE MÊME ÉDITEUR
Page 264: CHEZ LE MÊME ÉDITEUR
Page 265: CHEZ LE MÊME ÉDITEUR
Page 266: CHEZ LE MÊME ÉDITEUR
Page 267: CHEZ LE MÊME ÉDITEUR
Page 268: CHEZ LE MÊME ÉDITEUR
Page 269: CHEZ LE MÊME ÉDITEUR
Page 270: CHEZ LE MÊME ÉDITEUR
Page 271: CHEZ LE MÊME ÉDITEUR
Page 272: CHEZ LE MÊME ÉDITEUR
Page 273: CHEZ LE MÊME ÉDITEUR
Page 274: CHEZ LE MÊME ÉDITEUR
Page 275: CHEZ LE MÊME ÉDITEUR
Page 276: CHEZ LE MÊME ÉDITEUR
Page 277: CHEZ LE MÊME ÉDITEUR
Page 278: CHEZ LE MÊME ÉDITEUR
Page 279: CHEZ LE MÊME ÉDITEUR
Page 280: CHEZ LE MÊME ÉDITEUR
Page 281: CHEZ LE MÊME ÉDITEUR
Page 282: CHEZ LE MÊME ÉDITEUR
Page 283: CHEZ LE MÊME ÉDITEUR
Page 284: CHEZ LE MÊME ÉDITEUR
Page 285: CHEZ LE MÊME ÉDITEUR
Page 286: CHEZ LE MÊME ÉDITEUR
Page 287: CHEZ LE MÊME ÉDITEUR
Page 288: CHEZ LE MÊME ÉDITEUR
Page 289: CHEZ LE MÊME ÉDITEUR
Page 290: CHEZ LE MÊME ÉDITEUR
Page 291: CHEZ LE MÊME ÉDITEUR
Page 292: CHEZ LE MÊME ÉDITEUR
Page 293: CHEZ LE MÊME ÉDITEUR
Page 294: CHEZ LE MÊME ÉDITEUR
Page 295: CHEZ LE MÊME ÉDITEUR
Page 296: CHEZ LE MÊME ÉDITEUR
Page 297: CHEZ LE MÊME ÉDITEUR
Page 298: CHEZ LE MÊME ÉDITEUR
Page 299: CHEZ LE MÊME ÉDITEUR
Page 300: CHEZ LE MÊME ÉDITEUR
Page 301: CHEZ LE MÊME ÉDITEUR
Page 302: CHEZ LE MÊME ÉDITEUR
Page 303: CHEZ LE MÊME ÉDITEUR
Page 304: CHEZ LE MÊME ÉDITEUR
Page 305: CHEZ LE MÊME ÉDITEUR
Page 306: CHEZ LE MÊME ÉDITEUR
Page 307: CHEZ LE MÊME ÉDITEUR
Page 308: CHEZ LE MÊME ÉDITEUR
Page 309: CHEZ LE MÊME ÉDITEUR
Page 310: CHEZ LE MÊME ÉDITEUR
Page 311: CHEZ LE MÊME ÉDITEUR
Page 312: CHEZ LE MÊME ÉDITEUR
Page 313: CHEZ LE MÊME ÉDITEUR
Page 314: CHEZ LE MÊME ÉDITEUR
Page 315: CHEZ LE MÊME ÉDITEUR
Page 316: CHEZ LE MÊME ÉDITEUR
Page 317: CHEZ LE MÊME ÉDITEUR
Page 318: CHEZ LE MÊME ÉDITEUR
Page 319: CHEZ LE MÊME ÉDITEUR
Page 320: CHEZ LE MÊME ÉDITEUR
Page 321: CHEZ LE MÊME ÉDITEUR
Page 322: CHEZ LE MÊME ÉDITEUR
Page 323: CHEZ LE MÊME ÉDITEUR
Page 324: CHEZ LE MÊME ÉDITEUR
Page 325: CHEZ LE MÊME ÉDITEUR
Page 326: CHEZ LE MÊME ÉDITEUR
Page 327: CHEZ LE MÊME ÉDITEUR
Page 328: CHEZ LE MÊME ÉDITEUR
Page 329: CHEZ LE MÊME ÉDITEUR
Page 330: CHEZ LE MÊME ÉDITEUR
Page 331: CHEZ LE MÊME ÉDITEUR
Page 332: CHEZ LE MÊME ÉDITEUR
Page 333: CHEZ LE MÊME ÉDITEUR
Page 334: CHEZ LE MÊME ÉDITEUR
Page 335: CHEZ LE MÊME ÉDITEUR
Page 336: CHEZ LE MÊME ÉDITEUR
Page 337: CHEZ LE MÊME ÉDITEUR
Page 338: CHEZ LE MÊME ÉDITEUR
Page 339: CHEZ LE MÊME ÉDITEUR
Page 340: CHEZ LE MÊME ÉDITEUR
Page 341: CHEZ LE MÊME ÉDITEUR
Page 342: CHEZ LE MÊME ÉDITEUR
Page 343: CHEZ LE MÊME ÉDITEUR
Page 344: CHEZ LE MÊME ÉDITEUR
Page 345: CHEZ LE MÊME ÉDITEUR
Page 346: CHEZ LE MÊME ÉDITEUR
Page 347: CHEZ LE MÊME ÉDITEUR
Page 348: CHEZ LE MÊME ÉDITEUR
Page 349: CHEZ LE MÊME ÉDITEUR
Page 350: CHEZ LE MÊME ÉDITEUR
Page 351: CHEZ LE MÊME ÉDITEUR
Page 352: CHEZ LE MÊME ÉDITEUR
Page 353: CHEZ LE MÊME ÉDITEUR
Page 354: CHEZ LE MÊME ÉDITEUR
Page 355: CHEZ LE MÊME ÉDITEUR
Page 356: CHEZ LE MÊME ÉDITEUR
Page 357: CHEZ LE MÊME ÉDITEUR
Page 358: CHEZ LE MÊME ÉDITEUR
Page 359: CHEZ LE MÊME ÉDITEUR
Page 360: CHEZ LE MÊME ÉDITEUR
Page 361: CHEZ LE MÊME ÉDITEUR
Page 362: CHEZ LE MÊME ÉDITEUR
Page 363: CHEZ LE MÊME ÉDITEUR
Page 364: CHEZ LE MÊME ÉDITEUR
Page 365: CHEZ LE MÊME ÉDITEUR
Page 366: CHEZ LE MÊME ÉDITEUR
Page 367: CHEZ LE MÊME ÉDITEUR
Page 368: CHEZ LE MÊME ÉDITEUR
Page 369: CHEZ LE MÊME ÉDITEUR
Page 370: CHEZ LE MÊME ÉDITEUR
Page 371: CHEZ LE MÊME ÉDITEUR
Page 372: CHEZ LE MÊME ÉDITEUR
Page 373: CHEZ LE MÊME ÉDITEUR
Page 374: CHEZ LE MÊME ÉDITEUR
Page 375: CHEZ LE MÊME ÉDITEUR
Page 376: CHEZ LE MÊME ÉDITEUR
Page 377: CHEZ LE MÊME ÉDITEUR
Page 378: CHEZ LE MÊME ÉDITEUR
Page 379: CHEZ LE MÊME ÉDITEUR
Page 380: CHEZ LE MÊME ÉDITEUR
Page 381: CHEZ LE MÊME ÉDITEUR
Page 382: CHEZ LE MÊME ÉDITEUR
Page 383: CHEZ LE MÊME ÉDITEUR
Page 384: CHEZ LE MÊME ÉDITEUR
Page 385: CHEZ LE MÊME ÉDITEUR
Page 386: CHEZ LE MÊME ÉDITEUR
Page 387: CHEZ LE MÊME ÉDITEUR
Page 388: CHEZ LE MÊME ÉDITEUR
Page 389: CHEZ LE MÊME ÉDITEUR
Page 390: CHEZ LE MÊME ÉDITEUR
Page 391: CHEZ LE MÊME ÉDITEUR
Page 392: CHEZ LE MÊME ÉDITEUR
Page 393: CHEZ LE MÊME ÉDITEUR
Page 394: CHEZ LE MÊME ÉDITEUR
Page 395: CHEZ LE MÊME ÉDITEUR
Page 396: CHEZ LE MÊME ÉDITEUR
Page 397: CHEZ LE MÊME ÉDITEUR
Page 398: CHEZ LE MÊME ÉDITEUR
Page 399: CHEZ LE MÊME ÉDITEUR
Page 400: CHEZ LE MÊME ÉDITEUR
Page 401: CHEZ LE MÊME ÉDITEUR
Page 402: CHEZ LE MÊME ÉDITEUR
Page 403: CHEZ LE MÊME ÉDITEUR
Page 404: CHEZ LE MÊME ÉDITEUR
Page 405: CHEZ LE MÊME ÉDITEUR
Page 406: CHEZ LE MÊME ÉDITEUR
Page 407: CHEZ LE MÊME ÉDITEUR
Page 408: CHEZ LE MÊME ÉDITEUR
Page 409: CHEZ LE MÊME ÉDITEUR
Page 410: CHEZ LE MÊME ÉDITEUR
Page 411: CHEZ LE MÊME ÉDITEUR
Page 412: CHEZ LE MÊME ÉDITEUR
Page 413: CHEZ LE MÊME ÉDITEUR
Page 414: CHEZ LE MÊME ÉDITEUR
Page 415: CHEZ LE MÊME ÉDITEUR
Page 416: CHEZ LE MÊME ÉDITEUR