Dans un script MySQL, vous pouvez écrire:
CREATE TABLE IF NOT EXISTS foo ...;
... d'autres choses ...
et puis vous pouvez exécuter le script plusieurs fois sans recréer la table.
Comment faites-vous cela dans PostgreSQL?
la source
Dans un script MySQL, vous pouvez écrire:
CREATE TABLE IF NOT EXISTS foo ...;
... d'autres choses ...
et puis vous pouvez exécuter le script plusieurs fois sans recréer la table.
Comment faites-vous cela dans PostgreSQL?
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 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$ LANGUAGE plpgsql;
Appel:
SELECT create_mytable(); -- call as many times as you want.
Remarques:
Les colonnes schemaname
et tablename
in pg_tables
sont sensibles à la casse. Si vous doublez les identifiants dans l' CREATE TABLE
instruction, vous devez utiliser exactement la même orthographe. Sinon, vous devez utiliser des chaînes en minuscules. Voir:
pg_tables
ne contient que des tableaux réels . L'identifiant peut encore être occupé par des objets associés. Voir:
Si le rôle exécutant cette fonction ne dispose pas des privilèges nécessaires pour créer la table, vous souhaiterez peut-être l'utiliser SECURITY DEFINER
pour la fonction et la faire appartenir à un autre rôle disposant des privilèges nécessaires. Cette version est suffisamment sûre.
CREATE FUNCTION
qu'une seule fois. C'estSELECT create_mytable();
que vous voudrez peut-être appeler plusieurs fois.Essaye ça:
la source
IF NOT EXISTS
option.J'ai créé une solution générique à partir des réponses existantes qui peuvent être réutilisées pour n'importe quelle table:
Usage:
Il pourrait être simplifié davantage de ne prendre qu'un seul paramètre si l'on extrayait le nom de la table du paramètre de requête. J'ai également omis les schémas.
la source
Cette solution est quelque peu similaire à la réponse d'Erwin Brandstetter, mais n'utilise que le langage sql.
Toutes les installations PostgreSQL n'ont pas le langage plpqsql par défaut, cela signifie que vous devrez peut-être appeler
CREATE LANGUAGE plpgsql
avant de créer la fonction, et ensuite supprimer à nouveau le langage, pour laisser la base de données dans le même état qu'avant (mais seulement si la base de données n'avait pas le langage plpgsql pour commencer). Voyez comment la complexité grandit?L'ajout de plpgsql peut ne pas poser de problème si vous exécutez votre script localement, cependant, si le script est utilisé pour configurer le schéma chez un client, il peut ne pas être souhaitable de laisser des modifications comme celle-ci dans la base de données des clients.
Cette solution est inspirée d' un article d'Andreas Scherbaum .
la source
Il n'y a pas de CREATE TABLE IF NOT EXISTS ... mais vous pouvez écrire une procédure simple pour cela, quelque chose comme:
la source
Il n'y a pas de CREATE TABLE IF NOT EXISTS ... mais vous pouvez écrire une procédure simple pour cela, quelque chose comme:
la source