Introduction 1/28 2/28 Anne-Cécile Caron Licence MIAGE - BDD 2015-2016 Objectifs Après ce cours, les TD et TP correspondants, vous devez être capables de I Créer des tables à partir d un modèle I Utiliser à bon escient les types de données proposés par SQL, ou plus particulièrement par Oracle, et les contraintes de domaine. I Expliquer ce qu est une clef primaire et traduire en SQL les contraintes d intégrité d entité. I Expliquer ce qu est une clef étrangère et traduire en SQL les contraintes d intégrité référentielles. I Supprimer une table, ou modifier son schéma (ajout de colonne, renommage de colonne, ) Introduction Introduction 3/28 4/28 Définition d un schéma en SQL Instruction SQL CREATE TABLE I liste d attributs (nom + type) I définition de contraintes, afin d avoir un schéma : I plus lisible I plus sûr I plus e cace create table client( num_client NUMBER(3) constraint client_pkey primary key, nom VARCHAR2(20) not null, prenom VARCHAR2(20) not null, solde NUMBER(6,2) default 0.0 not null ) ; Restrictions syntaxiques I Ne pas utiliser un mot réservé SQL comme nom de table ou d attribut I Les majuscules et minuscules sont équivalentes I On peut avoir deux attributs de même nom dans deux tables di é r e n t e s. CLIENT.num_client et COMMANDE.num_client I On peut avoir deux tables de même nom dans deux comptes Oracle (schéma) di é r e n t s. CARON.ARTICLE et SEDOGLAVIC.ARTICLE
5/28 Types numériques 6/28 Les types de données Les types numériques I Types simples : numériques, caractères, binaires, dates et intervalles de dates. I Définis dans la norme SQL I Malheureusement, pas toujours suivie! I Oracle accepte la plupart des types de la norme, mais les traduit dans un type propre à Oracle. Types SQL : I NUMERIC(p,s) ou Decimal(p,s) : nombres à virgule fixe. p est le nombre total de chi res et s est le nombre de chi res après la virgule. équivalent au type Oracle Number(p,s) I INTEGER, INT, SMALLINT : entiers I REAL, DOUBLE PRECISION, FLOAT(p) : nombre à virgule flottante. Types numériques 7/28 Types caractères 8/28 Les types numériques Oracle Les types caractères Types Oracle : I NUMBER(p,s) : Nombre à virgule fixe. p est la précision, c est à dire le nombre total de chi res utilisés, et peut atteindre 38. s est l échelle, où le nombre de chi res à la droite du point. L échelle prend une valeur entre -84 et 127.Lorsqu elle est négative, cela signifie que le nombre est arrondi à gauche de la virgule. Par exemple Number(8,-2) signifie qu on va arrondir à la centaine. I NUMBER(p) : Nombre entier sur p chi res. (équivalent à Number(p,0)). I NUMBER : Nombre à virgule flottante. I il existe deux autres types qui permettent de stocker des nombres à virgule flottante : BINARY FLOAT (32 bits) et BINARY DOUBLE (64 bits). Types SQL : I CHARACTER(n) ou CHAR(n) : chaînes de n caractères I CHARACTER VARYING(n) ou VARCHAR(n) : chaînes d au plus n caractères. I NATIONAL CHARACTER(n) ou NCHAR(n) : chaînes de n caractères codés en Unicode. L ensemble des caractères nationaux est un paramètre de la base. I NATIONAL CHARACTER VARYING(n) ou NCHAR VARYING(n) : chaînes d au plus n caractères codés en Unicode. I CHARACTER LARGE OBJECT ou CLOB : très grande chaîne de caractères. I NATIONAL CHARACTER LARGE OBJECT ou NCLOB : très grande chaîne de caractères unicode.
Types caractères 9/28 Types binaires 10 / 28 Les types caractères Oracle Les types binaires Types Oracle : I CHAR(n) : chaînes de n caractères I VARCHAR2(n) : chaînes d au plus n caractères. I NCHAR(n), NVARCHAR2(n) : variantes de CHAR et VARCHAR2 avec des caractères unicodes. I CLOB et NCLOB : texte, jusqu à (4 Go - 1) * (taille d un bloc). (avant, on utilisait le type LONG, d au maximum 2Go) I Il existe un type VARCHAR mais il est déconseillé de l utiliser : Do not use the VARCHAR datatype. Use the VARCHAR2 datatype instead. Although the VARCHAR datatype is currently synonymous with VARCHAR2, the VARCHAR datatype is scheduled to be redefined as a separate datatype used for variable-length character strings compared with di erent comparison semantics. 1. Types SQL : I BIT(n) : chaîne de n bits. I BIT VARYING(n) : chaîne d au plus n bits. I BINARY LARGE OBJECT ou BLOB : très grande séquence d octets, qui ne représentent pas des caractères. 2. Types Oracle : I BLOB : données binaires jusqu à (4 Go - 1) * (taille d un bloc) I BFile : données binaires stockées dans un fichier externe à la base. jusqu à 4Go. Types temporels 11 / 28 12 / 28 Les types temporels 1. Types SQL : I DATE : date (année, mois, jour) I TIME : heure (heure,minute,seconde,) I TIMESTAMP : estampille, i.e date au sens OS I INTERVAL : intervalle de temps. On peut définir des intervalles à des échelles de temps érentes di ( intervalles day - time ou year - month ). I TIME WITH TIME ZONE et TIMESTAMP WITH TIME ZONE : avec le décalage par rapport à Greenwich 2. Types Oracle : I DATE : date et heure (sur 7 octets) I TIMESTAMP : date et heure incluant des fractions de secondes (précision selon l OS) I INTERVAL YEAR TO MONTH : période représentée en années et mois. I INTERVAL DAY TO SECOND : période représentée en jours, heures, minutes, secondes. I TIMESTAMP WITH TIME ZONE I Très complètes depuis la norme SQL2. I Elles sont vérifiées automatiquement par le SGBD. I I I moins de programmation. plus de sécurité. moins d échanges réseaux. I Contrainte non satisfaite ) annulation de la mise à jour + message d erreur. I Contraintes déclaratives, exprimées dans le schéma, présentes dans le dictionnaire des données.
13 / 28 domaine 14 / 28 Di érentes contraintes de domaine I Contraintes de domaines = valeurs prises par les attributs. I NOT NULL ne peut pas prendre la valeur NULL I Contraintes d intégrité d entité = clefs primaires I DEFAULT valeur par défaut I Contraintes d intégrité référentielles = clefs étrangères I Contraintes générales = assertions I UNIQUE groupe d attributs dont la valeur (si non nulle) permet d extraire 1 seul tuple. Entraine souvent la création d un index. I CHECK contrainte qui porte sur les valeurs du tuple check (quantite >= 0) check (datedeb < datefin) check (couleur in ( blanc, vert, rouge )) I Dans la norme SQL2, on peut définir des domaines qui définiront les valeurs de colonnes des tables. Clef primaire 15 / 28 Clef primaire 16 / 28 Intégrité d entité Intégrité d entité (2) Définition des clefs primaires. I Les colonnes composant la clef primaire sont not null I Clef formée d une seule colonne I L ensemble est unique create table client( num_client NUMBER(3) constraint client_pkey primary key, I Entraîne la création d un index (qui porte le nom donné à la contrainte) I Clef composée de plusieurs colonnes create table salle( nom_salle varchar2(20), nom_bat varchar2(20),, constraint salle_pkey primary key(nom_salle, nom_bat)
Clef primaire 17 / 28 18 / 28 Génération des clés primaires Intégrité référentielle La norme SQL 2003 comporte deux techniques afin de générer des valeurs numériques auto incrémentées, mécanisme très pratique pour les clés primaires. I l attribut de colonne IDENTITY (comme avec SQL Server) I la création d objets séquenceurs. Lien entre deux tables. I clef étrangère : groupe d attributs d une table T1 dont les valeurs doivent exister dans une table T2, comme valeurs d une clef candidate de T2 (souvent clef primaire). C est la deuxième technique qui peut être utilisée sous Oracle. CREATE SEQUENCE ma_sequence INCREMENT BY 1 START WITH 1 ; I table référencée : la table T2 qui contient la clef candidate. I table qui référence : la table T1 qui contient la clef étrangère. Dans un programme PL/SQL ou une instruction SQL, on utilise une séquence grâce à ses pseudo-colonnes NEXTVAL et CURRVAL. I NEXTVAL permet de générer et récupérer un nouveau nombre. I CURRVAL permet de récupérer le dernier nombre généré (sans en générer de nouveau). select ma_sequence.currval from dual ; insert into T values (ma_sequence.nextval,v2,v3 19 / 28 20 / 28 Intégrité référentielle (2) Intégrité référentielle (3) Autre exemple (clef composée de 2 colonnes) : Exemple : create table client( num_client NUMBER(3) constraint client_pkey primary key, create table commande( num_client number(3) constraint commande_client_fkey references client create table salle( nom_salle varchar2(20), nom_bat varchar2(20), constraint salle_pkey primary key(nom_salle, nom_bat) create table cours( nom_salle varchar2(20), nom_bat varchar2(20),, constraint cours_salle_fkey foreign key(nom_salle,nom_bat) references salle(nom_salle,nom_bat)
21 / 28 22 / 28 Intégrité référentielle et mises à jour Intégrité référentielle et mises à jour (2) Que faire si on supprime une ligne référencée (clause ON DELETE), ou si on modifie une clef référencée (clause ON UPDATE)? I NO ACTION (anciennement RESTRICT) interdit la mise à jour de la table référencée. I SET NULL clef étrangère mise à NULL (si autorisé) I SET DEFAULT clef étrangère remplacée par une valeur par défaut I CASCADE les lignes qui font référence sont détruites (on delete cascade) ou modifiées (on update cascade) Sous Oracle : I on update / delete no action (par défaut) I on delete cascade I on delete set null create table commande( num_commande number(3) constraint commande_pkey primary key, create table produit( num_produit number(3) constraint produit_pkey primary key, create table contient( num_commande constraint contient_com_fkey references Commande on delete cascade, num_produit constraint contient_prod_fkey references Produit, 23 / 28 24 / 28 Domaines et assertions Modifier le schéma d une table I SQL2 : Définition d un domaine indépendant des tables, qui peut servir à typer une colonne d une table : CREATE DOMAIN valeur_note INTEGER CHECK (VALUE >= 0 AND VALUE <= 20) I SQL2 : Définition d une assertion, i.e. contrainte globale sur le schéma CREATE ASSERTION exemple_assert CHECK ( 50 > (select count(*) from client where num_client not in (select num_client from commande))) il n est malheureusement pas possible de définir sous Oracle des domaines ou des assertions. Instruction ALTER TABLE (voir doc Oracle pour la syntaxe!) I On peut ajouter une ou plusieurs colonnes, une ou plusieurs contraintes ALTER TABLE <nom_de_la_table> ADD alter table tt add constraint tt_pkey primary key(c1) ; alter table tt add (c3 number(4) default 0 not null ) I On peut supprimer une colonne ou une contrainte ALTER TABLE <nom_de_la_table> DROP <type_element_supprimé> <nom_colonne> alter table tt drop column cc ; -- dangereux! alter table tt drop constraint tt_pkey ;
25 / 28 26 / 28 Modifier le schéma d une table (suite) Sur notre exemple - tables Produit et Contient ALTER TABLE <nom_de_la_table> MODIFY alter table tt modify (c3 number(5)) --> change la taille de la colonne, le NOT NULL et la valeur par défaut restent alter table tt modify (c3 null) --> supprime le NOT NULL -- la colonne produit.nom passe d une taille 30 à une taille 25, -- autorisé car les noms stockés ont moins de 25 caractères. -- le not null est conservé, m^eme si on ne l écrit pas à nouveau. alter table produit modify (nom VARCHAR2(25)) -- ajout d une contrainte alter table contient add constraint quantite_positive check (quantite > 0) On ne peut pas réellement supprimer la valeur par défaut, mais on peut mettre une valeur par défaut à NULL. alter table tt modify (c3 default null) 27 / 28 28 / 28 Renommer une table ou une colonne RENAME <nom_table> TO <autre_nom_table> Par exemple : rename t1 to ma_table ALTER TABLE <nom_table> RENAME COLUMN <nom_col> TO <autre_nom> alter table tt rename column c3 to cc Supprimer une table Instruction SQL DROP TABLE DROP TABLE Produit ; DROP TABLE Produit CASCADE CONSTRAINTS ; -- supprime Produit et les contraintes qui y font référence. I Sous Oracle, il existe une corbeille où sont mises les tables supprimées (avec des noms barbares BIN$) I on peut récupérer une table que l on a supprimée : flashback table Produit to before drop I on peut vider la corbeille : purge recyclebin