Chave Primária e Chave Estrangeira

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
wbarrence
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 55
Registrado em: Qui, 06 Out 2011 10:30 am
Localização: SP
--
WABS

Olá Pessoal,

Alguém saberia me responder, porque numa tabela um campo deva ser chave primária e chave estrangeira ao mesmo tempo???

Att,
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Em teoria quando temo um relacionamento 1 -> 1 isto é viavel, e chega até ser normal ocorrer.

imagine uma estruta usuario/sessao
cada usuário só pode ter uma sessão. Desta forma se cria um registro em uma tabela sessao com uma FK que aponte usuario. Mas para evitar ter que memorizar duas informações, PK e FK, e sabendo que só posso ter 1 registro sessão por usuário, a PK de usuário torna-se a nossa PK de sessão.
Avatar do usuário
wbarrence
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 55
Registrado em: Qui, 06 Out 2011 10:30 am
Localização: SP
--
WABS

Ola gfkauer,

Eu estou eu entendi o significado (relacionamento 1 -> 1), mas até agora não entendi o objetivo, por exemplo, eu tenho duas tabelas TIPO_RELATORIO e SOLICITACAO, na tabela TIPO_RELATORIO eu tenho a PK id_tp_relatorio_pk, e na tabela SOLICITACAO eu tenho a PK id_solicitacao, e nela eu tenho uma FK que também é PK id_tp_relatorio_fk e agora eu quero relacionar uma tabela SOLICITACAO_HIST com a PK id_solicitacao e não consigo.

Att,
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

posta as estruturas completas das 3 tabelas para darmos uma olhada.
Avatar do usuário
wbarrence
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 55
Registrado em: Qui, 06 Out 2011 10:30 am
Localização: SP
--
WABS

Aqui:

Selecionar tudo

CREATE TABLE TIPO_RELATORIO
  (
    ID_TIPO_RELATORIO_PK   NUMBER(8,0) NOT NULL ,
    NM_TIPO_RELATORIO      VARCHAR2(70 BYTE) NOT NULL ,
    ID_ENTIDADE_FK         NUMBER(8,0) NOT NULL ,
    CD_TIPO_RELATORIO      VARCHAR2(10 BYTE) NOT NULL ,
    DS_EXTENSAO_ARQUIVO    VARCHAR2(4 BYTE) NOT NULL ,
    NM_SCAI_APLICACAO      VARCHAR2(50 BYTE),
    NM_SCAI_PERMISSAO      VARCHAR2(100 BYTE),
    NR_ORDEM               NUMBER,
    NR_ORDEM_PROCESSAMENTO NUMBER(3,0),
    DOWNLOAD_DISPONIVEL    VARCHAR2(3 BYTE) NOT NULL ,
    CONSTRAINT PK_DYNRPT_TIPO_RELATORIO PRIMARY KEY (ID_TIPO_RELATORIO_PK) ,
    CONSTRAINT FK_TIPO_RELATORIO_ENTIDADE FOREIGN KEY (ID_ENTIDADE_FK) REFERENCES ENTIDADE (ID_ENTIDADE_PK) 
  )

CREATE TABLE TB_SOLICITACAO
  (
    ID_SOLICITACAO_PK            NUMBER(8,0) NOT NULL ,
    ID_TIPO_RELATORIO_FK         NUMBER(8,0) NOT NULL ,
    ID_ESTABELECIMENTO_SAUDE_FK  NUMBER(8,0) NOT NULL ,
    DH_SOLICITACAO 		 DATE NOT NULL ,
    DH_PROCESSAMENTO             DATE,
    ST_SOLICITACAO               CHAR(1 BYTE) NOT NULL,
    DS_URL_SOLICITACAO           VARCHAR2(100 BYTE),
    DH_INICIO_PROCESSAMENTO      DATE,
    TP_PROCESSAMENTO             CHAR(1 BYTE),
    CONSTRAINT CK_SOLIC_ST_SOLICITACAO CHECK (ST_SOLICITACAO IN ('S', 'P', 'X', 'E', 'L','V','I')) ,
    CONSTRAINT CK_SOLIC_TP_PROCESSAMENTO CHECK (TP_PROCESSAMENTO IN ('O', 'F')) ,
    CONSTRAINT PK_SOLICITACAO PRIMARY KEY (ID_SOLICITACAO_PK, ID_TIPO_RELATORIO_FK),
    CONSTRAINT FK_SOLIC_TIPO_RELATORIO FOREIGN KEY (ID_TIPO_RELATORIO_FK) REFERENCES TIPO_RELATORIO (ID_TIPO_RELATORIO_PK),
    CONSTRAINT FK_SOLIC_ESTAB_SAUDE FOREIGN KEY (ID_ESTAB_SAUDE_FK) REFERENCES ESTAB_SAUDE (ID_ESTAB_SAUDE_PK),
    CONSTRAINT FK_SOLICITACAO_ST_SOLIC FOREIGN KEY (ST_SOLICITACAO) REFERENCES ESTADO_SOLIC (ID_ST_SOLICITACAO_PK)
  );

