Digamos que continuemos usando o Incremento Automático
id
coluna como Chave Primária. Agora, também precisamos garantir que os dados sejam consistentes, ou seja, , não há linhas duplicadas para uma combinação de (student_id, course_id)
valores. Portanto, precisaremos lidar com isso no código do aplicativo (fazer uma seleção toda vez antes de inserir/atualizar) ou podemos corrigir isso estruturalmente definindo um UNIQUE
composto restrição em (student_id, course_id)
. Agora, uma chave primária é basicamente uma chave UNIQUE NOT NULL. Se você observar sua definição de tabela, essa restrição UNIQUE recém-definida é basicamente apenas uma Chave Primária (porque os campos também NÃO são NULL). Portanto, neste caso específico, você realmente não precisa usar uma chave primária substituta
id
. A diferença nas sobrecargas durante o DML aleatório (Inserir/Atualizar/Excluir) será mínima, pois você também teria sobrecargas semelhantes ao usar apenas um índice UNIQUE. Então, você pode definir uma chave composta primária natural
(student_id, course_id)
:-- Drop the id column
ALTER TABLE students_courses DROP COLUMN id;
-- Add the composite Primary Key
ALTER TABLE students_courses ADD PRIMARY(student_id, course_id);
Acima também aplicará a restrição UNIQUE na combinação de
(student_id, course_id)
. Além disso, você economizará 4 bytes por linha (tamanho de int
é de 4 bytes). Isso será útil quando você tiver mesas grandes. Agora, ao ingressar de
students
para students_courses
tabela, acima da Chave Primária será um índice suficiente. No entanto, se você precisar ingressar em courses
para students_courses
tabela, você precisará de outra chave para esta finalidade. Assim, você pode definir mais uma chave em course_id
do seguinte modo:ALTER TABLE students_courses ADD INDEX (course_id);
Além disso, você deve definir restrições de chave estrangeira para garantir a integridade dos dados:
ALTER TABLE students_courses ADD FOREIGN KEY (student_id)
REFERENCES students(student_id);
ALTER TABLE students_courses ADD FOREIGN KEY (course_id)
REFERENCES courses(course_id);