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

use*_*578 8 sql postgresql ddl

我想在PostgreSQL中做类似的事情

CREATE UNIQUE INDEX IF NOT EXISTS
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Tor*_*rge 11

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

如果您的索引名称是 some_table_some_field_idx

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

从Postgres 9.5开始你甚至可以使用

CREATE INDEX IF NOT EXISTS
Run Code Online (Sandbox Code Playgroud)


vol*_*avl 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$;
Run Code Online (Sandbox Code Playgroud)

PostgreSQL v9.5 +:

CREATE INDEX IF NOT EXISTS index_name ON table_name( column_name );
Run Code Online (Sandbox Code Playgroud)


Kra*_*agh 5

我已经使用PLSQL函数包装了a_horse_with_no_name的代码,以便更方便地使用.我希望有人会发现它很有用.

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;
Run Code Online (Sandbox Code Playgroud)

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

  • 顺便说一句,遗憾的是CREATE INDEX IF NOT EXISTS语法没有添加CREATE TABLE IF NOT EXISTS(在PG 9.1中添加)! (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;
$$
Run Code Online (Sandbox Code Playgroud)