• Aucun résultat trouvé

CRÉATION D’UNE TABLE

Dans le document BASES DE DONNÉES ET MODÈLES DE CALCUL (Page 57-61)

Le langage SQL DDL

4.4 CRÉATION D’UNE TABLE

© Dunod – La photocopie non autorisée est un délit.

Connexions et sessions

Nous ferons remarquer, sans insister sur les aspects techniques, que l’approche client/serveur propre aux SGBD SQL implique quelques démarches administratives préalables au travail sur une base de données. D’abord, l’utilisateur qui a l’intention de travailler sur la base de données (schéma ou données) doit établir une (ou plusieurs) connexion(s) avec le serveur sur lequel elle réside :

connect to ADMIN\SERV01 as CON_21Dec2005_002 user "jlh"

A la fin du travail, on demande la déconnexion : disconnect CON_21Dec2005_002

Durant une connexion avec un serveur, l’utilisateur peut exécuter des instructions SQL de création de structures et de manipulation de données. Dans un contexte purement local, la procédure peut être simplifiée, comme dans InterBase :

connect "D:\-jlh-\DONNEES\clicom.gdb"

user "jlh" password "jlhclicom";

4.4 CRÉATION D’UNE TABLE

Cette opération produit une table vide (c’est-à-dire sans lignes). On spécifie le nom de la table et la description de ses colonnes. On spécifiera pour chaque colonne son nom et le type de ses valeurs.

create table CLIENT ( NCLI char(10), NOM char(32), ADRESSE char(60), LOCALITE char(30), CAT char(2), COMPTE decimal(9,2))

a) Les colonnes et leurs types

SQL admet divers types de données dans la déclaration d’une colonne d’une table.

On citera les principaux :

• SMALLINT : entiers signés courts (p. ex. 16 bits);

• INTEGER (ou INT) : entiers signés longs (p. ex. 32 bits);

• NUMERIC(p,q) : nombres décimaux de p chiffres dont q après le point décimal; si elle n’est pas mentionnée, la valeur de q est 0;

• DECIMAL(p,q) : nombres décimaux d’au moins p chiffres dont q après le point décimal; si elle n’est pas mentionnée, la valeur de q est 0;

• FLOAT(p) (ou FLOAT) : nombres en virgule flottante d’au moins p bits significatifs;

• CHARACTER(p) (ou CHAR) : chaîne de longueur fixe de p caractères;

• CHARACTER VARYING (ou VARCHAR(p)) : chaîne de longueur variable d’au plus p caractères;

• BIT(p) : chaînes de longueur fixe de p bits;

• BIT VARYING : chaînes de longueur variable d’au plus p bits;

• DATE : dates (année, mois et jour);

• TIME : instants (heure, minute, seconde, éventuellement 1000ème de seconde);

• TIMESTAMP : date + temps,

• INTERVAL : intervalle en années/mois/jours entre dates ou en heures/minutes/

secondes entre instants1.

Chaque SGBD ajoutera de sa propre initiative d’autres types de données. Citons-en deux généralement disponibles sous une forme ou sous une autre dans tous les moteurs SQL :

• les Binary Large Objects (BLOB), sorte de contenants génériques pouvant accueillir des chaînes de bits de longueur illimitée telles que des images, séquences vidéo, séquence sonores ou musicales. Les Character Large Objects (CLOB) sont similaires, mais considérés comme étant formés de caractères.

• les générateurs de valeurs, qui attribuent automatiquement la valeur suivante à leur colonne lors de l’insertion d’une ligne; ils permettent d’assigner des valeurs uniques à des colonnes servant d’identifiant technique.

Outre ces types de base abstraits et peu informatifs, il est possible de définir des domaines de valeurs qui rendront le schéma plus lisible et plus facile à modifier2. create domain MONTANT decimal(9,2)

create domain MATRICULE char(10) create domain LIBELLE char(32)

create table CLIENT ( NCLI MATRICULE, NOM LIBELLE, ADRESSE char(60), LOCALITE LIBELLE, CAT char(2), COMPTE MONTANT)

1. SQL distingue deux types d’intervalles car il n’est pas possible de calculer le nombre de jours compris dans p mois sans connaître ces mois.

