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 / 148530
Accepted
AndreKR
AndreKR
Asked: 2016-09-02 02:29:26 +0800 CST2016-09-02 02:29:26 +0800 CST 2016-09-02 02:29:26 +0800 CST

Para que eu usaria uma chave estrangeira MATCH SIMPLE? [duplicado]

  • 772
Esta pergunta já tem respostas aqui :
Diferenças entre CORRESPONDÊNCIA COMPLETA, CORRESPONDÊNCIA SIMPLES e CORRESPONDÊNCIA PARCIAL? (2 respostas)
Fechado há 3 anos .

O que eu entendo:

Além das referências válidas à tabela referenciada, uma coluna com uma chave estrangeira também pode conter um valor NULL. O padrão SQL define vários modos de correspondência para chaves estrangeiras, como MATCH SIMPLE e MATCH FULL. Para chaves estrangeiras de várias colunas, MATCH SIMPLE permite um valor errado (= sem referência) em qualquer uma das colunas, desde que pelo menos uma coluna da chave estrangeira contenha um valor NULL.

As chaves estrangeiras de várias colunas são raras (porque as chaves primárias de várias colunas são), mas posso imaginar casos de uso válidos. Por exemplo, uma tradução de uma postagem de blog pode ter uma chave primária (post_id, language_id). Agora, algo que faça referência a tal tradução (por exemplo, qual tradução um usuário está editando no momento) teria uma chave estrangeira de várias colunas.

O que não entendo:

Por que eu usaria MATCH SIMPLE para minha chave estrangeira?

No exemplo acima, não faz sentido ter uma entrada "atualmente editando" que apenas faz referência a post_ide não a language_id.

Qual seria um exemplo em que faz sentido?

foreign-key constraint
  • 3 3 respostas
  • 3505 Views

3 respostas

  • Voted
  1. nvogel
    2016-09-02T03:51:10+08:002016-09-02T03:51:10+08:00

    Minha preferência é evitar nulos em colunas de chave estrangeira. Torne todas as chaves estrangeiras não anuláveis. Na verdade, tenho chave estrangeira = não nulo como uma verificação padrão em alguns scripts de análise estática que uso para validar projetos de banco de dados.

    O comportamento FULL / SIMPLE é obscuro o suficiente para que, em minha experiência, nem mesmo os especialistas o entendam (sou um especialista e tenho que pensar duas vezes!) Como o ypercube aponta, SIMPLE é efetivamente o padrão no Microsoft SQL Server mas suspeito que a maioria das pessoas que trabalha com esse produto nunca o considerou. Se um de seus objetivos no design do banco de dados é tornar os dados compreensíveis e úteis para o usuário médio, as chaves estrangeiras devem ser não anuláveis.

    • 3
  2. ypercubeᵀᴹ
    2016-09-02T02:47:11+08:002016-09-02T02:47:11+08:00

    Para chaves estrangeiras de várias colunas, MATCH SIMPLEpermite um valor errado (= sem referência) em qualquer uma das colunas, desde que pelo menos uma coluna da chave estrangeira contenha um NULLvalor.

    Não exatamente. Todas as restrições de chave estrangeira permitem que as linhas estejam "erradas" (sem referência) se a linha tiver NULLvalores. MATCH FULLpor exemplo, permitirá uma (NULL, NULL)linha em uma chave estrangeira de duas colunas. Isso também não faz muito sentido para mim. A única diferença é - como você mencionou - que permitirá MATCH SIMPLElinhas enquanto não.(post_id_value, NULL)(NULL, language_id_value)MATCH FULL

    Já vi algumas questões no site onde fazia (alguns) sentido ter MATCH SIMPLEe um valor ser nulo. Os casos geralmente tinham algum design desnormalizado. No seu exemplo ficaria como uma chave estrangeira extra da tabela de histórico, usando apenas uma das duas colunas:

     (post_id) REFEERNCES post (post_id)
    

    Isso permitiria que a tabela de histórico fizesse referência à tabela de tradução quando ambos os valores não fossem nulos e à tabela de postagem quando language_id fosse nulo. Eu mesmo nunca usaria, mas já vi.

    Agora, deixando esses casos estranhos para trás, as duas opções ( MATCH FULLe MATCH SIMPLE) são idênticas se todas as colunas forem definidas com NOT NULL. E como é comum ter colunas não anuláveis ​​em chaves estrangeiras e essa configuração afeta apenas chaves estrangeiras de várias colunas, acho que é por isso que muitos designers geralmente não se preocupam com essa configuração e a deixam como padrão do DBMS ( MATCH SIMPLEno Postgres) .

    Então, para sua pergunta:

    Por que eu usaria MATCH SIMPLEpara minha chave estrangeira?

    Posso contra-perguntar:

    Por que eu usaria NULLpara minhas colunas de chave estrangeira?

    Observe também que a maioria dos DBMS não implementou todas as opções fornecidas pelo padrão SQL. O Postgres não tem MATCH PARTIALe o SQL Server não tem nenhuma opção (todas as chaves estrangeiras se comportam como MATCH SIMPLE).

    • 1
  3. Best Answer
    Renzo
    2016-09-02T13:03:56+08:002016-09-02T13:03:56+08:00

    Você está perguntando:

    Qual seria um exemplo em que faz sentido?

    Aqui está um exemplo muito simples:

    create table student(snum integer primary key,
                         name text);
    create table course(cnum integer primary key,
                        title text);
    create table exam (snum integer references student,
                       cnum integer references course,
                       mark integer check (mark >=1 and mark <= 10),
                       primary key(snum, cnum));
    create table info (snum integer,
                       cnum integer,
                       info text,
                       foreign key (snum) references student,
                       foreign key (cnum) references course,
                       foreign key (snum, cnum) references exam match simple,
                       check (snum is not null or cnum is not null));
    insert into student values (1, 'john'), (2, 'mary'), (3, 'lucy');
    insert into course values (1, 'programming'), (2, 'database');
    insert into exam values (1, 1, 10), (1, 2, 8), (3, 1, 6), (3, 2, 9);
    insert into info values (1, null, 'info about student 1'), 
                            (null, 2, 'info about course 2'), 
                            (1, 1, 'info about exam of student 1 in course 1');
    

    Neste exemplo, a tabela infomantém informações sobre, aluno, cursos e exames, e queremos que essas informações sejam consistentes. Sem match simpleisso não é possível. Observe que, no entanto, a chave estrangeira é verificada:

    insert into info values (2, 2, 'info about exam of student 2 in course 2');
    
    ERROR: insert or update on table "info" violates foreign key constraint "info_snum_fkey1"
    SQL state: 23503
    Detail: Key (snum, cnum)=(2, 2) is not present in table "exam".
    

    Finalmente, observe que no exemplo acima você deve especificar pelo menos um aluno ou um curso;

    insert into info values (null, null, 'nonsense information');
    
    ERROR:  new row for relation "info" violates check constraint "info_check"
    DETAIL:  Failing row contains (null, null, nonsense information).
    
    • 1

relate perguntas

  • Qual é o propósito de SET NULL em restrições de exclusão/atualização de chaves estrangeiras?

  • Restrição de chave estrangeira no campo de valor fixo

  • Tornar um campo exclusivo o torna indexado?

  • Chave estrangeira multicoluna não exclusiva

  • Violação de chave estrangeira - não sei por que

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