Ok, obrigado...


________________________________
De: J. Laurindo Chiappa <jlchia...@yahoo.com.br>
Para: oracle_br@yahoogrupos.com.br 
Enviadas: Segunda-feira, 22 de Outubro de 2012 12:45
Assunto: [oracle_br] Re: Ajuda no entendimento em constraint FK

  
Colega, cito aqui o Desprezado, Ignorado e quase NUNCA lido manual "Oracle® 
Database Concepts" (no caso 10g, mas vale pra qquer versão AFAIK) no capítulo 
21 - Data Integrity , no item "Nulls and Foreign Keys" :


" 
Nulls and Foreign Keys

The relational model permits the value of foreign keys either to match the 
referenced primary or unique key value, or be null. If any column of a 
composite foreign key is null, then the non-null portions of the key do not 
have to match any corresponding portion of a parent key.
"

===> OU SEJA, quando vc tem NULLs numa chave composta (o que É o seu caso) , os 
outros valores não-nulos Não Vão precisar atender à nenhuma parte da chave-pai 
- isso é uma ocorrência Natural do fato de um NULL ser um valor DESCONHECIDO, 
que não é IGUAL a NADA nem DIFERENTE de nada, então Não Há como vc comparar 
NULOS com uma PK que (é Claro) tem que ser completa.... O seu exemplo :

SYSTEM@O10GR2::SQL>create table x1 (t1 number(1) not null, t2 number(2) not 
null);

Tabela criada.

SYSTEM@O10GR2::SQL>alter table x1 add constraint PK01 primary key (t1,t2) ;

Tabela alterada.

SYSTEM@O10GR2::SQL>create table x2 (t1 number(1) not null, t2 number(2));

Tabela criada.

SYSTEM@O10GR2::SQL>alter table x2 add constraint FK01 foreign key (t1,t2) 
references x1 (t1,t2);

Tabela alterada.

SYSTEM@O10GR2::SQL>insert into x1 values (1,1);

1 linha criada.

SYSTEM@O10GR2::SQL>commit;

Commit concluido.

SYSTEM@O10GR2::SQL>insert into x2 values (3, null);

1 linha criada.

SYSTEM@O10GR2::SQL>insert into x2 values (1, null);

1 linha criada.

SYSTEM@O10GR2::SQL>commit;

Commit concluido.

SYSTEM@O10GR2::SQL>select * from x1;

T1 T2
------------------ ------------------
1 1

SYSTEM@O10GR2::SQL>select * from x2;

T1 T2
------------------ ------------------
3
1

==> Ululantemente óbvio, SE vc tem uma chave que deve ser verificada NA 
ÍNTEGRA, os valores-filhos Não PODEM, por definição, serem Ignorados/Não 
existentesm que é a função do nulo ..... Alterando o exemplo para atender à 
chave completa :

SYSTEM@O10GR2::SQL>truncate table X2;

Tabela truncada.

SYSTEM@O10GR2::SQL>alter table x2 modify (t2 not null);

Tabela alterada.

SYSTEM@O10GR2::SQL>insert into x2 values(1,1);

1 linha criada.

SYSTEM@O10GR2::SQL>insert into x2 values(1,null);
insert into x2 values(1,null)
*
ERRO na linha 1:
ORA-01400: n?o e possivel inserir NULL em ("SYSTEM"."X2"."T2")

SYSTEM@O10GR2::SQL>insert into x2 values(1,0);
insert into x2 values(1,0)
*
ERRO na linha 1:
ORA-02291: restric?o de integridade (SYSTEM.FK01) violada - chave m?e n?o 
localizada

SYSTEM@O10GR2::SQL>select * from x1;

T1 T2
------------------ ------------------
1 1

SYSTEM@O10GR2::SQL>select * from x2;

T1 T2
------------------ ------------------
1 1

SYSTEM@O10GR2::SQL>

===> Agora sim, ele ESTÁ validando a chave na íntegra, okdoc ?

[]s

Chiappa


--- Em mailto:oracle_br%40yahoogrupos.com.br, Jales Jose Moraes 
<malphigjjm@...> escreveu
>
> Pessoal ao fazer uma pequena migração, me deparei com a situação abaixo 
> (script).  Foi implementado uma FK entre as tabelas X1 e X2 (na tabela X2 um 
> campo da FK é null). Acontece que na carga da tabela FK o oracle está 
> aceitando valores nulos e outros valores númericos que não constam na tabela 
> pai. 
>  
> Bom, pelo meu entendimento de FK isso não poderia acontecer.  É possível um 
> auxilio para mim resolver a questão? Porque como isso está PASSANDO, meus 
> joins não trazem os dados veridicos.
> 
> 
> create table 
>  alter table x1 add constraint PK01 primary key (t1,t2) using index 
> tablespace orad;
> 
> create table x2 (t1 number(1) not null, t2 number(2));alter table x2 add 
> constraint FK01 foreign key (t1,t2) references x1 (t1,t2);
> 
> insert into x1 values (1,1);commit;
> 
> insert into x2 values (3, null);insert into x2 values (1, null);
> 
> select 
>  
>  * from x2;x1 (t1 number(1) not null, t2 number(2) not null);
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




[As partes desta mensagem que não continham texto foram removidas]

Responder a