如果不是postgreSQL中的EXISTS,则创建独特的索引

时间:2014-07-10 10:32:30

标签: sql postgresql ddl

很高兴我想在PostgreSQL中做类似

的事情
CREATE UNIQUE INDEX IF NOT EXISTS

有什么想法吗?

6 个答案:

答案 0 :(得分:10)

如果此语句中存在具有给定名称的索引,则可以检查。

如果您的索引名称为<!DOCTYPE html>

some_table_some_field_idx

从Postgres 9.5开始,您甚至可以使用

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

答案 1 :(得分:6)

另一种即用型解决方案。

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

答案 2 :(得分:5)

我已将a_horse_with_no_name的代码与PLSQL函数包装在一起,以方便用户使用。我希望有人会发现它很有用。

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;

用法:     选择create_index('my_table','my_index_name','id');

答案 3 :(得分:4)

你需要一些程序代码,像这样(未经测试!):

do
$$
declare 
   l_count integer;
begin
  select count(*)
     into l_count
  from pg_indexes
  where schemaname = 'public'
    and tablename = 'your_table'
    and indexname = 'your_index_name';

  if l_count = 0 then 
     execute 'create unique index public.your_index_name on public.your_table(id)';
  end if;

end;
$$

答案 4 :(得分:0)

如果您仍然遇到以前的版本,我建议不要使用count,而只是直接在if条件中查询。使代码更简单。你可以尝试这样的事情:

do 
$$
begin
if not exists (
    select indexname
        from pg_indexes
    where schemaname = 'schemaname'
        and tablename = 'tablename'
        and indexname = 'indexname'
)
then
    create unique indexname (...);
end if;
end 
$$;

答案 5 :(得分:0)

支持多列索引的另一种解决方案,基于@Kragh回答

CREATE or replace FUNCTION create_index(_index text, _table text, VARIA

DIC param_args text[]) RETURNS void AS
$$
declare 
   l_count integer;
begin
    select count(*) into l_count
    from pg_indexes
    where schemaname = 'public'
        and tablename = lower(_table)
        and indexname = lower(_index);

    if l_count = 0 then
        EXECUTE format('create index %I on %I (%s)', _index, _table, array_to_string($3,','));
    end if;
END;
$$
LANGUAGE plpgsql;

然后你可以像任何其他pg函数一样使用它:

select create_index('events_timestamp_type_idx', 'events', 'timestamp', 'type');