web-dev-qa-db-fra.com

Postgresql: comment créer une table uniquement si elle n'existe pas déjà?

Dans Postgresql, comment puis-je faire une condition pour créer une table uniquement si elle n'existe pas déjà?

Exemple de code apprécié.

41
Fredriku73

Je ne sais pas quand il a été ajouté, mais pour être complet, je voudrais souligner que dans la version 9.1 (peut-être avant) IF NOT EXISTS peut être utilisé. IF NOT EXISTS ne créera la table que si elle n'existe pas déjà.

Exemple:

CREATE TABLE IF NOT EXISTS users.vip
(
  id integer
)

Cela créera une table nommée vip dans le schéma users si la table n'existe pas.

Source

79
Skalli
create or replace function update_the_db() returns void as
$$
begin

    if not exists(select * from information_schema.tables 
        where 
            table_catalog = CURRENT_CATALOG and table_schema = CURRENT_SCHEMA
            and table_name = 'your_table_name_here') then

        create table your_table_name_here
        (
            the_id int not null,
            name text
        );

    end if;

end;
$$
language 'plpgsql';

select update_the_db();
drop function update_the_db();
21
Michael Buen

Créez simplement la table et ne vous inquiétez pas de son existence. S'il n'existe pas, il sera créé; s'il existe, la table ne sera pas modifiée. Vous pouvez toujours vérifier la valeur de retour de votre requête SQL pour voir si la table existait ou non lorsque vous avez exécuté l'instruction create.

13
Jared

Je pense que vérifier la table pg_class peut peut-être vous aider, quelque chose comme ça:

SELECT COUNT (relname) as a FROM pg_class WHERE relname = 'mytable'

if a = 0 then (CREATE IT)

Cordialement.

10

C'est une vieille question. Je ne fais que revenir pour suggérer une autre réponse. Remarque: d'autres meilleures réponses existent déjà, c'est uniquement à des fins éducatives .

Le moyen le plus simple est de faire ce que les autres ont dit; effectuez la CREATE TABLE si vous souhaitez conserver les données existantes, ou effectuez un DROP IF EXISTS puis une CREATE TABLE, si vous voulez une table fraîchement créée.

Une autre alternative consiste à interroger la table système pour son existence et à partir de là.

SELECT true FROM pg_tables WHERE tablename = <table> [AND schemaname = <schema>];

Utilisé:

-- schema independent:
SELECT true FROM pg_tables WHERE tablename = 'foo';

-- schema dependent:
SELECT true FROM pg_tables WHERE tablename = 'foo' AND schemaname = 'bar';

S'il correspond, vous aurez une vraie valeur, sinon il devrait retourner un ensemble de données vide. Vous pouvez utiliser cette valeur pour déterminer si vous devez effectuer une CREATE TABLE.

6
vol7ron

La meilleure réponse a été donnée par Skalli si vous utilisez Postgresql 9.1+.

Si, comme moi, vous devez le faire avec Postgresql 8.4, vous pouvez utiliser une fonction avec une exception "duplicate_table".

Cela ignorera l'erreur générée lorsque la table existe et continuera à générer d'autres erreurs.

Voici un exemple de travail sur Postgresql 8.4.10:

CREATE FUNCTION create_table() RETURNS VOID AS
$$
BEGIN
    CREATE TABLE my_table_name(my_column INT);
EXCEPTION WHEN duplicate_table THEN
    -- Do nothing
END;
$$
LANGUAGE plpgsql;
2
Stéphane

Ce que j'ai utilisé pour vérifier si une table existe (Java et PostgreSQL) avant de la créer. J'espère que ça aidera quelqu'un. La portion de création de table n'est pas implémentée ici, il suffit de vérifier si une table existe déjà. Passez une connexion à la base de données et à la tableName et il devrait retourner si la table existe ou non.

public boolean SQLTableExists(Connection connection, String tableName) {
    boolean exists = false;

    try {
        Statement stmt = connection.createStatement();
        String sqlText = "SELECT tables.table_name FROM information_schema.tables WHERE table_name = '" + tableName + "'";    
        ResultSet rs = stmt.executeQuery(sqlText);

        if (rs != null) {
            while (rs.next()) {
                if (rs.getString(1).equalsIgnoreCase(tableName)) {
                    System.out.println("Table: " + tableName + " already exists!");
                    exists = true;
                } else { 
                    System.out.println("Table: " + tableName + " does not appear to exist.");
                    exists = false;
                }

            }
        }

    } catch (SQLException sqlex) {
        sqlex.printStackTrace();
    }
    return exists;
}
1
Nobody

La réponse la plus simple est:

catch{

#create table here

}

Cela crée une table s'il n'existe pas et produit une erreur s'il existe. Et l'erreur est détectée.

1
Devon Yoo

http://www.postgresql.org/docs/8.2/static/sql-droptable.html

DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
0
PaulG