CREATE UNIQUE INDEX IF NOT EXISTS in postgreSQL CREATE UNIQUE INDEX IF NOT EXISTS in postgreSQL postgresql postgresql

CREATE UNIQUE INDEX IF NOT EXISTS in postgreSQL


You can check, if an index with a given name does exist by this statement.

If your index name is some_table_some_field_idx

SELECT count(*) > 0FROM pg_class cWHERE c.relname = 'some_table_some_field_idx' AND c.relkind = 'i';

Starting from Postgres 9.5 you can even use

CREATE INDEX IF NOT EXISTS


Just another ready-to-use solution.

PostgreSQL v9.0+:

DO $BLOCK$BEGIN    BEGIN        CREATE INDEX index_name ON table_name( column_name );    EXCEPTION        WHEN duplicate_table        THEN RAISE NOTICE 'index ''index_name '' on table_name already exists, skipping';    END;END;$BLOCK$;

PostgreSQL v9.5+:

CREATE INDEX IF NOT EXISTS index_name ON table_name( column_name );


I have wrapped a_horse_with_no_name's code with PLSQL function for more convenient usage. I hope somebody will find it useful.

CREATE OR REPLACE FUNCTION create_index(table_name text, index_name text, column_name text) RETURNS void AS $$ declare    l_count integer;begin  select count(*)     into l_count  from pg_indexes  where schemaname = 'public'    and tablename = lower(table_name)    and indexname = lower(index_name);  if l_count = 0 then      execute 'create index ' || index_name || ' on ' || table_name || '(' || column_name || ')';  end if;end;$$ LANGUAGE plpgsql;

usage: select create_index('my_table', 'my_index_name', 'id');