SQL - sch mas
Transcription
SQL - sch mas
Schéma et contraintes Schéma et contraintes Introduction 1 / 28 2 / 28 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 Schéma et contraintes Anne-Cécile Caron Licence MIAGE - BDD 2015-2016 Schéma et contraintes 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, ...) Schéma et contraintes Introduction Introduction 3 / 28 Définition d’un schéma en SQL Instruction SQL CREATE TABLE I I liste d’attributs (nom + type) définition de contraintes, afin d’avoir un schéma : I I I plus lisible plus sûr plus efficace 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 ) ; 4 / 28 Restrictions syntaxiques I I I Ne pas utiliser un mot réservé SQL comme nom de table ou d’attribut Les majuscules et minuscules sont équivalentes On peut avoir deux attributs de même nom dans deux tables di↵érentes. CLIENT.num_client et COMMANDE.num_client I On peut avoir deux tables de même nom dans deux comptes Oracle (schéma) di↵érents. CARON.ARTICLE et SEDOGLAVIC.ARTICLE Schéma et contraintes Schéma et contraintes Types de données Types de données 5 / 28 Les types de données I I I Types SQL : Malheureusement, pas toujours suivie ! Oracle accepte la plupart des types de la norme, mais les traduit dans un type propre à Oracle. Schéma et contraintes Les types numériques Oracle 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). 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. Schéma et contraintes Types de données Types numériques 6 / 28 Les types numériques Types simples : numériques, caractères, binaires, dates et intervalles de dates. Définis dans la norme SQL I Types numériques Types de données 7 / 28 Types caractères Les types caractères 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. 8 / 28 Schéma et contraintes Schéma et contraintes Types de données Types de données Types caractères 9 / 28 Les types caractères Oracle 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) Il existe un type VARCHAR mais il est déconseillé de l’utiliser : I 10 / 28 Les types binaires 1. Types SQL : Types Oracle : I Types binaires I I I BIT(n) : chaı̂ne de n bits. BIT VARYING(n) : chaı̂ne d’au plus n bits. BINARY LARGE OBJECT ou BLOB : très grande séquence d’octets, qui ne représentent pas des caractères. 2. Types Oracle : I I BLOB : données binaires jusqu’à (4 Go - 1) * (taille d’un bloc) BFile : données binaires stockées dans un fichier externe à la base. jusqu’à 4Go. 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. Schéma et contraintes Schéma et contraintes Types de données Les contraintes Types temporels 11 / 28 Les types temporels 1. Types SQL : I I I I I DATE : date (année, mois, jour) TIME : heure (heure,minute,seconde,...) TIMESTAMP : estampille, i.e date au sens OS INTERVAL : intervalle de temps. On peut définir des intervalles à des échelles de temps di↵érentes (intervalles day-time ou year-month). TIME WITH TIME ZONE et TIMESTAMP WITH TIME ZONE : avec le décalage par rapport à Greenwich 2. Types Oracle : I I I I I DATE : date et heure (sur 7 octets) TIMESTAMP : date et heure incluant des fractions de secondes (précision selon l’OS) INTERVAL YEAR TO MONTH : période représentée en années et mois. INTERVAL DAY TO SECOND : période représentée en jours, heures, minutes, secondes. TIMESTAMP WITH TIME ZONE 12 / 28 Les contraintes I I Très complètes depuis la norme SQL2. Elles sont vérifiées automatiquement par le SGBD. I I I I I moins de programmation. plus de sécurité. moins d’échanges réseaux. Contrainte non satisfaite ) annulation de la mise à jour + message d’erreur. Contraintes déclaratives, exprimées dans le schéma, présentes dans le dictionnaire des données. Schéma et contraintes Schéma et contraintes Les contraintes Les contraintes 13 / 28 Di↵érentes contraintes domaine 14 / 28 Les 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 I Contraintes générales = assertions UNIQUE groupe d’attributs dont la valeur (si non nulle) permet d’extraire 1 seul tuple. Entraine souvent la création d’un index. CHECK contrainte qui porte sur les valeurs du tuple I check (quantite >= 0) check (datedeb < datefin) check (couleur in (’blanc’,’vert’,’rouge’)) I Schéma et contraintes Schéma et contraintes Les contraintes Clef primaire Intégrité d’entité Définition des clefs primaires. I Clef formée d’une seule colonne create table client( num_client NUMBER(3) constraint client_pkey primary key, ... ); 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) ); Dans la norme SQL2, on peut définir des domaines qui définiront les valeurs de colonnes des tables. Les contraintes 15 / 28 Clef primaire Intégrité d’entité (2) I Les colonnes composant la clef primaire sont not null I L’ensemble est unique I Entraı̂ne la création d’un index (qui porte le nom donné à la contrainte) 16 / 28 Schéma et contraintes Schéma et contraintes Les contraintes Clef primaire Les contraintes 17 / 28 Génération des clés primaires l’attribut de colonne IDENTITY (comme avec SQL Server) I la création d’objets séquenceurs. 18 / 28 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 Clef étrangère Lien entre deux tables. C’est la deuxième technique qui peut être utilisée sous Oracle. CREATE SEQUENCE ma_sequence INCREMENT BY 1 START WITH 1 ; 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). 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); Schéma et contraintes Schéma et contraintes Les contraintes Clef étrangère Intégrité référentielle (2) Les contraintes 19 / 28 Clef étrangère 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) ); 20 / 28 Schéma et contraintes Schéma et contraintes Les contraintes Clef étrangère Les contraintes 21 / 28 Intégrité référentielle et mises à jour 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) 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, ... ); Sous Oracle : I on update / delete no action (par défaut) I on delete cascade I on delete set null Schéma et contraintes Schéma et contraintes Les contraintes Clef étrangère Domaines et assertions I 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) modification d’un schéma 23 / 28 24 / 28 Modifier le schéma d’une table Instruction ALTER TABLE (voir doc Oracle pour la syntaxe !) I il n’est malheureusement pas possible de définir sous Oracle des domaines ou des assertions. On peut ajouter une ou plusieurs colonnes, une ou plusieurs contraintes ALTER TABLE <nom_de_la_table> 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))) 22 / 28 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 Clef étrangère 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 ; Schéma et contraintes Schéma et contraintes modification d’un schéma modification d’un schéma 25 / 28 Modifier le schéma d’une table (suite) 26 / 28 Sur notre exemple - tables Produit et Contient -- 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)) 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 -- ajout d’une contrainte alter table contient add constraint quantite_positive check (quantite > 0) alter table tt modify (c3 null) --> supprime le NOT NULL 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) Schéma et contraintes Schéma et contraintes modification d’un schéma modification d’un schéma 27 / 28 Renommer une table ou une colonne 28 / 28 Supprimer une table Instruction SQL DROP TABLE RENAME <nom_table> TO <autre_nom_table> DROP TABLE Produit ; 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 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