2013/4/26 Marcelo da Silva <[email protected]>

>
> Em 26 de abril de 2013 10:02, José Neto Nogueira <[email protected]>escreveu:
>
>  Marcelo, para ficar mais facil, supondo que a tabelaA fosse tabelaProduto
>> e a tabelaB fosse tabelaNotaFiscal, por exemplo, dado que para cada produto
>> eu tenho um codigo que faz parte da PK (chave primaria) eu
>> poderia ter varias repetições deste valor na tabela de nota fiscal na
>> coluna FK que referencia essa PK desde que essa coluna não tivesse outra
>> restrição, como ser UK (uniqqe key), mesmo que essa coluna da FK tenha
>> restrição de NULL você poderia deixar vários nulos ou várias notas fiscais
>> vendendo o mesmo produto, logo repetiria a FK. Isso é permitido pois não
>> sendo PK ou UK pode repetir.
>>
>>
>> 2013/4/26 Marcelo da Silva <[email protected]>
>>
>>> Então Danilo, FKs no meu modo de entender não que deva ter valores
>>> únicos, mas a TabelaA de referencia devem sim ter valores únicos,
>>>  mas na TabelaB podem ser N valores, é o velho 1(A) para N(B)
>>>
>>> TabelaA->Codigo
>>> 1
>>> 2
>>> 3
>>> 4
>>>
>>> TabelaB->Codigo (FK para TabelaA)
>>> 1
>>> 1
>>> 1
>>> 2
>>> 2
>>> 2
>>> 3
>>> 3
>>> 3
>>> ...
>>>
>>> Veja que os valores da TabelaB estão contidos na TabelaA e o FK me
>>> parece que exige isso.
>>> A duvida é se a TabelaB poderia estar ou não na TabelaA, mas quando
>>> estiver deve ter o valor idêntico.
>>> Pelo que vejo isso só é possível por Functions como você citou.
>>>
>>>
>>>
>>>
>>> Em 26 de abril de 2013 09:34, Danilo Silva 
>>> <[email protected]>escreveu:
>>>
>>>>
>>>>
>>>>
>>>> Em 26 de abril de 2013 09:02, Marcelo da Silva <[email protected]>escreveu:
>>>>
>>>>  Sei que ao criamos uma FK o campo lincado devem ter o mesmo conteúdo
>>>>> nas tabelas A e B
>>>>>
>>>>> Exemplo:
>>>>> TabelaA->Codigo = 123
>>>>> TabelaB->Codigo = 123 FK->TabelaA
>>>>>
>>>>> Tenho a seguinte duvida:
>>>>>
>>>>> TabelaB->Codigo pode ser
>>>>> 0
>>>>> 123
>>>>> 0
>>>>> 456
>>>>> etc
>>>>>
>>>>> Queria saber se existe uma FK que diga que quando o valor de B for > 0
>>>>> ele esteja na tabela A, senão ele permite que seja 0 (somente)
>>>>>
>>>>> Isso existe, ou só por Triggers / Procedures ?
>>>>>
>>>>> Até onde eu conheço por FKs, o campo referenciado deve possuir
>>>> valores únicos. Creio que para seu caso deverás criar uma function que faça
>>>> essa verificação.
>>>>
>>>> []s
>>>> Danilo
>>>>
>>>>
>>>> _______________________________________________
>>>> pgbr-geral mailing list
>>>> [email protected]
>>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>>
>>>>
>>>
>>>
>>>



  Então podemos ter N para N quando for FKs (sem unique), entendi...
>

ERRADO! Para ter um N para N é necessário criar uma nova tabela.

Usando o exemplo do José, teriamos as seguintes tabelas:

Produto (codigo, nome, etc.)              NotaFiscal (codigo, cliente, etc.)
           ^                                            ^
           |                                            |
           +-------------            -------------------+
                         \          /
NotaFiscal_X_Produto (cod_prod, cod_nota, qtde, etc.)       --> essa é a
tabela que faz o NxN


Em SQL seria mais ou menos isso (vamos supor que o produto não é
obrigatório em notafiscal_produto, apesar de não fazer sentido, mas
notafiscal é):

CREATE TABLE produto(codigo integer primary key, ...);
CREATE TABLE notafiscal(codigo serial primary key, ...);
CREATE TABLE notafiscal_produto(
    cod_prod integer references produto (codigo), -- > aceita NULL, logo é
um rel. fraco
    cod_nota integer not null references notafiscal (codigo), -- > não
aceita NULL, logo é um rel. forte
    ...
);

Ficou mais claro?


> Minha duvida surgiu porque eu tentei criar uma FK referenciando para um
> Campo PK de outra tabela e ele me forçou a colocar NotNull no campo B
>
> Vivendo e aprendendo :)
>
> Mas no meu caso vou ter que fazer uns malabarismos pois o CampoA é uma PKey
>
>
> --
> Marcelo Silva
> ----------------------------------------------------------------
> Desenvolvedor Delphi / PHP
> My Postgres database
> Cel.: (11) 99693-4251
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>


-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a