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 / 341568
Accepted
Evan Carroll
Evan Carroll
Asked: 2024-08-12 09:43:12 +0800 CST2024-08-12 09:43:12 +0800 CST 2024-08-12 09:43:12 +0800 CST

Como posso encontrar todas as violações de uma chave estrangeira proposta em todas as colunas com um nome específico?

  • 772

Digamos que eu tenha várias tabelas com uma coluna foobar. E eu desejo fazer com que todas essas colunas sejam referenciadas foobar.idcomo um arquivo FOREIGN KEY. O problema é que sei que há violações nesse esquema por parte da parte de quem estou importando os dados. Mas prefiro não encontrá-los todos iterativamente.

Como posso encontrar todas as violações para preparar um relatório de questões de integridade de dados para terceiros?

postgresql
  • 1 1 respostas
  • 21 Views

1 respostas

  • Voted
  1. Best Answer
    Evan Carroll
    2024-08-12T09:43:12+08:002024-08-12T09:43:12+08:00

    Usando\gexec

    Esta consulta irá gerar uma consulta que poderemos executar posteriormente. Se estivermos usando psqlpodemos usar \gexecpara executar o retorno da última consulta - um recurso feito especificamente para esse tipo de coisa,

    WITH pkey(table_catalog, table_schema, table_name, column_name)
        AS ( VALUES ('db', 'schema', 'table', 'pkey') ),
    fkey(column_name) AS ( VALUES ('table_fkey') )
    SELECT FORMAT(
        $$
        SELECT DISTINCT %I
        FROM ( %s ) AS v(%I)
        WHERE NOT EXISTS (
            SELECT 1
            FROM %I.%I.%I AS p
            WHERE p.%I = v.%I
        )
        $$,
        pkey.column_name,
        string_agg( sql.stmt, 'UNION ALL'),
        pkey.column_name,
        pkey.table_catalog, pkey.table_schema, pkey.table_name,
        pkey.column_name,
        pkey.column_name
    
    )
    FROM (
        SELECT FORMAT(
            $$
            SELECT %I FROM %I.%I.%I
            $$,
            c.column_name, c.table_catalog, c.table_schema, c.table_name
        )
        FROM information_schema.columns AS c
        INNER JOIN fkey USING ( column_name )
    ) AS sql(stmt)
    CROSS JOIN pkey
    GROUP BY pkey.table_catalog, pkey.table_schema, pkey.table_name, pkey.column_name;
    

    Dado algo como,

    WITH pkey(table_catalog, table_schema, table_name, column_name)
        AS ( VALUES ('tec', 'tec', 'codes_schedule', 'schedule_id') ),
    fkey(column_name) AS ( VALUES ('schedformtypecd') )
    ...
    

    Ele produzirá uma consulta como esta,

    SELECT DISTINCT schedule_id                                   
    FROM (                                                        
            SELECT schedformtypecd FROM tec.tec.c_contributiondata
            UNION ALL                                             
            SELECT schedformtypecd FROM tec.tec.c_creditdata      
            UNION ALL                                             
            SELECT schedformtypecd FROM tec.tec.c_debtdata        
            UNION ALL                                             
            SELECT schedformtypecd FROM tec.tec.c_expenddata      
            UNION ALL                                             
            SELECT schedformtypecd FROM tec.tec.c_expendrepayment 
            UNION ALL                                             
            SELECT schedformtypecd FROM tec.tec.c_loandata        
            UNION ALL                                             
            SELECT schedformtypecd FROM tec.tec.c_pledgedata      
            UNION ALL                                             
            SELECT schedformtypecd FROM tec.tec.c_traveldata      
            UNION ALL                                             
            SELECT schedformtypecd FROM tec.tec.c_assetdata       
            UNION ALL                                             
            SELECT schedformtypecd FROM tec.tec.c_candidatedata   
             ) AS v(schedule_id)                                  
    WHERE NOT EXISTS (                                            
            SELECT 1                                              
            FROM tec.tec.codes_schedule AS p                      
            WHERE p.schedule_id = v.schedule_id                   
    )                                                             
    AND schedule_id is NOT NULL                                   
    

    Que depois de executado \gexecirá gerar

     schedule_id 
    -------------
     A
     B2
     M
     t-ctr
    (4 rows)
    

    Quais são todas as exceções no banco de dados que impediriam você de criar uma chave estrangeira geral schedformtypecdparatec.tec.codes_schedule.schedule_id


    Exemplo retirado de db-Texas-Ethics-Commission

    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • 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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • 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
    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