AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 35616
Accepted
GuidoS
GuidoS
Asked: 2013-02-28 12:39:14 +0800 CST2013-02-28 12:39:14 +0800 CST 2013-02-28 12:39:14 +0800 CST

Criar índice se não existir

  • 772

Estou trabalhando em uma função que me permite adicionar um índice se ele não existir. Estou enfrentando o problema que não consigo obter uma lista de índices para comparar. Alguma ideia?

Este é um problema semelhante ao da criação da coluna que é resolvido com este código:
https://stackoverflow.com/a/12603892/368511

postgresql index
  • 2 2 respostas
  • 106631 Views

2 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2013-02-28T14:22:44+08:002013-02-28T14:22:44+08:00

    Nomes de índice no PostgreSQL

    • Os nomes de índice são exclusivos em um único esquema de banco de dados.
    • Os nomes de índice não podem ser iguais a qualquer outro índice, tabela (estrangeira), exibição (materializada), sequência ou tipo composto definido pelo usuário no mesmo esquema.
    • Duas tabelas no mesmo esquema não podem ter um índice com o mesmo nome. (Segue logicamente.)

    Se você não se importa com o nome do índice, faça com que o Postgres o nomeie automaticamente:

    CREATE INDEX ON tbl1 (col1);
    

    é (quase) o mesmo que:

    CREATE INDEX tbl1_col1_idx ON tbl1 USING btree (col1);
    

    Exceto que o Postgres evitará colisões de nomenclatura e escolherá automaticamente o próximo nome livre:

    tbl1_col1_idx 
    tbl1_col1_idx2
    tbl1_col1_idx3
    ...
    

    Apenas tente. Mas, obviamente, você não gostaria de criar vários índices redundantes. Portanto, não seria uma boa ideia criar um novo às cegas.

    Teste de existência

    Postgres 9.5 ou mais recente

    Agora disponível:

    CREATE INDEX IF NOT EXISTS ...

    Também funciona para CREATE INDEX CONCURRENTLY IF NOT EXISTS.

    No entanto, o manual adverte :

    Observe que não há garantia de que o índice existente seja semelhante ao que teria sido criado.

    É uma verificação simples para o nome do objeto. (Aplica-se a variantes para versões mais antigas abaixo também.)
    Para encontrar índices existentes na mesma tabela para a(s) mesma(s) coluna(s):

    SELECT pg_get_indexdef(indexrelid)
    FROM   pg_index
    WHERE  indrelid = 'public.big'::regclass
    AND   (indkey::int2[])[:] = ARRAY (
       SELECT attnum
       FROM   unnest('{usr_id, created_at}'::text[]) WITH ORDINALITY i(attname, ord)
       JOIN  (
          SELECT attname, attnum
          FROM   pg_attribute
          WHERE  attrelid = 'public.big'::regclass
          ) a USING (attname)
       ORDER BY ord
       );
    

    Restrições:

    • Funciona apenas para colunas, não para outras expressões de índice.
    • Também relata índices parciais (com WHEREcláusula) e índices de cobertura (com INCLUDEcláusula).
    • Relata qualquer tipo de índice, não apenas índices de árvore B.

    Estude os resultados (se houver) antes de prosseguir ou refine a consulta de acordo com suas necessidades...

    Leitura adicional:

    • Encontre tabelas com vários índices na mesma coluna
    • Normalize os subscritos de matriz para matriz unidimensional para que comecem com 1

    Postgres 9.4

    Você pode usar a nova função to_regclass()para verificar sem lançar uma exceção:

    DO
    $$
    BEGIN
       IF to_regclass('myschema.mytable_mycolumn_idx') IS NULL THEN
          CREATE INDEX mytable_mycolumn_idx ON myschema.mytable (mycolumn);
       END IF;
    
    END
    $$;
    

    Retorna NULL se um índice (ou outro objeto) com esse nome não existir. Ver:

    • Como verificar se uma tabela existe em um determinado esquema

    Isso não funciona para CREATE INDEX CONCURRENTLY, pois essa variante não pode ser encapsulada em uma transação externa. Veja o comentário de @Gregory abaixo.

    Postgres 9.3 ou anterior

    Transmita o nome qualificado pelo esquema para regclass:

    SELECT 'myschema.myname'::regclass;
    

    Se lançar uma exceção, o nome é livre.
    Ou, para testar o mesmo sem lançar uma exceção, use uma DOinstrução:

    DO
    $$
    BEGIN
       IF NOT EXISTS (
          SELECT
          FROM   pg_class c
          JOIN   pg_namespace n ON n.oid = c.relnamespace
          WHERE  c.relname = 'mytable_mycolumn_idx'
          AND    n.nspname = 'myschema'
       ) THEN
        
            CREATE INDEX mytable_mycolumn_idx ON myschema.mytable (mycolumn);
        END IF;
    END
    $$;
    

    A DOdeclaração foi introduzida com o Postgres 9.0. Nas versões anteriores, você precisa criar uma função para fazer o mesmo.
    Detalhes sobre pg_classno manual .
    Noções básicas sobre índices no manual .

    • 123
  2. Sergey Mirvoda
    2015-04-09T23:22:57+08:002015-04-09T23:22:57+08:00

    Estará disponível em 9.5. Aqui está o git commit real https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947

    Discussão sobre hackers pg http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html

    • 13

relate perguntas

  • Quanto "Padding" coloco em meus índices?

  • Sequências Biológicas do UniProt no PostgreSQL

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve