Lors de la création d'une nouvelle base de donnée, PostgreSQL crée automatiquement un schéma appelé "public". Quel que soit l'objet que vous créez sans spécifier le nom du schéma, PostgreSQL le placera dans ce schéma public.

Donc les ordres suivants sont identiques :

CREATE TABLE table_name(
  ...
);
CREATE TABLE public.table_name(
   ...
);
Pourquoi créer et utiliser les schémas ?
  • Les schémas vous permettent d'organiser les objets de la base de données, par exemple les tables, en groupes logiques afin de les rendre plus faciles à gérer. Ceci permet d'isoler les données selon des domaines différents par exemple recette/production ou clientX/clientY/clientZ.
  • Les schémas permettent à plusieurs utilisateurs d'utiliser une base de données sans interférer les uns avec les autres.
Exemple d'utilisation de schémas
Syntaxe principale
CREATE SCHEMA nom_schema AUTHORIZATION nom_role;
Exemples

Création de deux schémas production, recette. Par défaut, si on n'indique pas le rôle dans la clause AUTHORISATION, le rôle utilisé sera le rôle courant.

CREATE SCHEMA production;
CREATE SCHEMA recette;

Si on liste les tables article contenues dans la base tutorial, on voit les deux schémas présents : production et recette

tutorial=# SELECT schemaname,tablename FROM pg_catalog.pg_tables WHERE tablename = 'article';
 schemaname | tablename
------------+-----------
 production | article
 recette    | article
(2 rows)

Si on ne cite pas le schéma lors d'un select sur la table article, on obtient l'erreur suivante :

tutorial=# select * from article;
ERROR:  relation "article" does not exist
LINE 1: select * from article;

Pour lister le contenu de la table article appartenant au schéma production, il est nécessaire de préfixer la table du nom de schéma (ici production) :

tutorial=# select * from production.article;
 article_id |   article_name   | article_price |                 article_option
------------+------------------+---------------+-------------------------------------------------
       1001 | Clavier QUERTY   |         34.30 | {"marque":"KBTech"}
       1002 | Clavier AZERTY   |         34.30 | {"marque":"KBTech"}
       1003 | Souris à fil     |          13.0 | {"marque":"MouseIN","longueur du fil en cm":80}
       1004 | Souris Bluetooth |         35.60 | {"marque":"MouseIN"}
       1005 | Ecran 22pouces   |        130.00 | {"marque":"VGTech"}
       1006 | Ecran 24pouces   |        160.00 | {"marque":"VGTech"}
(6 rows)

Ceci est normal, parce que PostgreSQL recherche les tables selon un chemin spécifique indiqué dans le paramètre search_path:

tutorial=# SHOW search_path;
   search_path
-----------------
 "$user", public
(1 row)

Par défaut, la table sera recherchée avec les préfixes suivants : dans le schéma du nom de l'utilisateur ($user), puis dans le schéma public.

Cette information peut être soit modifiée dans le fichier postgresql.conf de votre installation en modifiant la ligne suivante :

search_path = '"$user",public'		# schema names

Par exemple, en indiquant le schéma de travail principal, puis éventuellement le schéma public :

search_path = 'production,public'		# schema names

Mais on peut aussi modifier ce chemin d'accès juste le temps de la session, en modifiant la valeur du paramètre search_path dans la session :

tutorial=# set search_path = production;
SET

Dans les deux cas, un select sur la table article sera effectué dans le schéma 'production' :

tutorial=# select * from article;
 article_id |   article_name   | article_price |                 article_option
------------+------------------+---------------+-------------------------------------------------
       1001 | Clavier QUERTY   |         34.30 | {"marque":"KBTech"}
       1002 | Clavier AZERTY   |         34.30 | {"marque":"KBTech"}
       1003 | Souris à fil     |          13.0 | {"marque":"MouseIN","longueur du fil en cm":80}
       1004 | Souris Bluetooth |         35.60 | {"marque":"MouseIN"}
       1005 | Ecran 22pouces   |        130.00 | {"marque":"VGTech"}
       1006 | Ecran 24pouces   |        160.00 | {"marque":"VGTech"}
(6 rows)