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
ettablename
danspg_tables
Sont sensibles à la casse. Si vous mettez les identifiants entre guillemets dansCREATE 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.