2. Comme nous le verrons également, il est possible d’attacher des contraintes d’intégrité simples à un domaine.

4.4 Création d’une table 59

© Dunod – La photocopie non autorisée est un délit.

On peut enfin définir la valeur, dite valeur par défaut, que le SGBD assignera auto-matiquement à une colonne (éventuellement via son domaine) lorsque l’utilisateur omettra d’en fournir une lors de la création d’une ligne :

create domain MONTANT decimal(9,2) default 0.0 CAT char(2) default 'AA'

En SQL:1999, les domaines tendent à être remplacés par le concept plus puissant de type.

b) Expression de l’identifiant primaire

On complétera la déclaration de la table par la clause primary key : create table CLIENT ( NCLI char(10),

NOM char(32), ADRESSE char(60), LOCALITE char(30), CAT char(2),

COMPTE decimal (9,2), primary key (NCLI) ) create table DETAIL ( NCOM char(12), NPRO char(15), QCOM decimal(8), primary key (NCOM,NPRO) ) c) Expression d’un identifiant secondaire

Les autres identifiants seront déclarés par une clause unique : create table ASSURE ( NUM_AFFIL char(10),

NUM_IDENT char(15), NOM char(35), primary key (NUM_AFFIL), unique (NUM_IDENT) ) d) Expression d’une contrainte référentielle

On déclarera la clé étrangère et la table référencée par une clause foreign key3 : 3. Certains éditeurs choisissent délibérément d’écarter cette contrainte avec des arguments tels que les suivants : There are so many problems with foreign keys that we don't know where to start, ou encore : The only nice aspect of foreign key is that it gives ODBC and some other client programs the ability to see how a table is connected and to use this to show connection diagrams and to help in building applications. MySQL Reference Manual, Version 3.23.2-alpha 8 August 1999. On avance aussi l’argument péremptoire qu’ "il suffit de faire attention à ne pas introduire des données erronées". On pourrait, en suivant le même raisonnement, prôner l’inutilité des anti-biotiques et des logiciels anti-virus. Les dernières versions de MySQL montrent que les concep-teurs ont fait de louables efforts dans le bon sens.

create table DETAIL ( NCOM char(12), NPRO char(15), QCOM decimal(8), primary key (NCOM,NPRO),

foreign key (NCOM) references COMMANDE, foreign key (NPRO) references PRODUIT )

Par défaut, l’identifiant visé par la clé étrangère dans la table cible est l’identifiant primaire de celle-ci. Il est possible, mais ceci est déconseillé en toute généralité, de définir une clé étrangère visant un identifiant secondaire de la table cible. Dans ce cas, les composants de cet identifiant doivent être mentionnés dans la déclaration : foreign key (PROPRIO) references PERSONNE(NUM_REGISTRE) e) Expression du caractère obligatoire/facultatif d’une colonne

Par défaut (c’est-à-dire si on ne spécifie rien) toute colonne est facultative. Le carac-tère obligatoire d’une colonne se déclarera par la clause not null :

create table OFFRE ( NUMFL char(10) not null, NUMPL char(15) not null, PRIX decimal(8),

primary key (NUMFL, NUMPL),

foreign key (NUMFL) referencesFOURNISSEUR,

foreign key (NUMPL) referencesPIECE ) f) Exemple complet

On peut ainsi donner la définition du schéma de la base de données décrite à la figure 3.5 sous la forme d’une suite de requêtes (ou script) SQL :

create table CLIENT ( NCLI char(10) not null, NOM char(32) not null, ADRESSE char(60) not null, LOCALITE char(30) not null, CAT char(2),

COMPTE decimal(9,2) not null, primary key (NCLI) )

create table PRODUIT ( NPRO char(15) not null, LIBELLE char(60) not null, PRIX decimal(6) not null, QSTOCK decimal(8) not null, primary key (NPRO) )

create table COMMANDE (NCOM char(12) not null, NCLI char(10) not null, DATECOM date not null, primary key (NCOM),

foreign key (NCLI) references CLIENT)

Dans le document BASES DE DONNÉES ET MODÈLES DE CALCUL (Page 57-61)