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 / 11047
Accepted
Frosty Z
Frosty Z
Asked: 2012-01-21 07:14:00 +0800 CST2012-01-21 07:14:00 +0800 CST 2012-01-21 07:14:00 +0800 CST

Como recuperar dados de restrições de chave estrangeira

  • 772

Estou procurando uma consulta que permita recuperar informações de chave estrangeira (cada linha: tabela e campo de referência, tabela e campo de referência) de um esquema inteiro.

Encontrei isso, mas não fornece todas as informações que preciso: https://stackoverflow.com/questions/4389228/sql-for-oracle-to-check-if-a-constraint-exists

Atualmente estou trabalhando nisso e pode acabar com uma solução nos próximos minutos/horas. Mas se alguém já tiver uma solução completa de trabalho, ficarei feliz em saber :)

oracle query
  • 4 4 respostas
  • 33134 Views

4 respostas

  • Voted
  1. Best Answer
    Frosty Z
    2012-01-21T07:31:49+08:002012-01-21T07:31:49+08:00

    Após alguma "engenharia reversa" nas consultas feitas pela ferramenta Navicat ao abrir a janela da tabela de design para uma tabela (consultas que recuperam informações sobre chaves estrangeiras aparecem na janela de histórico ), aqui está uma solução:

    SELECT
        CONS.CONSTRAINT_NAME,
        CONS.TABLE_NAME,
        COLS.COLUMN_NAME,
        CONS.R_CONSTRAINT_NAME,
        CONS_R.TABLE_NAME R_TABLE_NAME,
        COLS_R.COLUMN_NAME R_COLUMN_NAME
    
    FROM USER_CONSTRAINTS CONS
        LEFT JOIN USER_CONS_COLUMNS COLS ON COLS.CONSTRAINT_NAME = CONS.CONSTRAINT_NAME
        LEFT JOIN USER_CONSTRAINTS CONS_R ON CONS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME
        LEFT JOIN USER_CONS_COLUMNS COLS_R ON COLS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME
    
    -- returns only foreign key constraints
    WHERE CONS.CONSTRAINT_TYPE = 'R'
    
    ORDER BY CONS.TABLE_NAME, COLS.COLUMN_NAME
    
    • 16
  2. thatjeffsmith
    2017-02-03T10:25:48+08:002017-02-03T10:25:48+08:00

    O SQL Developer vem com um relatório que faz exatamente isso.

    Ele faz isso apenas para o esquema de login, mas é uma solução rápida fazer com que ele obtenha todos os FK no banco de dados - embora você possa omitir esquemas como 'APEX...' e 'SYS.'

    Ele também omite coisas como tabelas na lixeira.

    O relatório original está no painel Relatórios, nos relatórios do dicionário de dados.

    Aqui está a consulta alterada para obter TODOS os FKs.

        SELECT
        c.owner "Owner",
        c.table_name "Table_Name",
        c.constraint_name "Constraint_Name",
        c.delete_rule "Delete_Rule",
        d.columns,
        c.r_owner "Owner of Related Table",
        (
            SELECT
                r.table_name
            FROM
                sys.all_constraints r
            WHERE
                c.r_owner = r.owner
            AND
                c.r_constraint_name = r.constraint_name
        ) "Related Table",
        c.r_constraint_name "Related Constraint"
    FROM
        sys.all_constraints c,
        (
            SELECT
                a.owner,
                a.table_name,
                a.constraint_name,
                MAX(
                    DECODE(position,1,substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,2,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,3,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,4,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,5,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,6,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,7,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,8,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,9,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,10,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,11,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,12,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,13,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,14,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,15,','
                     ||  substr(column_name,1,30),NULL)
                )
                 ||  MAX(
                    DECODE(position,16,','
                     ||  substr(column_name,1,30),NULL)
                ) columns
            FROM
                sys.all_constraints a,
                sys.all_cons_columns b
            WHERE
                a.constraint_name = b.constraint_name
            AND
                a.owner = b.owner
            AND
                a.constraint_type = 'R'
            AND
                substr(a.table_name,1,4) != 'BIN$'
            AND
                substr(a.table_name,1,3) != 'DR$'
            AND (
                    :table_name IS NULL
                OR
                    instr(upper(a.table_name),upper(:table_name) ) > 0
            ) GROUP BY
                a.owner,
                a.table_name,
                a.constraint_name
        ) d
    WHERE
        c.owner = d.owner
    AND
        c.table_name = d.table_name
    AND
        c.constraint_name = d.constraint_name
    ORDER BY
        c.owner,
        c.table_name,
        c.constraint_name
    

    E aqui está o que esse relatório parece.

    insira a descrição da imagem aqui

    • 3
  3. gavenkoa
    2013-02-22T06:00:47+08:002013-02-22T06:00:47+08:00

    Um código um pouco complicado que também despeja comentários em cols (com base no código Frosty):

    SELECT
        dt.table_name, dt.column_name, dt.data_type, dt.data_length,
        constr.r_tbl r_table, constr.r_col r_column,
        comm.comments
      FROM user_col_comments comm, user_tab_columns dt
      LEFT OUTER JOIN (
        SELECT
          cons.table_name tbl,
          cols.column_name col,
          cons_r.table_name r_tbl,
          cols_r.column_name r_col
        FROM user_constraints cons
          LEFT JOIN user_cons_columns cols ON cols.constraint_name = cons.constraint_name
          LEFT JOIN user_constraints cons_r ON cons_r.constraint_name = cons.r_constraint_name
          LEFT JOIN user_cons_columns cols_r ON cols_r.constraint_name = cons.r_constraint_name
        WHERE cons.constraint_type = 'R'
        ) constr ON constr.tbl = dt.table_name AND constr.col = dt.column_name
      WHERE dt.table_name = comm.table_name
        AND dt.column_name = comm.column_name
      ORDER BY dt.table_name, dt.column_name
      ;
    

    Para tornar a saída mais legível eu uso break on TABLE_NAME;em sqlplus(veja minha pergunta https://stackoverflow.com/questions/14998296/print-only-first-unique-value-for-column-that-order-by-in-oracle-sqlplus / ).

    UPDATE Consulta mais simples que coleta lista de tabelas que possuem referência FK para determinada tabela (útil se você quiser limpar restrições após renomear tabelas):

    select * from SYS.USER_CONSTRAINTS cons
      join SYS.USER_CONSTRAINTS rcons on rcons.CONSTRAINT_NAME = cons.R_CONSTRAINT_NAME
      where cons.CONSTRAINT_TYPE = 'R' and rcons.TABLE_NAME 'TBL_NAME';
    
    select * from SYS.USER_CONSTRAINTS cons
      join SYS.USER_CONSTRAINTS rcons on rcons.CONSTRAINT_NAME = cons.R_CONSTRAINT_NAME
      where cons.CONSTRAINT_TYPE = 'R' and rcons.TABLE_NAME like '%/_OLD' escape '/';
    
    • 2
  4. Takis Katsoulis
    2021-09-29T04:04:22+08:002021-09-29T04:04:22+08:00

    Descobri que a maioria desses scripts tem problemas quando a restrição de chave estrangeira faz referência a uma tabela com mais de uma referência de coluna.

    Aqui está o que eu uso:

        SELECT c.constraint_name,
               l.table_name,
               l.column_name,
               r.table_name,
               r.column_name
          FROM user_constraints c,
               user_cons_columns l,
               user_cons_columns r
         WHERE l.table_name = c.table_name
        -- AND c.table_name = :tname
           AND c.r_constraint_name = r.constraint_name
           AND c.constraint_name = l.constraint_name
           AND l.position = r.position
    
    • 2

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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