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 / 58894
Accepted
user32234
user32234
Asked: 2014-02-14 13:20:08 +0800 CST2014-02-14 13:20:08 +0800 CST 2014-02-14 13:20:08 +0800 CST

Diferenças entre MATCH FULL, MATCH SIMPLE e MATCH PARTIAL?

  • 772

Eu notei um MATCH SIMPLEe MATCH FULL, mas não entendo o que eles fazem. Vejo que o padrão é MATCH SIMPLE; mas, como as outras MATCHcláusulas da FOREIGN KEYrestrição funcionam?

postgresql foreign-key
  • 2 2 respostas
  • 46204 Views

2 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2014-07-15T17:09:01+08:002014-07-15T17:09:01+08:00

    Confira a CREATE TABLEpágina do manual :

    Existem três tipos de correspondência: MATCH FULL, MATCH PARTIALe MATCH SIMPLE (que é o padrão). MATCH FULLnão permitirá que uma coluna de uma chave estrangeira de várias colunas seja nula, a menos que todas as colunas de chave estrangeira sejam nulas; se todos forem nulos, a linha não precisará ter uma correspondência na tabela referenciada. MATCH SIMPLEpermite que qualquer uma das colunas de chave estrangeira seja nula; se algum deles for nulo, a linha não precisará ter uma correspondência na tabela referenciada. MATCH PARTIALainda não está implementado. (É claro que NOT NULLrestrições podem ser aplicadas à(s) coluna(s) de referência para evitar que esses casos surjam.)

    Além disso, no capítulo sobre Chaves Estrangeiras :

    Normalmente, uma linha de referência não precisa satisfazer a restrição de chave estrangeira se alguma de suas colunas de referência for nula. Se MATCH FULL for adicionado à declaração de chave estrangeira, uma linha de referência escapa satisfazendo a restrição somente se todas as suas colunas de referência forem nulas (portanto, uma mistura de valores nulos e não nulos garante a falha de uma MATCH FULL restrição). Se você não quiser que as linhas de referência evitem satisfazer a restrição de chave estrangeira, declare a(s) coluna(s) de referência como NOT NULL.

    E não deixe de consultar o manual atual ou a versão que corresponde à sua instalação. Não caia em links desatualizados do Google para versões desatualizadas.

    • 61
  2. Evan Carroll
    2019-01-09T07:51:59+08:002019-01-09T07:51:59+08:00

    FULLvs SIMPLEvsPARTIAL

    Embora a resposta escolhida esteja correta, se isso for novo para você, você pode querer vê-lo com código - acho que é mais fácil grocar dessa maneira.

    -- one row with (1,1)
    CREATE TABLE foo ( a int, b int,
      PRIMARY KEY (a,b)
    );
    INSERT INTO foo (a,b) VALUES (1,1);
    
    --
    -- two child tables to reference it
    -- 
    CREATE TABLE t_full ( a int, b int,
      FOREIGN KEY (a,b) REFERENCES foo MATCH FULL
    );
    CREATE TABLE t_simple ( a int, b int,
      FOREIGN KEY (a,b) REFERENCES foo MATCH SIMPLE
    );
    

    Logicamente, com FULLe SIMPLE, podemos inserir uma correspondência completa.

    -- works
    INSERT INTO t_full (a,b) VALUES (1,1);
    INSERT INTO t_simple (a,b) VALUES (1,1);
    

    O problema surge quando uma das colunas é NULL.

    -- works
    INSERT INTO t_simple (a,b) VALUES (1,NULL);
    
    -- fails
    INSERT INTO t_full (a,b) VALUES (1,NULL);
    

    O insert into t_fullgera o seguinte erro,

    ERROR:  insert or update on table "t_full" violates foreign key constraint "t_full_a_fkey"
    DETAIL:  MATCH FULL does not allow mixing of null and nonnull key values.
    INSERT 0 1
    

    Ok, então e (42,NULL)-- esta é a parte que eu sempre achei confusa MATCH SIMPLE,

    -- works
    INSERT INTO t_simple (a,b) VALUES (42,NULL);
    

    O comportamento acima NÃO funcionaria com o unimplemented MATCH PARTIAL, que provavelmente faz o que você deseja para um índice composto em que a coluna mais à direita é NULLeliminada. No entanto, algumas pessoas veem isso como um método de abrir a caixa de Pandora para um design ruim.

    Definições simples e mnemônicos

    • MATCH FULLtudo deve corresponder totalmente ou todas as colunas devem serNULL
    • MATCH SIMPLEse uma coisa é NULLa restrição é simplesmente ignorada.
    • MATCH PARTIALse uma coisa é NULLo fato de que nem tudo é NULLparcialmente recuperado fazendo algo sensato para o propósito da restrição.

    Notas de especificação SQL

    Para a posteridade, aqui estão as definições do SQL Spec no<match type>

    • MATCH SIMPLEse pelo menos uma coluna de referência for nula, a linha da tabela de referência passará na verificação de restrição. Se todas as colunas de referência não forem nulas, a linha passará na verificação de restrição se e somente se houver uma linha da tabela referenciada que corresponda a todas as colunas de referência.
    • MATCH PARTIAL: se todas as colunas de referência forem nulas, a linha da tabela de referência passará na verificação de restrição. Se pelo menos uma coluna de referência não for nula, a linha passará na verificação de restrição se e somente se houver uma linha da tabela referenciada que corresponda a todas as colunas de referência não nulas.
    • MATCH FULL: se todas as colunas de referência forem nulas, a linha da tabela de referência passará na verificação de restrição. Se todas as colunas de referência não forem nulas, a linha passará na verificação de restrição se e somente se houver uma linha da tabela referenciada que corresponda a todas as colunas de referência. Se alguma coluna de referência for nula e outra coluna de referência não for nula, a linha da tabela de referência violará a verificação de restrição.

    Embora isso não seja específico do PostgreSQL, esses exemplos são demonstrados com o PostgreSQL

    • 25

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