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