SQL Description des données : création, insertion, mise à jour BD4 AD, SB, FC, N G de R Licence MIASHS, Master ISIFAR, Paris-Diderot Mars 2015 BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 1/21 Mars 2015 1 / 21 Introduction Définition des données SQL est un monde à part entière On peut : Interroger des données par des requêtes (déjà vu) Administrer les bases de données C est-à-dire : Créer celles-ci : définition des tables (schémas, etc), contraintes Créer de nouvelles données, en insérer, supprimer, mettre à jour, etc Créer et gérer les utilisateurs, leurs droits sur les objets de la base, Dans ce cours : création des tables (version simplifiée) et des données BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 2/21 Mars 2015 2 / 21
Création de tables Création de tables Definition de tables Un atelier de conception comme WorkBench permet de définir les tables en dessinant, puis une fois que le graphique semble cohérent d engendrer le code SQL Instruction : CREATE TABLE Permet de définir : Les noms et les domaines (leur type ) des attributs ainsi que des contraintes d intégrité comme : Contraintes de clés primaires Contraintes référentielles (clés étrangères, par exemple) Des contraintes assez générales (de contrôle des données) Des index (pour la recherche et l exécution optimales) BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 3/21 Mars 2015 3 / 21 Création de tables Création de tables Chaque relation est définie par un nom de relation et une liste d attributs CREATE TABLE < nom_ relation > ( < element de relation > <, element de relation >* <, contrainte de relation >* ) ; Chaque attribut est défini par un nom d attribut et un type de données < element de relation > : := < nom_attrib >< type_donnees >[ < contrainte_attrib >*] < type_ donnees > : := VARCHAR < longueur > INT < longueur > REAL DATE BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 4/21 Mars 2015 4 / 21
Création de tables Remarques Une contrainte d attribut concerne un seul attribut Si valeur NULL impossible : NOT NULL Si l attribut est une clé : PRIMARY KEY Unicité de l attribut : UNIQUE Contrainte référentielle : REFERENCES <relation référencée>[(<attribut référencé>)] Définir une valeur par défaut : DEFAULT <valeur> Attention les types disponibles (mais pas seulement) diffèrent grandement suivant les SGBD (Mysql, PostgreSQL, Oracle, SQL Server, ) BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 5/21 Mars 2015 5 / 21 Exemple Création de tables Pour une table countrycodes(code,country) CREATE TABLE atp country_codes_big ( code character varying (3) NOT NULL, country character varying (100), ) ; ou bien : CREATE TABLE atp country_codes_big ( code character varying (3) NOT NULL, country character varying (100), CONSTRAINT country_codes_pkey PRIMARY KEY ( code ) ) ; BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 6/21 Mars 2015 6 / 21
Création de tables Exemple CREATE TABLE atp player ( pid integer NOT NULL DEFAULT nextval ( atp player_big_pid_seq : :regclass ), code character varying (3), name character varying, last_name character varying, first_name character varying, gender character varying (1), birth_date date, CONSTRAINT pk_player_pid PRIMARY KEY ( pid ), CONSTRAINT fk_player_code FOREIGN KEY ( code ) REFERENCES atp country_codes ( code ) ) ; BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 9/21 Mars 2015 9 / 21 Contenu des relations On peut gérer le contenu des tables directement dans le langage SQL On peut donc : Ajouter des tuples à une table : INSERT INTO Mettre à jour des tuples d une relation : UPDATE Supprimer des tuples : DELETE FROM BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 10/21 Mars 2015 10 / 21
Insertion de tuples Insertion Insertion tuples à tuples INSERT INTO < nom_ relation > [( nom_attrib [, nom_attrib ]*)] VALUES ( valeur [, valeur ]*) ; Exemple INSERT INTO atp country_codes_big ( code, country ) VALUES ( SRB, Serbia ) ; Les valeurs doivent être fournies dans l ordre de déclaration des attributs Les valeurs non spécifiées sont affectées à NULL BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 11/21 Mars 2015 11 / 21 Insertion de tuples Insertion On peut faire une insertion par le biais d une requête La clause VALUES est remplacée par une requête Les résultats de la requête sont insérés comme valeurs dans la table Exemple : Alimentation d une nouvelle table à l aide des données d une autre table située dans un autre schema : INSERT INTO atp game_big ( tid, round, registrnum1, registrnum2, mid ) SELECT g tid,g round,g registrnum1,g registrnum2,g mid FROM tennis game g JOIN atp tournament_big t ON (g tid =t tid ) WHERE t ttype = Doubles ; BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 12/21 Mars 2015 12 / 21
Mise à jour Mise à jour On peut mettre à jour des tuples existants par le biais d une requête Soit un par un, soit l ensemble des tuples vérifiants une condition donnée Syntaxe UPDATE nom_relation SET nom_attribut = < expression de valeur > [, nom_attribut = < expression de valeur > ]* [ WHERE < condition de recherche > ] ; BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 13/21 Mars 2015 13 / 21 Mise à jour de tuples Mise à jour Le WHERE permet de sélectionner les tuples à mettre à jour UPDATE atp player_big SET birth_date = CAST ( 1987 - May -22 AS DATE ) WHERE last_name = Djokovic ; On peut aussi effectuer des opérations sur les tuples à mettre à jour La clause <expression de valeur> peut être : NULL Une constante (explicite ou via une requête) Une expression arithmétique sur les attributs de la table à modifier BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 14/21 Mars 2015 14 / 21
Mise à jour Mise à jour de tuples Augmentation du prix d une pièce UPDATE tournament_big SET numrounds = numrounds +1 WHERE name LIKE French Open AND EXTRACT ( YEAR FROM startdate )=2015 ; BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 15/21 Mars 2015 15 / 21 de tuples On peut évidemment supprimer des tuples Syntaxe DELETE FROM < nom_ relation > [ WHERE < condition de recherche >] ; BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 16/21 Mars 2015 16 / 21
de tuples Un problème : essai =# SELECT tid, name, location, startdate FROM atp tournament_big WHERE name LIKE French Open AND EXTRACT ( YEAR FROM startdate )=2007 ; tid name location startdate -- -------------------------------------------------------------------- 2 French Open Roland Garros, Paris, France 2007-05 -26 3 French Open Roland Garros, Paris, France 2007-05 -26 720 French Open Paris 2007-05 -27 Exemple DELETE FROM tournament_big WHERE tid = 720 ) ; La requête suivante pose-t elle problème? DELETE FROM country_codes_big WHERE code IN ( SELECT code FROM player WHERE last_name LIKE Djoko % ) ; BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 17/21 Mars 2015 17 / 21 Maintien de l intégrité référentielle La dernière requête décrit un problème plus général Il y a problème quand : On cherche à insérer dans player un tuple dont la valeur de code n existe pas dans country_codes On cherche à mettre à jour un tuple de player avec une valeur de code qui n existe pas dans country_codes On efface de country_codes, un tuple dont la valeur du champs code apparait comme valeur d un tuple de player On met à jour le champs code d un tuple de country_codes alors que l ancienne valeur de ce champs est présente comme valeur de code dans player BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 18/21 Mars 2015 18 / 21
Maintien de l intégrité référentielle Plusieurs politiques pour régler ces problèmes Par défaut : le système rejette toute modification ne respectant pas les contraintes d intégrité En cascade : les modifications sur l attribut référencé sont effectués aussi sur l attribut qui référence (la clé étrangère) Exemple : mise à jour de country_codescode répercutée sur playercode Effacement répercuté aussi Set-Null : les modifications sur l attribut référencé sont répercuté sur l attribut qui référence en mettant sa valeur à NULL BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 19/21 Mars 2015 19 / 21 Maintien de l intégrité référentielle Exemple de syntaxe CREATE TABLE atp registration ( registrnum integer NOT NULL, pid integer, CONSTRAINT fk_registration_played_in FOREIGN KEY ( registrnum ) REFERENCES atp played_in ( registrnum ) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT fk_registration_player FOREIGN KEY ( pid ) REFERENCES atp player ( pid ) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT fk_registrnum_played_in FOREIGN KEY ( registrnum ) REFERENCES atp played_in ( registrnum ) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE ) Cette déclaration force : BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 20/21 Mars 2015 20 / 21 à répercuter l effacement d un tuple dans played_in sur registration à répercuter la mise à jour d un tuple dans played_in (pour ce qui concerne le champs registrnum) dans les tuples de registration
Résumé On a vu comment créer des tables (de façon simplifiée) et gérer le contenu de celles-ci On peut spécifier bien plus de contraintes dans la partie création de tables L ajout ou la suppression de données n est pas libre : les contraintes (de clés notamment) doivent être satisfaites après l exécution des mises à jour (cf dernier exemple) BD4 (Licence MIASHS, Master ISIFAR, Paris-Diderot) SQL 21/21 Mars 2015 21 / 21