Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

É possível um mesmo atributo ser Chave Primária e Chave Estrangeira na mesma tabela?

A dúvida que tenho é sobre a construção de um relacionamento n-n, mas me deparo se a tabela do meio, que faz a ligação (No caso abaixo Tabela Matrícula) poderia ter somente FK ou se a PK seria diferentes das FK ou se a PK pode ser a mesma da FK;

CREATE TABLE Aluno ( Nr_Rgm NUMBER(8) NOT NULL, Nm_Nome VARCHAR2(40) NOT NULL, Nm_Pai VARCHAR2(40), Nm_Mae VARCHAR2(40), Dt_Nascimento DATE NOT NULL, Id_Sexo CHAR(1), CONSTRAINT Aluno_Nr_Rgm_pk PRIMARY KEY (Nr_Rgm) );

CREATE TABLE Classe ( Cd_Classe NUMBER(8) NOT NULL, Nr_AnoLetivo NUMBER(4), Nr_Serie NUMBER(2), Sg_Turma VARCHAR2(2), Cd_Escola NUMBER(6), Cd_Grau NUMBER(2), Cd_Periodo NUMBER(2), CONSTRAINT Cliente_Cd_Classe_pk PRIMARY KEY (Cd_Classe) );

*CREATE TABLE Matricula ( * Nr_Rgm NUMBER(8) NOT NULL, Cd_Classe NUMBER(8) NOT NULL, Dt_Matricula DATE, ** CONSTRAINT Matricula_pk PRIMARY KEY (Nr_Rgm, Cd_Classe), ** CONSTRAINT Matricula_Nr_Rgm_fk FOREIGN KEY (Nr_Rgm) references Aluno(Nr_Rgm), CONSTRAINT Matricula_Cd_Classe_fk FOREIGN KEY (Cd_Classe) references Classe(Cd_Classe) );

Valeu!

2 respostas
solução!

Na verdade o que você quer é transformar o par (Nr_Rgm, Cd_Classe) em uma chave única:

CREATE TABLE Matricula (
    Nr_Rgm decimal(8) NOT NULL,
    Cd_Classe decimal(8) NOT NULL,
    Dt_Matricula DATE,
    --CONSTRAINT Matricula_pk PRIMARY KEY (Nr_Rgm, Cd_Classe),
    CONSTRAINT Matricula_Nr_Rgm_fk FOREIGN KEY (Nr_Rgm) references Aluno(Nr_Rgm),
    CONSTRAINT Matricula_Cd_Classe_fk FOREIGN KEY (Cd_Classe) references Classe(Cd_Classe),
    CONSTRAINT Matricula_uk UNIQUE (Nr_Rgm, Cd_Classe),
);

Assim, a tabela Matricula vai sempre registrar Alunos existentes em Classes existentes, garantindo que esse vínculo não se repita.

Excelente, dessa forma eu não precisaria de uma PK, correto?