En fait, CREATE DATABASE fonctionne en copiant une base
   de données préexistante. Par défaut, cette commande copie la base
   de données système standard
   template1. Ainsi,
   cette base de données est le « modèle » à partir duquel de
   nouvelles bases de données sont créées. Si vous ajoutez des objets
   à template1, ces objets seront copiés dans les bases de
   données utilisateur créées ultérieurement. Ce comportement permet
   d'apporter des modifications locales au jeu standard d'objets des
   bases de données. Par exemple, si vous installez le langage de
   procédures PL/Perl dans template1, celui-ci
   sera automatiquement disponible dans les bases de données
   utilisateur sans qu'il soit nécessaire de faire quelque chose de
   spécial au moment où ces bases de données sont créées.
  
   Il y a une seconde base de données système standard appelée
   template0. Cette
   base de données contient les mêmes données que le contenu initial
   de template1, c'est-à-dire seulement les objets
   standards prédéfinis dans votre version de
   PostgreSQL. template0 ne
   devrait jamais être modifiée après que le cluster des bases de données ait été
   créé. En indiquant
   à CREATE DATABASE de copier template0 au
   lieu de template1, vous pouvez créer une base de
   données utilisateur « vierge » qui ne contient aucun des
   ajouts locaux à template1. Ceci est particulièrement
   pratique quand on restaure une sauvegarde réalisé avec pg_dump :
   le script de dump devrait être restauré dans une base de données
   vierge pour être sûr de recréer le contenu correct de la base
   de données sauvegardée, sans survenue de conflits avec des objets qui
   auraient été ajoutés à template1.
  
   Une autre raison habituelle de copier template0 au lieu
   de template1 est que les nouvelles options d'encodage et
   de locale peuvent être indiquées lors de la copie de template0,
   alors qu'une copie de template1 doit utiliser les même
   options. Ceci est dû au fait que template1 pourrait
   contenir des données spécifiques à l'encodage ou à la locale alors que
   template0 n'est pas modifiable.
  
   Pour créer une base de données à partir de
   template0, on écrit :
    
CREATE DATABASE nom_base TEMPLATE template0;dans l'environnement SQL ou
createdb -T template0 nom_basedans le shell.
   Il est possible de créer des bases de données modèles
   supplémentaires et, à vrai dire, on peut copier n'importe quelle
   base de données d'un cluster en la désignant comme modèle pour la
   commande CREATE DATABASE. Cependant, il importe de
   comprendre, que ceci n'est pas (encore) à prendre comme une commande
   « COPY DATABASE » de portée
   générale.
   La principale limitation est qu'aucune autre session ne peut être connectée
   à la base source tant qu'elle est copiée. CREATE
   DATABASE échouera si une autre connexion existe à son lancement.
   Lors de l'opération de copie, les nouvelles connexions à la base source sont
   empêchées.
  
   Deux drapeaux utiles existent dans
   pg_database
   pour chaque base de données : les colonnes
   datistemplate et
   datallowconn. datistemplate
   peut être positionné à vrai pour indiquer qu'une base de données a
   vocation à servir de modèle à CREATE DATABASE. Si ce
   drapeau est positionné à vrai, la base de données peut être clonée
   par tout utilisateur ayant le droit CREATEDB ; s'il est
   positionné à faux, seuls les super-utilisateurs et le propriétaire
   de la base de données peuvent la cloner. Si
   datallowconn est positionné à faux, alors aucune
   nouvelle connexion à cette base de données n'est autorisée (mais
   les sessions existantes ne sont pas terminées simplement en
   positionnant ce drapeau à faux). La base de données
   template0 est normalement marquée
   datallowconn = false pour empêcher qu'elle ne soit
   modifiée. Aussi bien template0 que
   template1 devraient toujours être marquées
   datistemplate = true.
  
    template1 et template0 n'ont pas de
    statut particulier en dehors du fait que template1
    est la base de données source par défaut pour la commande
    CREATE DATABASE. Par exemple, on pourrait supprimer
    template1 et la recréer à partir de
    template0 sans effet secondaire gênant. Ce procédé
    peut être utile lorsqu'on a encombré template1
    d'objets inutiles. (Pour supprimer template1, cette
    dernière doit avoir le statut pg_database.datistemplate à
    false.
   
    La base de données postgres est aussi créé quand le groupe est
    initialisé. Cette base de données a pour but de devenir une base de données
    par défaut pour la connexion des utilisateurs et applications. C'est une
    simple copie de template1 et peut être supprimée et re-créée
    si nécessaire.