CREATE TABLE SOLICITACAO_HIST
  (
    ID_SOLIC_HISTORICO_PK       NUMBER(8,0),
    ID_SOLICITACAO_FK           NUMBER(8,0),
    ID_TIPO_RELATORIO_FK        NUMBER(8,0),
    NM_FORMATO_RELATORIO        VARCHAR2(25 BYTE),
    ID_ESTAB_SAUDE_FK           NUMBER(8,0),
    DH_SOLICITACAO              DATE,
    DH_PROCESSAMENTO            DATE,
    ST_SOLICITACAO              CHAR(1 BYTE),
    DH_INICIO_PROCESSAMENTO     DATE,
    TP_PROCESSAMENTO            CHAR(1 BYTE),
    DH_INCLUSAO                 DATE,
    TP_ALTERACAO                CHAR(1 BYTE),
    CONSTRAINT PK_ID_SOLIC_HISTORICO PRIMARY KEY (ID_SOLIC_HISTORICO_PK) 
  );
Avatar do usuário
wbarrence
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 55
Registrado em: Qui, 06 Out 2011 10:30 am
Localização: SP
--
WABS

O meu problema é relacionar o campo ID_SOLICITACAO_FK da tabela SOLICITACAO_HIST, com o campo ID_SOLICITACAO_PK da tabela TB_SOLICITACAO, mas não estou conseguindo porque esse campo é chave primária composta que foi criado desta maneira

Selecionar tudo

CONSTRAINT PK_SOLICITACAO PRIMARY KEY (ID_SOLICITACAO_PK, ID_TIPO_RELATORIO_FK)
e agora estou tentando entender o porquê?
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

tente assim

Selecionar tudo

Select *
  From SOLICITACAO_HIST h
     , TB_SOLICITACAO s
 Where s.ID_SOLICITACAO_PK     = h.ID_SOLICITACAO_FK 
   And s.ID_TIPO_RELATORIO_FK  = h.ID_TIPO_RELATORIO_FK 
Avatar do usuário
wbarrence
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 55
Registrado em: Qui, 06 Out 2011 10:30 am
Localização: SP
--
WABS

Eu quero fazer um relacionamento de uma tabela com a outra, eu quero transformar ID_SOLICITACAO_FK da tabela SOLICITACAO_HIST numa chave estrangeira, relacionada com o campo ID_SOLICITACAO_PK da tabela TB_SOLICITACAO desta maneira:

Selecionar tudo

ALTER TABLE SOLICITACAO_HIST ADD CONSTRAINT FK_SOLIC_HIST_SOLIC FOREIGN KEY (ID_SOLICITACAO_FK)  REFERENCES TB_SOLICITACAO (ID_SOLICITACAO_PK);
Mas não estou conseguindo porque está dando o erro abaixo:

Selecionar tudo

Erro de SQL: ORA-02270: no matching unique or primary key for this column-list 
02270. 00000 -  "no matching unique or primary key for this column-list"
*Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement gives a column-list for which there is no matching unique or primary key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS catalog view
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

O único motivo de ser composta é se existir um mesmo ID_SOLICITAÇÃO para Tipos de Relatório diferente.
Se só existir um único ID_SOLICITAÇÃO em toda tabela para todo ID e a regra de negocio implantada confirme ser essa, então é desnecessária e prejudicial esta composição.

Mas do jeito que está sua FK também precisa ser composta.

Selecionar tudo

ALTER TABLE SOLICITACAO_HIST ADD CONSTRAINT FK_SOLIC_HIST_SOLIC FOREIGN KEY (ID_SOLICITACAO_FK,ID_TIPO_RELATORIO_PK) REFERENCES TB_SOLICITACAO (ID_SOLICITACAO_PK,ID_TIPO_RELATORIO_PK);
Avatar do usuário
wbarrence
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 55
Registrado em: Qui, 06 Out 2011 10:30 am
Localização: SP
--
WABS

Então conforme foi implementado, a idéia é garantir que uma SOLICITACAO só terá um TIPO_RELATORIO?

Conforme você me sugeriu não pode ser implementado porque a tabela TB_SOLICITACAO não tem ID_TIPO_RELATORIO_PK e sim o ID_TIPO_RELATORIO_FK, mas mesmo assim não funciona, ocorre o erro abaixo:

Selecionar tudo

Erro de SQL: ORA-02298: cannot validate (FK_SOLIC_HIST_SOLIC) - parent keys not found
02298. 00000 - "cannot validate (%s.%s) - parent keys not found"
*Cause:    an alter table validating constraint failed because the table has child records.
*Action:   Obvious
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes