PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL crea una tabella se non esiste

Questa funzione è stata implementata in Postgres 9.1 :

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

Per versioni precedenti , ecco una funzione per aggirarlo:

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$;

Chiama:

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

Note:

  • Le colonne schemaname e tablename in pg_tables fanno distinzione tra maiuscole e minuscole. Se virgolette gli identificatori in CREATE TABLE dichiarazione, è necessario utilizzare la stessa identica ortografia. In caso contrario, è necessario utilizzare stringhe minuscole. Vedi:

  • I nomi delle colonne di PostgreSQL fanno distinzione tra maiuscole e minuscole?

  • pg_tables contiene solo tabelle effettive . L'identificatore può ancora essere occupato da oggetti correlati. Vedi:

  • Come verificare se esiste una tabella in un determinato schema

  • Se il ruolo in esecuzione questa funzione non ha i privilegi necessari per creare la tabella che potresti voler usare SECURITY DEFINER per la funzione e rendila di proprietà da un altro ruolo con i privilegi necessari. Questa versione è abbastanza sicura.