© Your Copyright
Nous présentons ici les commandes SQL pour:
- créer des ensembles
- définir des espaces de nommage
- encapsuler des requêtes dans des vues
- créer des index sur des colonnes de tables pour accélérer la recherche d’informations
- créer des domaines (type de données avec des contraintes optionnelles)sur l’ensemble de valeurs autorisées)
- créer de nouveaux types de données SQL
Attention : Toutes ces commandes n’existent pas en SQLite mais pourront être mises en œuvre en PostgreSQL
1 | CREATE TABLE personnes (id integer, nom text);
|
Création d’un ensemble (vide) de personnes
1 2 3 4 | CREATE SCHEMA IF NOT EXISTS ENIB AUTHORIZATION nedelec;
CREATE TABLE ENIB.personnes (id integer, nom text);
SELECT * FROM ENIB.personnes;
SELECT * FROM personnes;
|
Définir un schéma (espage de nommage) pour créer ses entités (tables) qui seront distinctes d’autres entités (tabbles) de même nom et qui seraient créées sour un autre schéma.
Attention : cette commande n’existe pas en SQLite, il faut créer une nouvelle base (un nouveau fichier) :
1 2 3 4 | $ sqlite3 ENIB
sqlite> CREATE TABLE personnes (id integer, nom text);
$ sqlite3 NEDELEC
sqlite> CREATE TABLE personnes (id integer, nom text);
|
1 2 | CREATE VIEW lesnoms AS SELECT nom FROM personnes;
SELECT * FROM lesnoms;
|
« Encapsuler » une requête SQL dans une vue.
CREATE INDEX age_capitaine ON personnes(age);
Créer un index pour rechercher plus efficacement l’âge des personnes.
CREATE DOMAIN colors VARCHAR(10) CHECK (VALUE IN ('red', 'green', 'blue'));
Créer un domaine pour définir un ensemble de couleurs.
CREATE TYPE addresse AS (numero SMALLINT, rue VARCHAR(100), ville VARCHAR(50));
Créer un nouveau type de données pour définir une adresse.
Création de fonctions (procédures stockées sur un serveur de base de données)
- PL/SQL : Programming Language en ORACLE
- PL/PGSQL : Programming Language en PostgreSQL
- …
N’existe pas en standard en SQLite qui n’est pas prévu pour fonctionner en mode client-serveur sur le réseau.
implémenter une fonction pour calculer le pric TTC
1 2 3 4 5 6 7 | CREATE OR REPLACE
FUNCTION prix_ttc (hors_taxe numeric) RETURNS numeric AS
$$
BEGIN
RETURN hors_taxe*1.2;
END
$$ LANGUAGE 'plpgsql';
|
gestion d’un trigger pour la destruction automatique de « adresses » d’une personne.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | CREATE TABLE personnes (id integer, nom text);
CREATE TABLE adresses (id_personne integer, adresse text);
CREATE FUNCTION delete_adresses() RETURNS TRIGGER AS
$$
BEGIN
DELETE FROM adresses WHERE id_personne = OLD.id;
RETURN OLD;
END
$$ LANGUAGE 'plpgsql';
CREATE TRIGGER delete_personne_adresse
BEFORE DELETE ON personnes
FOR EACH ROW EXECUTE PROCEDURE delete_adresses();
INSERT INTO personnes(nom) VALUES ('Dupond');
INSERT INTO adresses(adresse) VALUES ('Brest');
DELETE FROM personnes WHERE nom = 'Dupond';
|
On peut renommer une table :
CREATE TABLE T(a integer, b text);
INSERT INTO T VALUES (1,"toto");
SELECT * FROM T;
ALTER TABLE T RENAME TO personnes;
SELECT * FROM personnes;
Ajouter une colonne (connaître l’âge des personnes)
ALTER TABLE personnes ADD COLUMN age SMALLINT;
la commande ALTER TABLE en SQLite ne permet que de renommer une table ou ajouter une nouvelle colonne.
Pour modifier une colonne dans une table il est nécessaire de le faire dans une transaction en suivant les étapes:
- créer une nouvelle table
- copier dans cette table les informations de la table dont on veut modifier les colonnes
- détruire l’ancienne table
1 2 3 4 5 6 7 8 9 10 11 | CREATE TABLE T(a integer, b text);
INSERT INTO T VALUES (1,'toto');
SELECT * FROM T;
BEGIN TRANSACTION;
CREATE TABLE personnes (id integer, nom text, age integer);
INSERT INTO personnes(id,nom) SELECT a,b FROM T;
UPDATE personnes SET age=20;
DROP TABLE T;
COMMIT;
SELECT * FROM personnes;
|
On peut aussi utiliser des tables temporaires en suivant les étapes:
- créer une table temporaire
- sauvegarder l’ensemble dans une table temporaire
- détruire l’ensemble sauvegardé
- créer le nouvel ensemble
- copier les élements sauvegardés
- mettre à jour les nouvelles informations sur les élements du nouvel ensemble
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CREATE TABLE T(a integer, b text);
INSERT INTO T VALUES (1,'toto');
SELECT * FROM T;
BEGIN TRANSACTION;
CREATE TEMPORARY TABLE T_backup(a,b);
INSERT INTO T_backup SELECT a,b FROM T;
DROP TABLE T;
CREATE TABLE personnes (id integer, nom text, age integer);
INSERT INTO personnes(id,nom) SELECT a,b FROM T_backup;
UPDATE personnes SET age=20;
DROP TABLE T_backup;
COMMIT;
SELECT * FROM personnes;
|
D’autres langages comme PostgreSQL permettent de faire ce genre d’actions sur une base de données de la manière suivante :
Détruire l’ensemble des personnes
DROP TABLE personnes;
Associer une valeur par défaut sur la colonne âge des personnes
ALTER TABLE personnes ALTER COLUMN age SET DEFAULT 18;
la commande ALTER TABLE en SQLite ne permet que de renommer une table ou ajouter une nouvelle colonne.
ALTER TABLE personnes ADD COLUMN age DEFAULT 18;
Pour modifier une colonne dans une table il faut :
- créer une table temporaire
- sauvegarder l’ensemble dans une table temporaire
- détruire l’ensemble sauvegardé
- créer le nouvel ensemble
- copier les éléments sauvegardés
- mettre à jour les informations sur la colonne modifiée
1 2 3 4 5 6 7 8 | BEGIN TRANSACTION;
CREATE TEMPORARY TABLE personnes_backup(id,nom);
INSERT INTO personnes_backup SELECT id,nom FROM personnes;
DROP TABLE personnes;
CREATE TABLE personnes (id integer, nom text, age integer DEFAULT 18);
INSERT INTO personnes(id,nom) SELECT id,nom FROM personnes_backup;
DROP TABLE personnes_backup;
COMMIT;
|
Donner obligatoirement une valeur à un identifiant lors de l’insertion d’un élément dans l’ensemble des personnes
ALTER TABLE personnes ALTER COLUMN id SET NOT NULL;
-- CREATE TABLE personnes (id integer NOT NULL, nom text, age smallint);
Pour modifier une colonne dans une table il faut :
- créer une table temporaire
- sauvegarder l’ensemble dans une table temporaire
- détruire l’ensemble sauvegardé
- créer le nouvel ensemble
- copier les élements sauvegardés
- mettre à jour les informations sur la colonne modifiée
1 2 3 4 5 6 7 8 | BEGIN TRANSACTION;
CREATE TEMPORARY TABLE personnes_backup(id,nom);
INSERT INTO personnes_backup SELECT id,nom FROM personnes;
DROP TABLE personnes;
CREATE TABLE personnes (id integer NOT NULL, nom text, age smallint DEFAULT 18);
INSERT INTO personnes(id,nom) SELECT id,nom FROM personnes_backup;
DROP TABLE personnes_backup;
COMMIT;
|
Donner des valeurs nécessairement différentes un identifiant lors de l’insertion d’un élément dans l’ensemble des personnes
ALTER TABLE personnes ADD CONSTRAINT personnes_id_unique UNIQUE(id);
-- CREATE TABLE personnes (id integer UNIQUE, nom text, age smallint);
Pour modifier une colonne dans une table il faut :
- créer une table temporaire
- sauvegarder l’ensemble dans une table temporaire
- détruire l’ensemble sauvegardé
- créer le nouvel ensemble
- copier les élements sauvegardés
- mettre à jour les informations sur la colonne modifiée
1 2 3 4 5 6 7 8 | BEGIN TRANSACTION;
CREATE TEMPORARY TABLE personnes_backup(id,nom);
INSERT INTO personnes_backup SELECT id,nom FROM personnes;
DROP TABLE personnes;
CREATE TABLE personnes (id integer UNIQUE, nom text, age smallint DEFAULT 18);
INSERT INTO personnes(id,nom) SELECT id,nom FROM personnes_backup;
DROP TABLE personnes_backup;
COMMIT;
|
Définir une ou plusieurs colonnes comme clé primaire de l’ensemble des personnes
ALTER TABLE personnes ADD PRIMARY KEY(id);
-- CREATE TABLE personnes (id integer PRIMARY KEY, nom text, age smallint);
-- CREATE TABLE personnes (id integer NOT NULL UNIQUE, nom text, age smallint);
Pour modifier une colonne dans une table il faut :
- créer une table temporaire
- sauvegarder l’ensemble dans une table temporaire
- détruire l’ensemble sauvegardé
- créer le nouvel ensemble
- copier les élements sauvegardés
- mettre à jour les informations sur la colonne modifiée
1 2 3 4 5 6 7 8 | BEGIN TRANSACTION;
CREATE TEMPORARY TABLE personnes_backup(id,nom);
INSERT INTO personnes_backup SELECT id,nom FROM personnes;
DROP TABLE personnes;
CREATE TABLE personnes (id integer PRIMARY KEY, nom text, age smallint DEFAULT 18);
INSERT INTO personnes(id,nom) SELECT id,nom FROM personnes_backup;
DROP TABLE personnes_backup;
COMMIT;
|
Associer deux tables en référençant sur une clé primaire (PRIMARY KEY) d’une autre table.
Exemple : comment associer plusieurs adresses
à une même personnes
?
1 2 3 4 | CREATE TABLE adresses (id_adresse integer PRIMARY KEY,
id_personne integer,
adresse text,
FOREIGN KEY(id_personne) REFERENCES personnes);
|
Définir des contraintes de validité de valeurs sur la colonne age des personnes
ALTER TABLE personnes ADD CHECK (age > 16 AND age < 70);
On se propose de :
- Créer une table
T
contenant deux colonnes(a,b)
de type(integer,text)
- Insérer dans cette table les 2-uplets
(1,'Jojo'),(2,'Bibi')
.- Renommer la table
T
enpersonnes
.- Renommer les colonnes
a,b
enid,nom
.- Ajouter une colonne
age
de typeinteger
.- Donner une valeur par défaut de 20 pour la colonne
age
aux éléments de la tablepersonnes
.
On obtient ainsi une ensemble de personnes. Chaque personne est identifiée de manière unique par la colonne id
.
L’intérêt de cet exercice est de montrer qu’on peut faire évoluer un modèle de données relationnelles avec les éléments (informations) qu’il contient sans avoir à remettre en cause l’existant.
Nous invitons le lecteur intéressé à tester les autres commandes du langage (du moins celles supportées par SQLite)