CodeGym /Cursos /SQL SELF /Chaves estrangeiras: FOREIGN KEY

Chaves estrangeiras: FOREIGN KEY

SQL SELF
Nível 19 , Lição 0
Disponível

Imagina que você tem duas tabelas: uma com dados dos estudantes e outra com dados dos cursos. Como você acha que dá pra mostrar quais estudantes estão inscritos em quais cursos? Dá pra colocar uma coluna na tabela de estudantes pra guardar todos os cursos que eles estão inscritos, mas isso vira bagunça rapidinho. Uma das melhores soluções é usar chaves estrangeiras!

Chave estrangeira (FOREIGN KEY) é uma coluna ou um conjunto de colunas que serve pra criar uma ligação entre tabelas. Ela aponta pra uma coluna (geralmente o PRIMARY KEY) em outra tabela, garantindo a integridade referencial dos dados entre elas. Então, se um estudante tá inscrito num curso, a gente pode ter certeza que esse curso realmente existe.

Chaves estrangeiras:

  • Te ajudam a manter a integridade dos dados, garantindo que os registros em uma tabela correspondam aos dados em outra.
  • Deixam o banco de dados mais organizado e lógico.
  • Facilitam o trabalho com os dados, evitando duplicidade e erros.

Exemplo da vida real

Pensa numa biblioteca. A tabela books tem a lista de livros, e a tabela members tem a lista de leitores. Pra saber quem pegou qual livro, a gente pode criar uma tabela borrowed_books, que vai referenciar books e members usando chaves estrangeiras. Assim, toda vez que alguém pega um livro, a gente sabe exatamente quem foi e qual livro pegou.

Tipos de relacionamentos entre tabelas

Chaves estrangeiras permitem descrever diferentes tipos de relacionamentos entre tabelas. Bora ver três tipos principais:

1. Relacionamento "Um-para-Um" (ONE-TO-ONE)

Esse é o mais simples: um registro em uma tabela corresponde exatamente a um registro em outra tabela. Por exemplo, a tabela users pode ter informações dos usuários, e a tabela profiles pode ter informações extras, tipo endereço ou foto deles.

Exemplo de SQL pra relacionamento ONE-TO-ONE:

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username TEXT NOT NULL
);

CREATE TABLE profiles (
    profile_id SERIAL PRIMARY KEY,
    user_id INT UNIQUE REFERENCES users(user_id), -- referencia users.user_id
    address TEXT
);

Aqui a coluna user_id na tabela profiles funciona como chave estrangeira, apontando pra user_id na tabela users.

Exemplo da tabela users:

user_id - PRIMARY KEY username
1 alice
2 bob
3 charlie

Exemplo da tabela profiles:

profile_id - PRIMARY KEY user_id - FOREIGN KEY endereço
1 1 Berlin, Germany
2 2 Paris, France
3 3 Tokyo, Japan

2. Relacionamento "Um-para-Muitos" (ONE-TO-MANY)

Esse é o mais comum. Por exemplo, um cliente pode fazer vários pedidos. Nesse caso, a tabela customers vai se ligar à tabela orders usando uma chave estrangeira.

Exemplo de SQL pra relacionamento ONE-TO-MANY:

CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),	-- referencia customers.customer_id
    order_date DATE NOT NULL
);

A tabela orders pode ter vários registros apontando pra um registro só na tabela customers

Exemplo da tabela customers:

customer_id - PRIMARY KEY nome
1 Alice
2 Bob
3 Charlie

Exemplo da tabela orders:

order_id - PRIMARY KEY customer_id - FOREIGN KEY data_do_pedido
1 1 2024-12-01
2 1 2024-12-05
3 2 2024-12-03
4 3 2024-12-07

3. Relacionamento "Muitos-para-Muitos" (MANY-TO-MANY)

Às vezes, um registro numa tabela pode estar ligado a vários registros em outra tabela, e vice-versa. Por exemplo, estudantes se inscrevem em cursos, e um curso pode ter vários estudantes. Pra isso, normalmente a gente cria uma tabela intermediária.

Exemplo de SQL pra relacionamento MANY-TO-MANY:

-- estudantes
CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

-- cursos
CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,
    title TEXT NOT NULL
);

-- "inscrição de um estudante em um curso"
CREATE TABLE enrollments (
    student_id INT REFERENCES students(student_id), -- referencia id do estudante
    course_id INT REFERENCES courses(course_id),	-- referencia id do curso
    PRIMARY KEY (student_id, course_id)
);

Aqui a tabela enrollments faz o papel de "ponte" entre as tabelas students e courses.

Exemplo da tabela students:

student_id - PRIMARY KEY nome
1 Alice
2 Bob
3 Charlie

Exemplo da tabela courses:

course_id - PRIMARY KEY título
1 SQL Básico
2 Estruturas de Dados
3 Algoritmos

Exemplo da tabela enrollments:

student_id - FOREIGN KEY course_id - FOREIGN KEY
1 1
1 2
2 1
3 3

Vantagens de usar chaves estrangeiras

  1. Os dados ficam consistentes. Se a chave estrangeira apontar pra um registro que não existe, o PostgreSQL não deixa inserir ou atualizar os dados.
  2. Facilita o trabalho com tabelas. Chaves estrangeiras deixam fácil conectar dados entre tabelas e fazer queries mais complexas, tipo JOIN.
  3. Comportamento automático. Dá pra configurar o que acontece quando você deleta ou atualiza registros relacionados (tipo deletar em cascata, colocar NULL etc).

Como é uma chave estrangeira no PostgreSQL?

Sintaxe pra criar uma chave estrangeira quando você cria a tabela:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id)   -- chave estrangeira
);

Aqui:

  • customer_id — é a chave estrangeira.
  • Ela aponta pra customer_id na tabela customers.

Você também pode declarar a chave estrangeira explicitamente usando FOREIGN KEY:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Curiosidade

O termo "chave estrangeira" (FOREIGN KEY) veio da teoria dos bancos de dados relacionais, criada nos anos 1970 pelo Edgar Codd. Incrível como a ideia é tão forte que até hoje é parte fundamental dos bancos de dados modernos. Quem disse que clássico sai de moda?

Agora você já sabe o que é uma chave estrangeira e porque ela é tão importante. Ainda vai aprender como criar elas na hora de criar tabelas e como usar direito as operações em cascata. Mas isso fica pras próximas aulas!

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION