PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL crée une table si elle n'existe pas

Cette fonctionnalité a été implémentée dans Postgres 9.1 :

CREATE TABLE IF NOT EXISTS myschema.mytable (i integer);

Pour les anciennes versions , voici une fonction pour contourner ce problème :

CREATE OR REPLACE FUNCTION create_mytable()
  RETURNS void
  LANGUAGE plpgsql AS
$func$
BEGIN
   IF EXISTS (SELECT FROM pg_catalog.pg_tables 
              WHERE  schemaname = 'myschema'
              AND    tablename  = 'mytable') THEN
      RAISE NOTICE 'Table myschema.mytable already exists.';
   ELSE
      CREATE TABLE myschema.mytable (i integer);
   END IF;
END
$func$;

Appel :

SELECT create_mytable();        -- call as many times as you want. 

Remarques :

  • Les colonnes schemaname et tablename dans pg_tables Sont sensibles à la casse. Si vous mettez les identifiants entre guillemets dans CREATE TABLE déclaration, vous devez utiliser exactement la même orthographe. Si vous ne le faites pas, vous devez utiliser des chaînes en minuscules. Voir :

  • Les noms de colonnes PostgreSQL sont-ils sensibles à la casse ?

  • pg_tables ne contient que des tables réelles . L'identifiant peut encore être occupé par des objets associés. Voir :

  • Comment vérifier si une table existe dans un schéma donné

  • Si le rôle exécute cette fonction n'a pas les privilèges nécessaires pour créer la table que vous pourriez vouloir utiliser SECURITY DEFINER pour la fonction et rendez-la possédée par un autre rôle avec les privilèges nécessaires. Cette version est suffisamment sûre.