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]