2
respostas

Está dando erro

Está dando erro! Alguém sabe me ajudar?

CREATE TABLE aluno_curso ( aluno_id INTEGER, curso_id INTEGER, PRIMARY KEY (aluno_id, curso_id),

    FOREIGN KEY (aluno_id)
     REFERENCES aluno (id),

    FOREIGN KEY (curso_id)
     REFERENCES curso (id)

);

ERROR: não há restrição de unicidade que corresponde com as colunas informadas na tabela referenciada "aluno"

ERRO: não há restrição de unicidade que corresponde com as colunas informadas na tabela referenciada "aluno" SQL state: 42830

2 respostas

Consegui resolver usando dessa forma!!!!

CREATE TABLE aluno (
    id INTEGER PRIMARY KEY,
    nome TEXT 
);

CREATE TABLE curso (
    id INTEGER PRIMARY KEY,
    nome TEXT 
);

Depois isso:

CREATE TABLE aluno_curso (
    aluno_id INTEGER,
        curso_id INTEGER,
        PRIMARY KEY (aluno_id, curso_id),

        FOREIGN KEY (aluno_id)
         REFERENCES aluno (id),

        FOREIGN KEY (curso_id)
         REFERENCES curso (id)
);

Mais fiquei com dúvida, por que não funcionou desse jeito?

CREATE TABLE curso(
       id INTEGER PRIMARY KEY,
       nome VARCHAR(255)NOT NULL
);
       
       
CREATE TABLE aluno(
    id SERIAL,
       nome VARCHAR(255)
);

Depois isso:

CREATE TABLE aluno_curso (
    aluno_id INTEGER,
        curso_id INTEGER,
        PRIMARY KEY (aluno_id, curso_id),

        FOREIGN KEY (aluno_id)
         REFERENCES aluno (id),

        FOREIGN KEY (curso_id)
         REFERENCES curso (id)
);

Oi, Edielson! Como vai?

Agradeço por compartilhar sua dúvida com a comunidade Alura.

Você trouxe uma questão muito pertinente sobre a criação de tabelas com chaves estrangeiras. O erro que você encontrou — não há restrição de unicidade que corresponde com as colunas informadas na tabela referenciada "aluno" — está relacionado ao fato de que, no seu primeiro exemplo, a tabela aluno não define o campo id como chave primária ou com restrição de unicidade. Quando você usa SERIAL, o campo é incrementado automaticamente, mas isso não o torna automaticamente uma chave primária — é necessário declarar explicitamente.

No código que funcionou, você usou:

id INTEGER PRIMARY KEY

Com isso, o campo já é automaticamente único e não nulo, ou seja, perfeito para ser referenciado como chave estrangeira. Já no código com erro, você escreveu:

id SERIAL,
nome VARCHAR(255)

E não definiu o id como PRIMARY KEY, o que fez com que o PostgreSQL impedisse a criação da tabela aluno_curso, já que ele exige que o campo referenciado tenha uma restrição de unicidade (como uma PRIMARY KEY ou UNIQUE).

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!